Compare commits
409 Commits
3.3.4
...
wip/xinput
Author | SHA1 | Date | |
---|---|---|---|
![]() |
052e8cc8e2 | ||
![]() |
827999aa82 | ||
![]() |
54a58bd9b8 | ||
![]() |
dc29985b80 | ||
![]() |
acbd4bf599 | ||
![]() |
b742d1bc64 | ||
![]() |
ae1290e3b4 | ||
![]() |
8037cc5ec4 | ||
![]() |
275ab901b0 | ||
![]() |
b3a9d1b39a | ||
![]() |
ac187476ae | ||
![]() |
f512da8c47 | ||
![]() |
2b47bffbee | ||
![]() |
8da5a01c92 | ||
![]() |
25dc04440b | ||
![]() |
7138cc7ea4 | ||
![]() |
04cbdb4e23 | ||
![]() |
e138726ded | ||
![]() |
84dfc98636 | ||
![]() |
95247457ef | ||
![]() |
9b1b7b71e2 | ||
![]() |
4facab385d | ||
![]() |
cc6dba2113 | ||
![]() |
5f6f67fb4e | ||
![]() |
0d97e6adeb | ||
![]() |
991fdeb9dd | ||
![]() |
df908e5256 | ||
![]() |
4b88c1c72a | ||
![]() |
33d4732bde | ||
![]() |
2bbd82ba51 | ||
![]() |
13acafabe2 | ||
![]() |
20537b9bb0 | ||
![]() |
373ef2e6f1 | ||
![]() |
93c7a22161 | ||
![]() |
9f06372e17 | ||
![]() |
b3ecd268f6 | ||
![]() |
c32ee410e9 | ||
![]() |
3584f38d08 | ||
![]() |
712d2feb73 | ||
![]() |
7b21bd8c6f | ||
![]() |
c7c1053ade | ||
![]() |
d7bd7c9a40 | ||
![]() |
96cdedf569 | ||
![]() |
8865578933 | ||
![]() |
1a29f2cd0f | ||
![]() |
324d9fdb14 | ||
![]() |
190037cd72 | ||
![]() |
a3ca52bf0f | ||
![]() |
29b5fd7fd7 | ||
![]() |
7a3d49b88e | ||
![]() |
3e3ad71a68 | ||
![]() |
1c3b695848 | ||
![]() |
e1379441d4 | ||
![]() |
d75f43f504 | ||
![]() |
de6dceb3ac | ||
![]() |
03ddc0cd94 | ||
![]() |
f440af2c02 | ||
![]() |
8b3ef16460 | ||
![]() |
7d587770f3 | ||
![]() |
188d532438 | ||
![]() |
f258556cec | ||
![]() |
62dbaa89ca | ||
![]() |
b56396eca5 | ||
![]() |
0fdc36cac4 | ||
![]() |
2cc0d31b17 | ||
![]() |
e2bf91cd61 | ||
![]() |
294311b2d1 | ||
![]() |
db6d89b742 | ||
![]() |
2717a02a8d | ||
![]() |
4344c9e192 | ||
![]() |
53e2d34628 | ||
![]() |
c602d53649 | ||
![]() |
43a121c8d9 | ||
![]() |
a8c5100fbb | ||
![]() |
5034bd8a7e | ||
![]() |
07d8b9ce19 | ||
![]() |
9c5ac65311 | ||
![]() |
ce8d36a5db | ||
![]() |
27b00d6f63 | ||
![]() |
c441364bd3 | ||
![]() |
1a521e10c3 | ||
![]() |
e22d941f06 | ||
![]() |
787d22dcd0 | ||
![]() |
22d9182322 | ||
![]() |
38295e8202 | ||
![]() |
fe57f7572d | ||
![]() |
aade16a9eb | ||
![]() |
e31a97759e | ||
![]() |
472662d099 | ||
![]() |
027f16b096 | ||
![]() |
5c7fdd67e8 | ||
![]() |
4a0b6793bf | ||
![]() |
228d1bf9aa | ||
![]() |
85bcb9c121 | ||
![]() |
989a38767e | ||
![]() |
78e72f0a47 | ||
![]() |
0faa623043 | ||
![]() |
ecd7e662ff | ||
![]() |
7d9925ba2e | ||
![]() |
95c6547631 | ||
![]() |
b5235d5a46 | ||
![]() |
f3b1e8b3bd | ||
![]() |
59bc5b7975 | ||
![]() |
99cbe762d7 | ||
![]() |
7a2c019514 | ||
![]() |
c02e1b6f56 | ||
![]() |
7938458eb8 | ||
![]() |
165e117028 | ||
![]() |
32cb4a178e | ||
![]() |
7b69780d9a | ||
![]() |
be500e33f9 | ||
![]() |
427c5cc42b | ||
![]() |
3f444cb2fe | ||
![]() |
02bc4b54eb | ||
![]() |
85c46be205 | ||
![]() |
f97db0215b | ||
![]() |
dc79d8aa3d | ||
![]() |
00fecb6cea | ||
![]() |
f0e97b540f | ||
![]() |
37266aabfe | ||
![]() |
6cc423cca6 | ||
![]() |
ce820702e3 | ||
![]() |
5eb72743dd | ||
![]() |
ae1be578ba | ||
![]() |
7e1e9320bc | ||
![]() |
18a1ed6ec5 | ||
![]() |
09713c5fd4 | ||
![]() |
909cd82bea | ||
![]() |
0593df8fe0 | ||
![]() |
29b3e69dfa | ||
![]() |
639d5e4710 | ||
![]() |
8c36cf5939 | ||
![]() |
cc107c0eda | ||
![]() |
c7f70d71f7 | ||
![]() |
9c6ccf96a5 | ||
![]() |
11262b76df | ||
![]() |
8fcc0db0c1 | ||
![]() |
7c999a9d13 | ||
![]() |
efc55347e0 | ||
![]() |
5f11158721 | ||
![]() |
88ee5a68d9 | ||
![]() |
e1870a41b1 | ||
![]() |
bb74499188 | ||
![]() |
079822c3f4 | ||
![]() |
bfacd9d420 | ||
![]() |
36361b86d4 | ||
![]() |
7c9c232d14 | ||
![]() |
14c460c7fd | ||
![]() |
0371194191 | ||
![]() |
3b0c7c568d | ||
![]() |
08893400a0 | ||
![]() |
03cde43646 | ||
![]() |
8617efb544 | ||
![]() |
db4298502e | ||
![]() |
9f90f25e80 | ||
![]() |
1fdde85f53 | ||
![]() |
0e529fba00 | ||
![]() |
6a32fa9452 | ||
![]() |
b422b6f06e | ||
![]() |
bc96a14185 | ||
![]() |
fbcddbcf3e | ||
![]() |
dfe8979a90 | ||
![]() |
c3a6de749b | ||
![]() |
935e820a1d | ||
![]() |
f4125b95ca | ||
![]() |
d8bc7f7aa1 | ||
![]() |
6d67ee3965 | ||
![]() |
991ea50038 | ||
![]() |
885a6afdcd | ||
![]() |
0106f8bab1 | ||
![]() |
d27bccd0ba | ||
![]() |
c66488210c | ||
![]() |
6c3985220e | ||
![]() |
802c1ac427 | ||
![]() |
7a2a6e2675 | ||
![]() |
c27b4b7cfc | ||
![]() |
0ab572d511 | ||
![]() |
1c8d45e89c | ||
![]() |
4e2c2cb1ab | ||
![]() |
07dd4d3f93 | ||
![]() |
22370bef09 | ||
![]() |
f8d443b5b8 | ||
![]() |
f22ecd1c57 | ||
![]() |
b85be9312b | ||
![]() |
cd0870730f | ||
![]() |
d6be75ae99 | ||
![]() |
c1be7f1a60 | ||
![]() |
fccd5fd4ca | ||
![]() |
1e5ef70fe3 | ||
![]() |
1347a06e38 | ||
![]() |
b5d5934e5a | ||
![]() |
64b1c0f953 | ||
![]() |
10d53fc7d2 | ||
![]() |
eb1292ea99 | ||
![]() |
e257580b94 | ||
![]() |
42261156ec | ||
![]() |
89e31f0d9d | ||
![]() |
c805e397fd | ||
![]() |
760a36aeee | ||
![]() |
5d57a2594d | ||
![]() |
1a5132d391 | ||
![]() |
0fe0534c85 | ||
![]() |
fe942049da | ||
![]() |
e6ed29f0e2 | ||
![]() |
15f11f879d | ||
![]() |
f517eaf81e | ||
![]() |
255347f876 | ||
![]() |
e4ae7d7b1b | ||
![]() |
2be943d1d9 | ||
![]() |
0a50488bef | ||
![]() |
78c966321a | ||
![]() |
f65b7c59d3 | ||
![]() |
e31f55e146 | ||
![]() |
dc232b6cad | ||
![]() |
a2f2e07e9b | ||
![]() |
f5e48223c9 | ||
![]() |
1478510392 | ||
![]() |
18b38320a6 | ||
![]() |
16be31b514 | ||
![]() |
accc183474 | ||
![]() |
81699619e8 | ||
![]() |
75c87e5876 | ||
![]() |
50bc4ad0e1 | ||
![]() |
277e8bdad9 | ||
![]() |
dc50ccf9b7 | ||
![]() |
4595209346 | ||
![]() |
50cf3dd1a5 | ||
![]() |
66eac7824a | ||
![]() |
4041f96ed3 | ||
![]() |
3a15d637da | ||
![]() |
5c3c7df948 | ||
![]() |
f9454e29db | ||
![]() |
574c0c3287 | ||
![]() |
9fa5aa9889 | ||
![]() |
80a70a4ad1 | ||
![]() |
7c1b734053 | ||
![]() |
33e1017403 | ||
![]() |
f143fe3710 | ||
![]() |
66406b3035 | ||
![]() |
042ddc5637 | ||
![]() |
5b04ab4473 | ||
![]() |
16b86ae7f7 | ||
![]() |
49400657ca | ||
![]() |
30bc8bc6ce | ||
![]() |
ac18f41ed1 | ||
![]() |
60c05a0dac | ||
![]() |
c47de98c88 | ||
![]() |
f1aada0fae | ||
![]() |
4de492eb20 | ||
![]() |
9ca00d5cce | ||
![]() |
b98e4e37ad | ||
![]() |
8b64a951c9 | ||
![]() |
c2a0719e44 | ||
![]() |
8cb7a450ae | ||
![]() |
6fb857cb23 | ||
![]() |
fc87a635b2 | ||
![]() |
81930ca76e | ||
![]() |
da65738901 | ||
![]() |
4528e1216a | ||
![]() |
d56ecde39b | ||
![]() |
4148a5cc6a | ||
![]() |
8a6a568aca | ||
![]() |
12cc0cee29 | ||
![]() |
878b1012b4 | ||
![]() |
a78fec7951 | ||
![]() |
a24c512caa | ||
![]() |
c669a3892e | ||
![]() |
ba4f008d40 | ||
![]() |
b0a099935b | ||
![]() |
aba39ef953 | ||
![]() |
ebf8c460e1 | ||
![]() |
25d3432eee | ||
![]() |
cd7a74fbcd | ||
![]() |
c64188c67f | ||
![]() |
4c2371f2e7 | ||
![]() |
ff6c31dcc0 | ||
![]() |
1b649c18ed | ||
![]() |
93037e4c6b | ||
![]() |
ed358c8f4b | ||
![]() |
a22859a64a | ||
![]() |
c44438b19f | ||
![]() |
b58366d3ad | ||
![]() |
6900128b2f | ||
![]() |
c0b4d68390 | ||
![]() |
0d794f28f0 | ||
![]() |
e389eff79d | ||
![]() |
41adbdda12 | ||
![]() |
2d6555ca4d | ||
![]() |
044d58951e | ||
![]() |
9c97e8999e | ||
![]() |
e97b38b38e | ||
![]() |
8809673a74 | ||
![]() |
68321d9bf4 | ||
![]() |
65390e50a4 | ||
![]() |
f8d32661b5 | ||
![]() |
d84911fdf9 | ||
![]() |
4147ea4660 | ||
![]() |
2dd7c98641 | ||
![]() |
3aad30143c | ||
![]() |
93d06d4368 | ||
![]() |
b19c061db5 | ||
![]() |
497258f6e5 | ||
![]() |
977e6388ad | ||
![]() |
0879cf0d8d | ||
![]() |
4aab7fb7b9 | ||
![]() |
839fee19ef | ||
![]() |
46a56bafbd | ||
![]() |
c8b4939c7e | ||
![]() |
fc3e82421a | ||
![]() |
23046f6e28 | ||
![]() |
823208120d | ||
![]() |
d12c507b12 | ||
![]() |
2157c238b6 | ||
![]() |
423bda908e | ||
![]() |
98d427ddba | ||
![]() |
7a35579c3f | ||
![]() |
adc89fbb2c | ||
![]() |
a6ca3f768f | ||
![]() |
9362fbdcde | ||
![]() |
47099f4a87 | ||
![]() |
2e6e5b068c | ||
![]() |
ee840bc832 | ||
![]() |
6333c174dc | ||
![]() |
a3bf9b01aa | ||
![]() |
402b477458 | ||
![]() |
6b273ca713 | ||
![]() |
c3ec6b34a3 | ||
![]() |
78dc480e86 | ||
![]() |
53364f986c | ||
![]() |
5770b5b3c3 | ||
![]() |
f16f47bd38 | ||
![]() |
58a57185b7 | ||
![]() |
8fb361cb26 | ||
![]() |
335d211204 | ||
![]() |
7f64d6b92e | ||
![]() |
8c1b2d5eda | ||
![]() |
578b1c06c7 | ||
![]() |
6dfde43786 | ||
![]() |
a8ead4d447 | ||
![]() |
2926323a9a | ||
![]() |
13bc8f7a76 | ||
![]() |
ad516492d2 | ||
![]() |
6677c61db3 | ||
![]() |
f26f61ed7d | ||
![]() |
8ca86fa8bf | ||
![]() |
f2f500836e | ||
![]() |
c39998efee | ||
![]() |
3b811f33c7 | ||
![]() |
beea2f7acd | ||
![]() |
fb4c50478d | ||
![]() |
ac0602a02e | ||
![]() |
5361e0259f | ||
![]() |
04bf73ff6d | ||
![]() |
047b9de1c6 | ||
![]() |
39b3244a3e | ||
![]() |
63f982eb72 | ||
![]() |
c689306dae | ||
![]() |
0b7f2f8cd3 | ||
![]() |
efc90173b1 | ||
![]() |
9e439a22b5 | ||
![]() |
848c1f52f3 | ||
![]() |
1b84be7031 | ||
![]() |
eb08a65b4c | ||
![]() |
43ba596a0e | ||
![]() |
2e1de1a037 | ||
![]() |
81ede6abf8 | ||
![]() |
1d98f1fee8 | ||
![]() |
f0582d1a86 | ||
![]() |
607dbf0f43 | ||
![]() |
584cd3e684 | ||
![]() |
90ec5b05f3 | ||
![]() |
7253a75b18 | ||
![]() |
cdbe3b274f | ||
![]() |
3f3e3ce37e | ||
![]() |
5e3d93da87 | ||
![]() |
82b1d0d7e5 | ||
![]() |
3583e57ec3 | ||
![]() |
2ddde04678 | ||
![]() |
feda493fbf | ||
![]() |
fc72309b71 | ||
![]() |
860c2a6282 | ||
![]() |
e6b4a34daf | ||
![]() |
3319cdfec0 | ||
![]() |
fc5594faad | ||
![]() |
7c9e0c2ebc | ||
![]() |
9157cc2b70 | ||
![]() |
69e7b32b54 | ||
![]() |
04835eccb5 | ||
![]() |
01c363bb6a | ||
![]() |
7649772394 | ||
![]() |
ca3dc2e876 | ||
![]() |
70d85049b1 | ||
![]() |
29f6f5e0ad | ||
![]() |
d249cfd040 | ||
![]() |
3cb912aee2 | ||
![]() |
7df823132c | ||
![]() |
41353d642b | ||
![]() |
c47039db82 | ||
![]() |
0dab6df25a | ||
![]() |
c844bab232 | ||
![]() |
848f9d1399 | ||
![]() |
2e63de5c0a | ||
![]() |
7319b10d72 | ||
![]() |
1265efcf78 | ||
![]() |
3e0ef03fd9 | ||
![]() |
37076941ad | ||
![]() |
25e43618a4 | ||
![]() |
fd404bafc8 | ||
![]() |
3b3b26b000 |
264
NEWS
264
NEWS
@@ -1,3 +1,267 @@
|
||||
3.7.1
|
||||
=====
|
||||
* screen: Ignore num-workspaces when using dynamic workspaces [Florian; #685439]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner
|
||||
|
||||
Translations:
|
||||
Mattias Põldaru [et], Kjartan Maraas [nb], Мирослав Николић [sr, sr@latin],
|
||||
Marek Černocký [cs], Andika Triwidada [id], Daniel Mustieles [es],
|
||||
Fran Diéguez [gl], Matej Urbančič [sl]
|
||||
|
||||
3.6.1
|
||||
=====
|
||||
* Fix crash when opening large popup menus [Jasper; #681676]
|
||||
* window: Don't move the desktop window after monitor hotplug [Jasper; #681159]
|
||||
* Expose MetaPlugin to introspection [Evan; #671098]
|
||||
* Optionally delay focus changes in focus-follows-mouse mode [Florian; #678169]
|
||||
* Resize the guard window when the X screen is resized [Benjamin; #670396]
|
||||
* display: Only manage the default X screen [Jürg; #648156]
|
||||
* Misc cleanups: [Owen; #587255]
|
||||
|
||||
Contributors:
|
||||
Benjamin Berg, Jürg Billeter, Evan Broder, Florian Müllner, Jasper St. Pierre,
|
||||
Owen Taylor
|
||||
|
||||
Translations:
|
||||
Alexandre Franke [fr], Theppitak Karoonboonyanan [th], Sayak Sarkar [bn_IN],
|
||||
Sandeep Sheshrao Shedmake [mr], Ask H. Larsen [da], Shankar Prasad [kn],
|
||||
Alexander Shopov [bg], Aurimas Černius [lt], Ihar Hrachyshka [be],
|
||||
Kjartan Maraas [nb], Daniel Mustieles [es], Changwoo Ryu [ko],
|
||||
Yuri Myasoedov [ru], Tom Tryfonidis [el], Rūdolfs Mazurs [lv],
|
||||
Chris Leonard [en_GB], Piotr Drąg [pl], Fran Diéguez [gl], Gil Forcada [ca],
|
||||
Matej Urbančič [sl], Andika Triwidada [id], Carles Ferrando [ca]
|
||||
|
||||
3.6.0
|
||||
=====
|
||||
|
||||
Translations:
|
||||
Alexander Shopov [bg], Daniel Korostil [uk], Rajesh Ranjan [hi],
|
||||
Krishnababu Krothapalli [te], Ani Peter [ml], Rūdolfs Mazurs [lv],
|
||||
Sweta Kothari [gu], Ihar Hrachyshka [be], Noriko Mizumoto [ja],
|
||||
Timo Jyrinki [fi], Mattias Põldaru [et]
|
||||
|
||||
3.5.92
|
||||
======
|
||||
* screen: Allow NULL out arguments in meta_screen_get_size [Tomeu]
|
||||
* display: Add API to set wm_name / wm_keybindings [Florian; #671010]
|
||||
* Improve the not responding dialog [Jon, Florian; #684306]
|
||||
* Misc. bugfixes [Jasper]
|
||||
|
||||
Contributors:
|
||||
William Jon McCann, Florian Müllner, Jasper St. Pierre, Tomeu Vizoso
|
||||
|
||||
Translations:
|
||||
Gabor Kelemen [hu], Piotr Drąg [pl], Dr.T.Vasudevan [ta], Bruce Cowan [en_GB],
|
||||
Alexandre Franke [fr], Theppitak Karoonboonyanan [th], Gil Forcada [ca],
|
||||
Carles Ferrando [ca@valencia], Tobias Endrigkeit [de], Tom Tryfonidis [el],
|
||||
Nguyễn Thái Ngọc Duy [vi], Changwoo Ryu [ko], Ask H. Larsen [da],
|
||||
Rafael Ferreira [pt_BR], Marek Černocký [cs]
|
||||
|
||||
3.5.91
|
||||
======
|
||||
* Do not include markup in app not responding dialog [Alex]
|
||||
* Fix subtracting unredirected windows from visible region [Jasper; #677116]
|
||||
* Minor improvements and bugfixes [Jasper, Florian; #682648, #682993]
|
||||
|
||||
Contributors:
|
||||
Alexander Larsson, Florian Müllner, Jasper St. Pierre
|
||||
|
||||
Translations:
|
||||
Dirgita [id], Piotr Drąg [pl], A S Alam [pa], Yuri Myasoedov [ru],
|
||||
Milo Casagrande [it], Nilamdyuti Goswami [as], Tom Tryfonidis [el],
|
||||
Duarte Loreto [pt], Fran Diéguez [gl], Nguyễn Thái Ngọc Duy [vi],
|
||||
Aurimas Černius [lt], Daniel Nylander [sv]
|
||||
|
||||
3.5.90
|
||||
======
|
||||
* Fix logic for handling translations of the windows group [Owen; #681221]
|
||||
* Handle painting inside a Clutter clone [Owen; #681953]
|
||||
* Update overlay-key on settings changes [Florian; #681906]
|
||||
* Add keybinding for overlay-key [Florian; #665547]
|
||||
* Minor fixes and improvements [Javier, Florian]
|
||||
|
||||
Contributors:
|
||||
Javier Jardón, Florian Müllner, Owen Taylor
|
||||
|
||||
Translations:
|
||||
Sweta Kothari [gu], Muhammet Kara [tr], Khaled Hosny [ar],
|
||||
Sandeep Sheshrao Shedmake [mr]
|
||||
|
||||
3.5.5
|
||||
=====
|
||||
* Fix flickering around windows when using window group [Tom; #681221]
|
||||
|
||||
Contributor(s):
|
||||
Tom Beckmann
|
||||
|
||||
Translations:
|
||||
Chao-Hsiung Liao [zh_HK, zh_TW], Matej Urbančič [sl], Fran Diéguez [gl],
|
||||
Мирослав Николић [sr, sr@latin], Yaron Shahrabani [he], Kjartan Maraas [nb]
|
||||
|
||||
3.5.4
|
||||
=====
|
||||
* Make it possible to reimplement move-to-workspace keybindings from plugins
|
||||
[Giovanni; #674104]
|
||||
* Add a preference to ignore hide-titlebar-when-maximized hint [Rico; #678947]
|
||||
* window: Also use hide-titlebar-when-maximized when tiled [Florian; #679290]
|
||||
* Center modal dialogs on their parent instead [Florian; #674499]
|
||||
* Reduce amount of markup in translated messages [Matthias; #679660]
|
||||
* Fix focus problem after closing a window with focus-follows-mouse
|
||||
[Jasper; #675982]
|
||||
* Handle changes of the attach-modal-dialogs preference [Florian; #679904]
|
||||
* Do not restore tiling on unmaximize [Florian; #677565]
|
||||
* Misc. fixes and cleanups [Jasper Adriaanse, Jasper, Debarshi, Pavel;
|
||||
#679153, 673824]
|
||||
|
||||
Contributors:
|
||||
Jasper Lievisse Adriaanse, Giovanni Campagna, Matthias Clasen, Florian Müllner,
|
||||
Debarshi Ray, Jasper St. Pierre, Rico Tzschichholz, Pavel Vasin
|
||||
|
||||
Translations:
|
||||
Alexander Shopov [bg], Kjartan Maraas [nb], Yaron Shahrabani [he],
|
||||
Nilamdyuti Goswami [as], Ihar Hrachyshka [be], Daniel Mustieles [es]
|
||||
|
||||
3.5.3
|
||||
=====
|
||||
* Simplify plugin system [Jasper; #676855]
|
||||
* meta-window-actor: Don't unredirect shaped windows [Jasper; #677657]
|
||||
* screen: Add new public meta_screen_get_current_monitor API [Tim; #642591]
|
||||
* frames: Increase the size of resize corners [Jasper; #677669]
|
||||
* window: Make some window methods public [Jasper; #678126]
|
||||
* Fix crash when running mutter stand-alone [Jasper; #678238]
|
||||
* meta-window-actor: Fix potential crash in shaping code [Jasper; #677977]
|
||||
* Misc. fixes [Jasper, Marc-Antoine, Rico]
|
||||
|
||||
Contributors:
|
||||
Tim L, Marc-Antoine Perennou, Jasper St. Pierre, Rico Tzschichholz
|
||||
|
||||
Translations:
|
||||
|
||||
Daniel Mustieles [es], Matej Urbančič [sl], Khaled Hosny [ar],
|
||||
Bruno Brouard [fr], Fran Diéguez [gl]
|
||||
|
||||
3.5.2
|
||||
=====
|
||||
* keybindings: Remove 'toggle-recording' binding [Florian; #674376]
|
||||
* Switch to gtk-doc syntax [Jasper; #673752]
|
||||
* shaped-texture: never slice shape mask texture [Robert; #674731]
|
||||
* Make Mutter stop relying on Cogl including a GL header [Neil; #672711]
|
||||
* Make support for "XFree86" Xinerama mandatory [Owen; #674727]
|
||||
* meta_window_move_frame(): fix crash when frame is NULL [Owen; #675254]
|
||||
* Fix memory leaks [Pavel; #672640]
|
||||
* Code cleanups [Jasper; #671104 #674876 #676052]
|
||||
* Look for themes in XDG user data dir [Jasper; #675316]
|
||||
* Remove frame pixel caching [Jasper; #675111]
|
||||
* stack: Ignore keep-on-top property on maximized windows [Florian; #673581]
|
||||
* Misc. fixes [Javier, Jasper, Owen, Rico]
|
||||
|
||||
Contributors:
|
||||
Robert Bragg, Javier Járdon, Florian Müllner, Neil Roberts, Jasper St. Pierre,
|
||||
Owen Taylor, Rico Tzschichholz, Pavel Vasin
|
||||
|
||||
Translations:
|
||||
Praveen Illa [te], Luca Ferretti [it], Daniel Mustieles [es]
|
||||
|
||||
3.4.1
|
||||
=====
|
||||
* API change: the meta_display_add_keybinding() function added in 3.4
|
||||
wasn't usable from a GNOME Shell extension, so has been changed to take
|
||||
a GSettings object rather than the name of a schema [Jasper; #673014]
|
||||
* Don't try to auto-maximize not-maximizable windows; this fixes the problem
|
||||
with the Nautilus desktop window being mis-positioned when enabled
|
||||
[Owen; #673566]
|
||||
* Fix a crash in the default plugin (not used in GNOME) [Giovanni; #673809]
|
||||
* Make the <Super> key work when set as the mouse button modifier
|
||||
[Florian; #662476]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Florian Muellner, Jasper St. Pierre, Owen Taylor
|
||||
|
||||
Translations:
|
||||
Khaled Hosny [ar], Jordi Serratosa [ca], Carles Ferrando [ca@valencia],
|
||||
Christian Kirbach [de], Kristjan Schmidt [eo], Arash Mousavi [fa],
|
||||
Jiro Matsuzawa [ja], Shankar Prasad [kn], Aurimas Černius [lt],
|
||||
Yinghua Wang [zh_CN]
|
||||
|
||||
3.4.0
|
||||
=====
|
||||
* Fix crash when a full-screen window is opened [Jasper; #672797]
|
||||
* Fix memory leaks [Pavel; #672640]
|
||||
|
||||
Contributors:
|
||||
Jasper St. Pierre, Pavel Vasin
|
||||
|
||||
Translations:
|
||||
Marek Černocký, Petr Kovar [cz], Bruno Brouard [fr], Sweta Kothari [gu],
|
||||
Yaron Shahrabani [he], Changwoo Ryu [kr], Enrico Nicoletto [pt_BR],
|
||||
Yuri Myasoedov [ru], Muhammet Kara [tr], Nguyễn Thái Ngọc Duy [vi]
|
||||
|
||||
3.3.92
|
||||
======
|
||||
* Automaximize large windows on map [Adel; #671677]
|
||||
* When unmaximizing windows, make sure the unminimized size
|
||||
is signficantly less than the maximized size [Adel; #671677]
|
||||
* Don't offer maximize option for windows larger than the screen
|
||||
[Jasper; #643606]
|
||||
* Always focus the window immediately underneath without restacking
|
||||
when closing a window [Jasper; #620744]
|
||||
* Avoid drawing shadows when two windows are tiled together [Rui; #643075]
|
||||
* Remove tooltips for window decorations [Florian; #645101]
|
||||
* Add org.gnome.mutter.dynamic-workspaces GSetting - when this is set
|
||||
to true, workspace counts are never saved to GSettings, avoiding
|
||||
pointless disk traffic for GNOME dynamic workspaces [Florian; #671568]
|
||||
* Add ::grab-op-begin, ::grab-op-end signals to MetaDisplay [Jasper; #670658]
|
||||
* Add meta_display_get_ignored_modifier_mask() [Florian; #665215]
|
||||
* Remove pointless wrapper methods on MetaPlugin [Jasper; #671103]
|
||||
* Fix frame drawing with 3.3.x GTK+ releases [Florian; #671796]
|
||||
* Build fixes [Jasper, Rico, Rui]
|
||||
* Misc bug fixes [Damien, Jasper, Lionel, Marius, Owen, Rui;
|
||||
#661256, #667437, #671601, #671087, #672374]
|
||||
|
||||
Contributors:
|
||||
Stefano Facchini, Adel Gadllah, Lionel Landwerlin, Mariusz Libera,
|
||||
Rui Matos, Florian Müllner, Jasper St. Pierre, Damien Radtke, Owen Taylor,
|
||||
Rico Tzschichholz
|
||||
|
||||
Translations:
|
||||
Nilamdyuti Goswami [as], Ihar Hrachyshka [be], Alexander Shopov [bg],
|
||||
David Planella [ca], Carles Ferrando [ca@valencia], Kenneth Nielsen [dk],
|
||||
Bruce Cowan [en_GB], Daniel Mustieles [es], Mattias Põldaru [et],
|
||||
Inaki Larranaga Murgoitio [eu], Timo Jyrinki [fi], Fran Diéguez [gl],
|
||||
Gabor Kelemen [hu], Changwoo Ryu [ko], Anita Reitere [lv],
|
||||
Kjartan Maraas [nb], Wouter Bolsterlee [nl], A S Alam [pa], Piotr Drąg [pl],
|
||||
Duarte Loreto [pt], Yuri Myasoedov [ru], Daniel Nylander [se],
|
||||
Matej Urbančič [sl], Miroslav Nikolić [sr], Tirumurti Vasudevan [ta],
|
||||
Sasi Bhushan [te], Daniel Korostil [uk], Nguyễn Thái Ngọc Duy [vi],
|
||||
YunQiang Su [zh_CN], Chao-Hsiung Liao [zh_HK, zh_TW]
|
||||
|
||||
3.3.90
|
||||
======
|
||||
* Update for Cogl API changes [Robert]
|
||||
* Bug fixes [Adel, Jasper; #659643]
|
||||
* Build fixes [Jasper, Owen]
|
||||
|
||||
Contributors:
|
||||
Robert Bragg, Adel Gadllah, Jasper St. Pierre, Owen Taylor
|
||||
|
||||
Translations:
|
||||
Ask H. Larsen [dk], Miroslav Nikolić [sr]
|
||||
|
||||
3.3.5
|
||||
=====
|
||||
* MetaShapedTexture no longer is a ClutterTexture subclass [Jasper; #660941]
|
||||
* Add meta_shaped_texture_get_image() [Jasper; #660941]
|
||||
* Cleanups [Rui, Jasper; #657639]
|
||||
* Depend on GTK+ 3.3.7 [Rico]
|
||||
|
||||
Contributors:
|
||||
Rui Matos, Jasper St. Pierre, Rico Tzschichholz
|
||||
|
||||
Translations:
|
||||
Kjartan Maraas [nb], Chao-Hsiung Liao [zh_HK, zh_TW]
|
||||
|
||||
3.3.4
|
||||
=====
|
||||
* Adapt to changes in GtkStateFlags [Owen]
|
||||
|
161
configure.in
161
configure.in
@@ -1,8 +1,8 @@
|
||||
AC_PREREQ(2.50)
|
||||
|
||||
m4_define([mutter_major_version], [3])
|
||||
m4_define([mutter_minor_version], [3])
|
||||
m4_define([mutter_micro_version], [4])
|
||||
m4_define([mutter_minor_version], [7])
|
||||
m4_define([mutter_micro_version], [1])
|
||||
|
||||
m4_define([mutter_version],
|
||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||
@@ -61,12 +61,21 @@ AC_CHECK_SIZEOF(__int64)
|
||||
## byte order
|
||||
AC_C_BIGENDIAN
|
||||
|
||||
GTK_MIN_VERSION=3.3.3
|
||||
GIO_MIN_VERSION=2.25.10
|
||||
CANBERRA_GTK=libcanberra-gtk3
|
||||
CANBERRA_GTK_VERSION=0.26
|
||||
|
||||
MUTTER_PC_MODULES="gtk+-3.0 >= $GTK_MIN_VERSION gio-2.0 >= $GIO_MIN_VERSION pango >= 1.2.0 cairo >= 1.10.0 gsettings-desktop-schemas >= 3.3.0"
|
||||
CLUTTER_PACKAGE=clutter-1.0
|
||||
|
||||
MUTTER_PC_MODULES="
|
||||
gtk+-3.0 >= 3.3.7
|
||||
gio-2.0 >= 2.25.10
|
||||
pango >= 1.2.0
|
||||
cairo >= 1.10.0
|
||||
gsettings-desktop-schemas >= 3.3.0
|
||||
xcomposite >= 0.2 xfixes xrender xdamage
|
||||
$CLUTTER_PACKAGE >= 1.9.10
|
||||
cogl-1.0 >= 1.9.6
|
||||
"
|
||||
|
||||
GLIB_GSETTINGS
|
||||
|
||||
@@ -104,17 +113,14 @@ AC_ARG_ENABLE(shape,
|
||||
[disable mutter's use of the shaped window extension]),,
|
||||
enable_shape=auto)
|
||||
|
||||
## try definining HAVE_BACKTRACE
|
||||
AC_CHECK_HEADERS(execinfo.h, [AC_CHECK_FUNCS(backtrace)])
|
||||
|
||||
AM_GLIB_GNU_GETTEXT
|
||||
|
||||
## here we get the flags we'll actually use
|
||||
# GRegex requires Glib-2.14.0
|
||||
PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.14.0)
|
||||
# gtk_window_set_icon_name requires gtk2+-2.6.0
|
||||
PKG_CHECK_MODULES(MUTTER_MESSAGE, gtk+-3.0 >= $GTK_MIN_VERSION)
|
||||
PKG_CHECK_MODULES(MUTTER_WINDOW_DEMO, gtk+-3.0 >= $GTK_MIN_VERSION)
|
||||
PKG_CHECK_MODULES(MUTTER_MESSAGE, gtk+-3.0)
|
||||
PKG_CHECK_MODULES(MUTTER_WINDOW_DEMO, gtk+-3.0)
|
||||
|
||||
# Unconditionally use this dir to avoid a circular dep with gnomecc
|
||||
GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings"
|
||||
@@ -164,31 +170,6 @@ else
|
||||
fi
|
||||
fi
|
||||
|
||||
XCOMPOSITE_VERSION=0.2
|
||||
|
||||
AC_MSG_CHECKING([Xcomposite >= $XCOMPOSITE_VERSION])
|
||||
if $PKG_CONFIG --atleast-version $XCOMPOSITE_VERSION xcomposite; then
|
||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES xcomposite >= $XCOMPOSITE_VERSION xfixes xrender xdamage"
|
||||
AC_DEFINE(HAVE_COMPOSITE_EXTENSIONS, 1, [Building with compositing manager support])
|
||||
echo "Building with compositing manager"
|
||||
|
||||
## force on render also
|
||||
have_xrender=yes
|
||||
else
|
||||
AC_MSG_ERROR([no. Mutter requires the Xcomposite extension to build.])
|
||||
fi
|
||||
|
||||
CLUTTER_VERSION=1.7.5
|
||||
CLUTTER_PACKAGE=clutter-1.0
|
||||
AC_SUBST(CLUTTER_PACKAGE)
|
||||
if $PKG_CONFIG --atleast-version $CLUTTER_VERSION $CLUTTER_PACKAGE ; then
|
||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES $CLUTTER_PACKAGE "
|
||||
PKG_CHECK_MODULES(CLUTTER, $CLUTTER_PACKAGE)
|
||||
AC_DEFINE(WITH_CLUTTER, , [Building with Clutter compositor])
|
||||
else
|
||||
AC_MSG_ERROR([no. Mutter requires Clutter version $CLUTTER_VERSION.])
|
||||
fi
|
||||
|
||||
INTROSPECTION_VERSION=0.9.5
|
||||
GOBJECT_INTROSPECTION_CHECK([$INTROSPECTION_VERSION])
|
||||
|
||||
@@ -218,66 +199,68 @@ if test x$have_xcursor = xyes; then
|
||||
AC_DEFINE(HAVE_XCURSOR, , [Building with Xcursor support])
|
||||
fi
|
||||
|
||||
XINPUT2_VERSION=1.4.0
|
||||
|
||||
AC_ARG_ENABLE(xinput2,
|
||||
AC_HELP_STRING([--disable-xinput2],
|
||||
[disable XInput2 usage]),,
|
||||
enable_xinput2=yes)
|
||||
|
||||
if test x$enable_xinput2 = xyes; then
|
||||
AC_MSG_CHECKING([XInput2])
|
||||
if $PKG_CONFIG --atleast-version $XINPUT2_VERSION xi; then
|
||||
have_xinput2=yes
|
||||
else
|
||||
have_xinput2=no
|
||||
fi
|
||||
AC_MSG_RESULT($have_xinput2)
|
||||
else
|
||||
have_xinput2=no
|
||||
fi
|
||||
|
||||
if test x$have_xinput2 = xyes; then
|
||||
echo "Building with XInput2"
|
||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES xi"
|
||||
AC_DEFINE(HAVE_XINPUT2, , [Building with XInput2 support])
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(HAVE_XINPUT2, test "$have_xinput2" = "yes")
|
||||
|
||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
||||
|
||||
# This is used for plugins
|
||||
AC_SUBST(CLUTTER_PACKAGE)
|
||||
PKG_CHECK_MODULES(CLUTTER, $CLUTTER_PACKAGE)
|
||||
|
||||
AC_PATH_XTRA
|
||||
|
||||
ALL_X_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||
|
||||
# Check for Xinerama extension (Solaris impl or Xfree impl)
|
||||
# Check for Xinerama extension - we only support the "XFree86" style,
|
||||
# and not the older Solaris-only version; recent Solaris supports the
|
||||
# XFree86 style.
|
||||
mutter_save_cppflags="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
|
||||
|
||||
AC_ARG_ENABLE(xinerama,
|
||||
AC_HELP_STRING([--disable-xinerama],
|
||||
[disable mutter's use of the Xinerama extension]),
|
||||
try_xinerama=$enable_xinerama,try_xinerama=yes)
|
||||
|
||||
use_solaris_xinerama=no
|
||||
use_xfree_xinerama=no
|
||||
if test "${try_xinerama}" != no; then
|
||||
case "$host" in
|
||||
*-*-solaris*)
|
||||
# Check for solaris
|
||||
use_solaris_xinerama=yes
|
||||
AC_CHECK_LIB(Xext, XineramaGetInfo,
|
||||
use_solaris_xinerama=yes, use_solaris_xinerama=no,
|
||||
$ALL_X_LIBS)
|
||||
if test "x$use_solaris_xinerama" = "xyes"; then
|
||||
AC_CHECK_HEADER(X11/extensions/xinerama.h,
|
||||
if test -z "`echo $ALL_X_LIBS | grep "\-lXext" 2> /dev/null`"; then
|
||||
X_EXTRA_LIBS="-lXext $X_EXTRA_LIBS"
|
||||
fi
|
||||
AC_DEFINE(HAVE_SOLARIS_XINERAMA, , [Have Solaris-style Xinerama])
|
||||
AC_DEFINE(HAVE_XINERAMA, , [Have some version of Xinerama]),
|
||||
use_solaris_xinerama=no,
|
||||
[#include <X11/Xlib.h>])
|
||||
fi
|
||||
AC_MSG_CHECKING(for Xinerama support on Solaris)
|
||||
AC_MSG_RESULT($use_solaris_xinerama);
|
||||
;;
|
||||
*)
|
||||
# Check for XFree
|
||||
use_xfree_xinerama=yes
|
||||
AC_CHECK_LIB(Xinerama, XineramaQueryExtension,
|
||||
[AC_CHECK_HEADER(X11/extensions/Xinerama.h,
|
||||
X_EXTRA_LIBS="-lXinerama $X_EXTRA_LIBS"
|
||||
if test -z "`echo $ALL_X_LIBS | grep "\-lXext" 2> /dev/null`"; then
|
||||
X_EXTRA_LIBS="-lXext $X_EXTRA_LIBS"
|
||||
fi
|
||||
AC_DEFINE(HAVE_XFREE_XINERAMA, , [Have XFree86-style Xinerama])
|
||||
AC_DEFINE(HAVE_XINERAMA,, [Have some version of Xinerama]),
|
||||
use_xfree_xinerama=no,
|
||||
[#include <X11/Xlib.h>])],
|
||||
use_xfree_xinerama=no, -lXext $ALL_X_LIBS)
|
||||
AC_MSG_CHECKING(for Xinerama support on XFree86)
|
||||
AC_MSG_RESULT($use_xfree_xinerama);
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
have_xinerama=yes
|
||||
AC_CHECK_LIB(Xinerama, XineramaQueryExtension,
|
||||
[AC_CHECK_HEADER(X11/extensions/Xinerama.h,
|
||||
[X_EXTRA_LIBS="-lXinerama $X_EXTRA_LIBS"
|
||||
if test -z "`echo $ALL_X_LIBS | grep "\-lXext" 2> /dev/null`"; then
|
||||
X_EXTRA_LIBS="-lXext $X_EXTRA_LIBS"
|
||||
fi],
|
||||
have_xinerama=no,
|
||||
[#include <X11/Xlib.h>])],
|
||||
have_xinerama=no, -lXext $ALL_X_LIBS)
|
||||
AC_MSG_CHECKING(for Xinerama support)
|
||||
AC_MSG_RESULT($have_xinerama)
|
||||
|
||||
CPPFLAGS="$mutter_save_cppflags"
|
||||
|
||||
if test x$have_xinerama = xno; then
|
||||
AC_MSG_ERROR([Xinerama extension was not found])
|
||||
fi
|
||||
|
||||
SHAPE_LIBS=
|
||||
found_shape=no
|
||||
AC_CHECK_LIB(Xext, XShapeQueryExtension,
|
||||
@@ -408,9 +391,6 @@ fi
|
||||
# For fix-meta-rectangle.py
|
||||
AM_PATH_PYTHON([2.5])
|
||||
|
||||
# Use gnome-doc-utils:
|
||||
GNOME_DOC_INIT([0.8.0])
|
||||
|
||||
#### Warnings (last since -Werror can disturb other tests)
|
||||
|
||||
# Stay command-line compatible with the gnome-common configure option. Here
|
||||
@@ -470,7 +450,7 @@ if test "$enable_compile_warnings" != no ; then
|
||||
if test "$enable_compile_warnings" = error; then
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-Werror[\ \ ]*) ;;
|
||||
*) CFLAGS="$CFLAGS -Werror" ;;
|
||||
*) CFLAGS="$CFLAGS -Werror -Wno-error=deprecated-declarations" ;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
@@ -508,8 +488,6 @@ mutter-$VERSION
|
||||
source code location: ${srcdir}
|
||||
compiler: ${CC}
|
||||
|
||||
XFree86 Xinerama: ${use_xfree_xinerama}
|
||||
Solaris Xinerama: ${use_solaris_xinerama}
|
||||
Startup notification: ${have_startup_notification}
|
||||
libcanberra: ${have_libcanberra}
|
||||
Introspection: ${found_introspection}
|
||||
@@ -517,6 +495,7 @@ mutter-$VERSION
|
||||
Shape extension: ${found_shape}
|
||||
Xsync: ${found_xsync}
|
||||
Xcursor: ${have_xcursor}
|
||||
XInput2: ${have_xinput2}
|
||||
"
|
||||
|
||||
|
||||
@@ -524,8 +503,8 @@ MUTTER_MINOR_VERSION=mutter_minor_version
|
||||
if expr $MUTTER_MINOR_VERSION % 2 > /dev/null ; then
|
||||
stable_version=`expr $MUTTER_MINOR_VERSION - 1`
|
||||
echo "This is the UNSTABLE branch of mutter"
|
||||
echo -n "Use 2.$stable_version.x for stable "
|
||||
echo "(gnome-2-$stable_version branch in git)"
|
||||
echo -n "Use 3.$stable_version.x for stable "
|
||||
echo "(gnome-3-$stable_version branch in git)"
|
||||
else
|
||||
echo "This is the stable branch of mutter"
|
||||
fi
|
||||
|
@@ -31,8 +31,7 @@ workspaces. In these cases, there needs to be a rule consistent with
|
||||
the above about the new window to choose.
|
||||
|
||||
Focus method Behavior
|
||||
click Focus the most recently used window (same as the window
|
||||
on top)
|
||||
click Focus the window on top
|
||||
sloppy Focus the window containing the pointer if there is such
|
||||
a window, otherwise focus the most recently used window.
|
||||
mouse Focus the non-DESKTOP window containing the pointer if
|
||||
|
@@ -39,4 +39,11 @@ environment.</description>
|
||||
<gnome:userid>otaylor</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Florian Müllner</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:fmuellner@gnome.org" />
|
||||
<gnome:userid>fmuellner</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
</Project>
|
||||
|
2719
po/bn_IN.po
2719
po/bn_IN.po
File diff suppressed because it is too large
Load Diff
1259
po/ca@valencia.po
1259
po/ca@valencia.po
File diff suppressed because it is too large
Load Diff
1219
po/en_GB.po
1219
po/en_GB.po
File diff suppressed because it is too large
Load Diff
522
po/et.po
522
po/et.po
@@ -7,253 +7,39 @@
|
||||
#
|
||||
# Tõivo Leedjärv <toivo linux ee>, 2004.
|
||||
# Ivar Smolin <okul linux ee>, 2005, 2006, 2009–2011.
|
||||
# Mattias Põldaru <mahfiaz gmail com>, 2008–2011.
|
||||
# Mattias Põldaru <mahfiaz@gmail.com>, 2008–2011, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter MASTER\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&component=general\n"
|
||||
"POT-Creation-Date: 2011-03-07 23:35+0000\n"
|
||||
"PO-Revision-Date: 2011-03-09 06:41+0200\n"
|
||||
"Last-Translator: Ivar Smolin <okul@linux.ee>\n"
|
||||
"Language-Team: Estonian <gnome-et@linux.ee>\n"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2012-10-17 20:44+0000\n"
|
||||
"PO-Revision-Date: 2012-10-21 20:48+0300\n"
|
||||
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
|
||||
"Language-Team: Estonian <>\n"
|
||||
"Language: et\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: et\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "Lülitumine 1. tööalale"
|
||||
msgid "Windows"
|
||||
msgstr "Aknad"
|
||||
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "Lülitumine 2. tööalale"
|
||||
msgid "View split on left"
|
||||
msgstr "Vaade poolitatakse vasakult"
|
||||
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "Lülitumine 3. tööalale"
|
||||
msgid "View split on right"
|
||||
msgstr "Vaade poolitatakse paremalt"
|
||||
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "Lülitumine 4. tööalale"
|
||||
|
||||
msgid "Switch to workspace 5"
|
||||
msgstr "Lülitumine 5. tööalale"
|
||||
|
||||
msgid "Switch to workspace 6"
|
||||
msgstr "Lülitumine 6. tööalale"
|
||||
|
||||
msgid "Switch to workspace 7"
|
||||
msgstr "Lülitumine 7. tööalale"
|
||||
|
||||
msgid "Switch to workspace 8"
|
||||
msgstr "Lülitumine 8. tööalale"
|
||||
|
||||
msgid "Switch to workspace 9"
|
||||
msgstr "Lülitumine 9. tööalale"
|
||||
|
||||
msgid "Switch to workspace 10"
|
||||
msgstr "Lülitumine 10. tööalale"
|
||||
|
||||
msgid "Switch to workspace 11"
|
||||
msgstr "Lülitumine 11. tööalale"
|
||||
|
||||
msgid "Switch to workspace 12"
|
||||
msgstr "Lülitumine 12. tööalale"
|
||||
|
||||
msgid "Switch to workspace on the left of the current workspace"
|
||||
msgstr "Lülitumine sellest tööalast vasakul olevale tööalale"
|
||||
|
||||
msgid "Switch to workspace on the right of the current workspace"
|
||||
msgstr "Lülitumine sellest tööalast paremal olevale tööalale"
|
||||
|
||||
msgid "Switch to workspace above the current workspace"
|
||||
msgstr "Lülitumine selle tööala kohal olevale tööalale"
|
||||
|
||||
msgid "Switch to workspace below the current workspace"
|
||||
msgstr "Lülitumine selle tööala all olevale tööalale"
|
||||
|
||||
msgid "Move between windows of an application, using a popup window"
|
||||
msgstr "Liigu rakenduse akende vahel, hüpikaknaga"
|
||||
|
||||
msgid "Move backward between windows of an application, using a popup window"
|
||||
msgstr "Liigu rakenduse akende vahel tagasisuunas, hüpikaknaga"
|
||||
|
||||
msgid "Move between windows, using a popup window"
|
||||
msgstr "Liigu akende vahel, hüpikaknaga"
|
||||
|
||||
msgid "Move backward between windows, using a popup window"
|
||||
msgstr "Liigu akende vahel tagasisuunas, hüpikaknaga"
|
||||
|
||||
msgid "Move between panels and the desktop, using a popup window"
|
||||
msgstr "Liigu paneelide ja töölaua vahel, hüpikaknaga"
|
||||
|
||||
msgid "Move backward between panels and the desktop, using a popup window"
|
||||
msgstr "Liigu tagasisuunas paneelide ja töölaua vahel, hüpikaknaga"
|
||||
|
||||
msgid "Move between windows of an application immediately"
|
||||
msgstr "Liigu koheselt rakenduse akende vahel"
|
||||
|
||||
msgid "Move backward between windows of an application immediately"
|
||||
msgstr "Liigu koheselt rakenduse akende vahel tagasisuunas"
|
||||
|
||||
msgid "Move between windows immediately"
|
||||
msgstr "Liigu koheselt akende vahel"
|
||||
|
||||
msgid "Move backward between windows immediately"
|
||||
msgstr "Liigu koheselt akende vahel tagasisuunas"
|
||||
|
||||
msgid "Move between panels and the desktop immediately"
|
||||
msgstr "Liigu koheselt paneeli ja töölaua vahel"
|
||||
|
||||
msgid "Move backward between panels and the desktop immediately"
|
||||
msgstr "Liigu koheselt tagasisuunas paneelide ja töölaua vahel"
|
||||
|
||||
msgid "Hide all normal windows and set focus to the desktop"
|
||||
msgstr "Peida kõik tavalised aknad ja fokuseeri töölaud"
|
||||
|
||||
msgid "Show the panel's main menu"
|
||||
msgstr "Paneeli peamenüü näitamine"
|
||||
|
||||
msgid "Show the panel's \"Run Application\" dialog box"
|
||||
msgstr "Paneeli dialoogi \"Käivita rakendus\" näitamine"
|
||||
|
||||
msgid "Start or stop recording the session"
|
||||
msgstr "Seansi salvestamise käivitamine või seiskamine"
|
||||
|
||||
msgid "Take a screenshot"
|
||||
msgstr "Kuvatõmmise võtmine"
|
||||
|
||||
msgid "Take a screenshot of a window"
|
||||
msgstr "Kuvatõmmise võtmine aknast"
|
||||
|
||||
msgid "Run a terminal"
|
||||
msgstr "Terminali käivitamine"
|
||||
|
||||
msgid "Activate the window menu"
|
||||
msgstr "Aknamenüü aktiveerimine"
|
||||
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "Täisekraanivaate sisse- ja väljalülitamine"
|
||||
|
||||
msgid "Toggle maximization state"
|
||||
msgstr "Maksimeeritud oleku sisse- ja väljalülitamine"
|
||||
|
||||
msgid "Toggle whether a window will always be visible over other windows"
|
||||
msgstr "Lüliti määrab, kas aken on alati teiste akende kohal nähtav"
|
||||
|
||||
msgid "Maximize window"
|
||||
msgstr "Akna maksimeerimine"
|
||||
|
||||
msgid "Restore window"
|
||||
msgstr "Taasta akna suurus"
|
||||
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "Varjatud oleku lüliti"
|
||||
|
||||
msgid "Minimize window"
|
||||
msgstr "Akna minimeerimine"
|
||||
|
||||
msgid "Close window"
|
||||
msgstr "Akna sulgemine"
|
||||
|
||||
msgid "Move window"
|
||||
msgstr "Teisalda aken"
|
||||
|
||||
msgid "Resize window"
|
||||
msgstr "Muuda akna suurust"
|
||||
|
||||
msgid "Toggle whether window is on all workspaces or just one"
|
||||
msgstr "Lüliti määrab, kas aken on kõigil tööaladel või ainult ühel"
|
||||
|
||||
msgid "Move window to workspace 1"
|
||||
msgstr "Akna tõstmine 1. tööalale"
|
||||
|
||||
msgid "Move window to workspace 2"
|
||||
msgstr "Akna tõstmine 2. tööalale"
|
||||
|
||||
msgid "Move window to workspace 3"
|
||||
msgstr "Akna tõstmine 3. tööalale"
|
||||
|
||||
msgid "Move window to workspace 4"
|
||||
msgstr "Akna tõstmine 4. tööalale"
|
||||
|
||||
msgid "Move window to workspace 5"
|
||||
msgstr "Akna tõstmine 5. tööalale"
|
||||
|
||||
msgid "Move window to workspace 6"
|
||||
msgstr "Akna tõstmine 6. tööalale"
|
||||
|
||||
msgid "Move window to workspace 7"
|
||||
msgstr "Akna tõstmine 7. tööalale"
|
||||
|
||||
msgid "Move window to workspace 8"
|
||||
msgstr "Akna tõstmine 8. tööalale"
|
||||
|
||||
msgid "Move window to workspace 9"
|
||||
msgstr "Akna tõstmine 9. tööalale"
|
||||
|
||||
msgid "Move window to workspace 10"
|
||||
msgstr "Akna tõstmine 10. tööalale"
|
||||
|
||||
msgid "Move window to workspace 11"
|
||||
msgstr "Akna tõstmine 11. tööalale"
|
||||
|
||||
msgid "Move window to workspace 12"
|
||||
msgstr "Akna tõstmine 12. tööalale"
|
||||
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "Akna tõstmine ühe tööala võrra vasakule"
|
||||
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "Akna tõstmine ühe tööala võrra paremale"
|
||||
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "Akna tõstmine ühe tööala võrra ülespoole"
|
||||
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "Akna tõstmine ühe tööala võrra allapoole"
|
||||
|
||||
msgid "Raise window if it's covered by another window, otherwise lower it"
|
||||
msgstr "Tõsta aken, kui seda katab teine aken, muul juhul vii tahapoole"
|
||||
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "Akna tõstmine teiste akende kohale"
|
||||
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "Saada aken teiste taha"
|
||||
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "Maksimeeri aken vertikaalselt"
|
||||
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "Maksimeeri aken horisontaalselt"
|
||||
|
||||
msgid "Move window to north-west (top left) corner"
|
||||
msgstr "Akna tõstmine ekraani loodepoolsesse (ülemisse vasakusse) nurka"
|
||||
|
||||
msgid "Move window to north-east (top right) corner"
|
||||
msgstr "Akna tõstmine ekraani kirdepoolsesse (ülemisse paremasse) nurka"
|
||||
|
||||
msgid "Move window to south-west (bottom left) corner"
|
||||
msgstr "Akna tõstmine ekraani edelapoolsesse (alumisse vasakusse) nurka"
|
||||
|
||||
msgid "Move window to south-east (bottom right) corner"
|
||||
msgstr "Akna tõstmine ekraani kagupoolsesse (alumisse paremasse) nurka"
|
||||
|
||||
msgid "Move window to north (top) side of screen"
|
||||
msgstr "Akna tõstmine ekraani põhjapoolsesse (ülemisse) serva"
|
||||
|
||||
msgid "Move window to south (bottom) side of screen"
|
||||
msgstr "Akna tõstmine ekraani lõunapoolsesse (alumisse) serva"
|
||||
|
||||
msgid "Move window to east (right) side of screen"
|
||||
msgstr "Akna tõstmine ekraani idapoolsesse (paremasse) serva"
|
||||
|
||||
msgid "Move window to west (left) side of screen"
|
||||
msgstr "Akna tõstmine ekraani läänepoolsesse (vasakusse) serva"
|
||||
|
||||
msgid "Move window to center of screen"
|
||||
msgstr "Akna tõstmine ekraani keskele"
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
msgstr "Teine komposiithaldur juba töötab ekraani %i kuval \"%s\"."
|
||||
|
||||
msgid "Bell event"
|
||||
msgstr "Helina sündmus"
|
||||
@@ -262,10 +48,12 @@ msgstr "Helina sündmus"
|
||||
msgid "Unknown window information request: %d"
|
||||
msgstr "Tundmatu aknateabe päring: %d"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#, c-format
|
||||
msgid "<tt>%s</tt> is not responding."
|
||||
msgstr "<tt>%s</tt> ei vasta."
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "„%s” ei vasta."
|
||||
|
||||
msgid "Application is not responding."
|
||||
msgstr "Rakendus ei vasta."
|
||||
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
@@ -294,27 +82,6 @@ msgstr ""
|
||||
"Mõni teine programm juba kasutab klahvi %s koos muuteklahvidega %x "
|
||||
"kiirklahvina\n"
|
||||
|
||||
#. Displayed when a keybinding which is
|
||||
#. * supposed to launch a program fails.
|
||||
#.
|
||||
#, c-format
|
||||
msgid ""
|
||||
"There was an error running <tt>%s</tt>:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"<tt>%s</tt> käivitamisel esines viga:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#, c-format
|
||||
msgid "No command %d has been defined.\n"
|
||||
msgstr "Käsku %d pole defineeritud.\n"
|
||||
|
||||
#, c-format
|
||||
msgid "No terminal command has been defined.\n"
|
||||
msgstr "Terminalikäsku pole defineeritud.\n"
|
||||
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Seansihalduriga ühendumise keelamine"
|
||||
|
||||
@@ -361,41 +128,8 @@ msgstr ""
|
||||
msgid "Print version"
|
||||
msgstr "Versiooni printimine"
|
||||
|
||||
msgid "Comma-separated list of compositor plugins"
|
||||
msgstr "Komaga eraldatud nimekiri komposiitmontaaži pluginatest"
|
||||
|
||||
#.
|
||||
#. * We found it, but it was invalid. Complain.
|
||||
#. *
|
||||
#. * FIXME: This replicates the original behaviour, but in the future
|
||||
#. * we might consider reverting invalid keys to their original values.
|
||||
#. * (We know the old value, so we can look up a suitable string in
|
||||
#. * the symtab.)
|
||||
#. *
|
||||
#. * (Empty comment follows so the translators don't see this.)
|
||||
#.
|
||||
#.
|
||||
#, c-format
|
||||
msgid "GConf key '%s' is set to an invalid value\n"
|
||||
msgstr "GConf võtme '%s' väärtus on vigane\n"
|
||||
|
||||
#, c-format
|
||||
msgid "%d stored in GConf key %s is out of range %d to %d\n"
|
||||
msgstr ""
|
||||
"%d, mis on salvestatud GConf võtmes %s, on väljaspool piirkonda %d - %d\n"
|
||||
|
||||
#, c-format
|
||||
msgid "GConf key \"%s\" is set to an invalid type\n"
|
||||
msgstr "GConf-i võti \"%s\" on määratud vigase tüübiga\n"
|
||||
|
||||
#, c-format
|
||||
msgid "GConf key %s is already in use and can't be used to override %s\n"
|
||||
msgstr ""
|
||||
"GConfi võti %s on juba kasutusel ja sellega ei saa tühistada võtit %s\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Can't override GConf key, %s not found\n"
|
||||
msgstr "GConfi võtit pole võimalik tühistada, võtit %s ei leitud\n"
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Millist Mutteri pluginat kasutada"
|
||||
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
@@ -405,8 +139,8 @@ msgstr ""
|
||||
"ei pruugi õigesti käituda.\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GConf key %s\n"
|
||||
msgstr "Fondi kirjeldust \"%s\" GConf võtmest %s ei saa töödelda\n"
|
||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||
msgstr "Fondi kirjeldust \"%s\" GSettings võtmest %s pole võimalik töödelda\n"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
@@ -416,14 +150,6 @@ msgstr ""
|
||||
"Seadistuste andmebaasist leitud \"%s\" ei ole sobiv väärtus hiireklahvi "
|
||||
"modifikaatoriks\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Error setting number of workspaces to %d: %s\n"
|
||||
msgstr "Viga tööalade arvuks %d määramisel: %s\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Tööala %d"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
@@ -433,16 +159,8 @@ msgstr ""
|
||||
"\"\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Error setting name for workspace %d to \"%s\": %s\n"
|
||||
msgstr "Viga tööalale %d nime \"%s\" määramisel: %s\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Error setting live hidden windows status status: %s\n"
|
||||
msgstr "Viga varjus elushoitavate akende oleku määramisel: %s\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Error setting no tab popup status: %s\n"
|
||||
msgstr ""
|
||||
msgid "Workspace %d"
|
||||
msgstr "Tööala %d"
|
||||
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
@@ -540,10 +258,6 @@ msgstr "Aknahalduri hoiatus: "
|
||||
msgid "Window manager error: "
|
||||
msgstr "Aknahalduri viga: "
|
||||
|
||||
#. Translators: This is the title used on dialog boxes
|
||||
msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#. first time through
|
||||
#, c-format
|
||||
msgid ""
|
||||
@@ -581,6 +295,12 @@ msgstr "%s (masinas %s)"
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr "Vigane WM_TRANSIENT_FOR aknale 0x%lx määratud %s jaoks.\n"
|
||||
|
||||
#, c-format
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr ""
|
||||
"WM_TRANSIENT_FOR aknale 0x%lx määratud %s jaoks tekitaks tsüklilise "
|
||||
"korduse.\n"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window 0x%lx has property %s\n"
|
||||
@@ -604,18 +324,8 @@ msgid ""
|
||||
"Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list\n"
|
||||
msgstr "Omadus %s aknal 0x%lx sisaldab vigast UTF-8 %d kirjele nimekirjas\n"
|
||||
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Modaaldialoogide kinnistamine"
|
||||
|
||||
msgid ""
|
||||
"Determines whether hidden windows (i.e., minimized windows and windows on "
|
||||
"other workspaces than the current one) should be kept alive."
|
||||
msgstr ""
|
||||
"Määrab, kas varjatud aknaid (nt minimeeritud ja teistel tööaladel aknad) "
|
||||
"hoitakse elus."
|
||||
|
||||
msgid "Live Hidden Windows"
|
||||
msgstr "Varjatud akende aktiivsus"
|
||||
msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "Laiendatud aknaoperatsioonide korral kasutatav muuteklahv"
|
||||
@@ -632,6 +342,9 @@ msgstr ""
|
||||
"klahv\". Eeldatavasti määratakse selle seose väärtuseks vaikimisi või tühi "
|
||||
"sõne."
|
||||
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Modaaldialoogide kinnistamine"
|
||||
|
||||
msgid ""
|
||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
@@ -640,43 +353,80 @@ msgstr ""
|
||||
"Kui märgitud, siis eraldi tiitliribade asemel on moodaalsed dialoogid "
|
||||
"emaakna tiitliribade küljes ning liiguvad koos emaaknaga."
|
||||
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr "Akna ümberpaigutamine selle lohistamisel ekraani serva"
|
||||
|
||||
msgid ""
|
||||
"If enabled, dropping windows on vertical screen edges maximizes them "
|
||||
"vertically and resizes them horizontally to cover half of the available "
|
||||
"area. Dropping windows on the top screen edge maximizes them completely."
|
||||
msgstr ""
|
||||
"Kui märgitud, siis akna lohistamine ekraani külgservale maksimeerib selle "
|
||||
"vertikaalselt ja laius katab pool saadaolevast laiusest. Akna lohistamine "
|
||||
"ekraani ülaserva maksimeerib akna täielikult."
|
||||
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Tööalade dünaamiline haldus"
|
||||
|
||||
msgid ""
|
||||
"Determines whether workspaces are managed dynamically or whether there's a "
|
||||
"static number of workspaces (determined by the num-workspaces key in org."
|
||||
"gnome.desktop.wm.preferences)."
|
||||
msgstr ""
|
||||
"Määrab, kas tööalasid hallatakse dünaamiliselt või on nende arv staatiline "
|
||||
"(arvu määrab org.gnome.desktop.wm.preferences all võti num-workspaces)."
|
||||
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Tööalad ainult peamisel"
|
||||
|
||||
msgid ""
|
||||
"Determines whether workspace switching should happen for windows on all "
|
||||
"monitors or only for windows on the primary monitor."
|
||||
msgstr ""
|
||||
"Määrab, kas tööalade vahetamine mõjutab kõiki aknaid kõigil monitoridel või "
|
||||
"ainult aknaid peamisel monitoril."
|
||||
|
||||
msgid "No tab popup"
|
||||
msgstr "Tabulaatoril pole hüpikakent"
|
||||
|
||||
msgid ""
|
||||
"Determines whether the use of popup and highlight frame should be disabled "
|
||||
"for window cycling."
|
||||
msgstr ""
|
||||
"Kui märgitud, siis on hüpikaken ja esiletõstmise raam keelatud akende "
|
||||
"vahetamisel."
|
||||
|
||||
msgid "Delay focus changes until the pointer stops moving"
|
||||
msgstr "Fookusemuutused lükatakse edasi kuni kursor peatub"
|
||||
|
||||
msgid ""
|
||||
"If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
|
||||
"the focus will not be changed immediately when entering a window, but only "
|
||||
"after the pointer stops moving."
|
||||
msgstr ""
|
||||
"Kui tõene ning fookusrežiim on kas \"sloppy\" või \"mouse\", siis fookust ei "
|
||||
"vahetata kohe, kui kursor aknale liigub, vaid alles pärast kursori peatumist."
|
||||
|
||||
msgid "Draggable border width"
|
||||
msgstr "Lohistatava äärise laius."
|
||||
|
||||
msgid ""
|
||||
"The amount of total draggable borders. If the theme's visible borders are "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
msgstr ""
|
||||
"Lohistatava äärise laius. Kui kujunduse nähtavatest ääristest ei piisa, "
|
||||
"lisatakse puuduoleva osa jaoks nähtamatu ääris."
|
||||
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Akna valimine tabulaatori hüpikaknalt"
|
||||
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Tabulaatori hüpikakna katkestamine"
|
||||
|
||||
#, c-format
|
||||
msgid "Usage: %s\n"
|
||||
msgstr "Kasutamine: %s\n"
|
||||
|
||||
msgid "Close Window"
|
||||
msgstr "Sulge aken"
|
||||
|
||||
msgid "Window Menu"
|
||||
msgstr "Aknamenüü"
|
||||
|
||||
msgid "Minimize Window"
|
||||
msgstr "Akna minimeerimine"
|
||||
|
||||
msgid "Maximize Window"
|
||||
msgstr "Akna maksimeerimine"
|
||||
|
||||
msgid "Restore Window"
|
||||
msgstr "Akna taastamine"
|
||||
|
||||
msgid "Roll Up Window"
|
||||
msgstr "Akna kokkukerimine"
|
||||
|
||||
msgid "Unroll Window"
|
||||
msgstr "Akna lahtikerimine"
|
||||
|
||||
msgid "Keep Window On Top"
|
||||
msgstr "Akna kõige pealmiseks määramine"
|
||||
|
||||
msgid "Remove Window From Top"
|
||||
msgstr "Eemalda aken kõige pealmise kohalt"
|
||||
|
||||
msgid "Always On Visible Workspace"
|
||||
msgstr "Alati nähtaval tööalal"
|
||||
|
||||
msgid "Put Window On Only One Workspace"
|
||||
msgstr "Tõsta aken ainult ühele tööalale"
|
||||
|
||||
#. Translators: Translate this string the same way as you do in libwnck!
|
||||
msgid "Mi_nimize"
|
||||
msgstr "_Minimeeri"
|
||||
@@ -877,6 +627,30 @@ msgstr "Raami geomeetria ei määra nuppude suurust"
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "Värviüleminekus peaks olema vähemalt kaks värvi"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK custom color specification must have color name and fallback in "
|
||||
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
||||
msgstr ""
|
||||
"GTK kohandatud värvi määrang peab sisaldama sulgudes värvi nimetust ning "
|
||||
"varuvärvi, nt gtk:custom(foo,bar); väärtust \"%s\" pole võimalik töödelda"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||
"_ are valid"
|
||||
msgstr ""
|
||||
"gtk:custom color_name parameetris sobimatu märk '%c', lubatud on ainult A-Za-"
|
||||
"z0-9-_"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
"fit the format"
|
||||
msgstr ""
|
||||
"Gtk:custom vorming on \"gtk:custom(värvi_nimi,varuvärv)\", \"%s\" ei sobi "
|
||||
"selle vorminguga"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
@@ -1511,25 +1285,3 @@ msgstr "y väärtus oli %d, oodati väärtust %d"
|
||||
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||
msgstr ""
|
||||
"%d koordinaatide avaldis töödeldi %g sekundiga (keskmine %g sekundit)\n"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Don't make fullscreen windows that are maximized and have no decorations"
|
||||
#~ msgstr "Ei tehta maksimeeritud ilma raamita täisekraanaknaid."
|
||||
|
||||
#~ msgid "Whether window popup/frame should be shown when cycling windows."
|
||||
#~ msgstr "Kas hüpikakent/raami näidatakse akende vahetamisel."
|
||||
|
||||
#~ msgid "Internal argument for GObject introspection"
|
||||
#~ msgstr "GObject enesevaatluse siseargument"
|
||||
|
||||
#~ msgid "Failed to restart: %s\n"
|
||||
#~ msgstr "Tõrge taaskäivitamisel: %s\n"
|
||||
|
||||
#~ msgid "Error setting clutter plugin list: %s\n"
|
||||
#~ msgstr "Viga clutteri pluginate nimekirja määramisel: %s\n"
|
||||
|
||||
#~ msgid "Clutter Plugins"
|
||||
#~ msgstr "Clutteri pluginad"
|
||||
|
||||
#~ msgid "Plugins to load for the Clutter-based compositing manager."
|
||||
#~ msgstr "Clutteril põhineva komposiitmontaažihalduri laadimise pluginad."
|
||||
|
397
po/gl.po
397
po/gl.po
@@ -1,29 +1,29 @@
|
||||
# translation of metacity.HEAD.gl.po to
|
||||
# Galician translation of mutter.
|
||||
# Copyright (C) 2001, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
#
|
||||
#
|
||||
# Proxecto Trasno - Adaptación do software libre á lingua galega: Se desexas
|
||||
# colaborar connosco, podes atopar máis información en http://www.trasno.net
|
||||
# Manuel A. Fernández Montecelo <manuel@sindominio.net>, 2001, 2005.
|
||||
# Ignacio Casal Quinteiro <nacho.resa@gmail.com>, 2005, 2006.
|
||||
# Ignacio Casal Quinteiro <icq@cvs.gnome.org>, 2007.
|
||||
# Ignacio Casal Quinteiro <icq@svn.gnome.org>, 2007, 2008.
|
||||
# Mancomún - Centro de Referencia e Servizos de Software Libre <g11n@mancomun.org>, 2009.
|
||||
# Fran Diéguez <frandieguez@gnome.org>, 2010, 2011.
|
||||
# Fran Dieguez <frandieguez@gnome.org>, 2009, 2011, 2012.
|
||||
#
|
||||
# Fran Diéguez <frandieguez@gnome.org>, 2009, 2010, 2011, 2012.
|
||||
# Leandro Regueiro <leandro.regueiro@gmail.com>, 2012.
|
||||
# Fran Dieguez <frandieguez@gnome.org>, 2012.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gl\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-01-15 01:25+0100\n"
|
||||
"PO-Revision-Date: 2012-01-15 01:27+0100\n"
|
||||
"POT-Creation-Date: 2012-10-16 17:05+0200\n"
|
||||
"PO-Revision-Date: 2012-10-16 17:06+0200\n"
|
||||
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
|
||||
"Language-Team: Galician <gnome-l10n-gl@gnome.org>\n"
|
||||
"Language-Team: gnome-l10n-gl@gnome.org\n"
|
||||
"Language: gl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||
"X-Generator: Lokalize 1.2\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Virtaal 0.7.1\n"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:1
|
||||
msgid "Windows"
|
||||
@@ -45,10 +45,10 @@ msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
msgstr ""
|
||||
"Non foi posíbel obter a selección do xestor de xanelas na pantalla %i na "
|
||||
"Xa se está a executar outro xestor de composición na pantalla %i na "
|
||||
"visualización «%s»"
|
||||
|
||||
#: ../src/core/bell.c:307
|
||||
#: ../src/core/bell.c:320
|
||||
msgid "Bell event"
|
||||
msgstr "Evento de campá"
|
||||
|
||||
@@ -59,14 +59,14 @@ msgstr "Petición de información de xanela descoñecida: %d"
|
||||
|
||||
#: ../src/core/delete.c:111
|
||||
#, c-format
|
||||
msgid "<tt>%s</tt> is not responding."
|
||||
msgstr "<tt>%s</tt> non está respondendo."
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "«%s» non está respondendo."
|
||||
|
||||
#: ../src/core/delete.c:114
|
||||
#: ../src/core/delete.c:113
|
||||
msgid "Application is not responding."
|
||||
msgstr "O Aplicativo non está respondendo."
|
||||
|
||||
#: ../src/core/delete.c:119
|
||||
#: ../src/core/delete.c:118
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
@@ -74,25 +74,25 @@ msgstr ""
|
||||
"Pode elixir esperar un momento para ver se continúa ou forzar ao aplicativo "
|
||||
"a pechar completamente."
|
||||
|
||||
#: ../src/core/delete.c:126
|
||||
#: ../src/core/delete.c:125
|
||||
msgid "_Wait"
|
||||
msgstr "Espe_rar"
|
||||
|
||||
#: ../src/core/delete.c:126
|
||||
#: ../src/core/delete.c:125
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Forzar a saída"
|
||||
|
||||
#: ../src/core/display.c:361
|
||||
#: ../src/core/display.c:396
|
||||
#, c-format
|
||||
msgid "Missing %s extension required for compositing"
|
||||
msgstr "Falta a extensión %s que se require para a composición"
|
||||
|
||||
#: ../src/core/display.c:427
|
||||
#: ../src/core/display.c:493
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "Produciuse un fallo ao abrir a pantalla do X Window System «%s»\n"
|
||||
msgstr "Produciuse un erro ao abrir a visualización do X Window System «%s»\n"
|
||||
|
||||
#: ../src/core/keybindings.c:852
|
||||
#: ../src/core/keybindings.c:853
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Some other program is already using the key %s with modifiers %x as a "
|
||||
@@ -101,36 +101,36 @@ msgstr ""
|
||||
"Algún outro programa xa está usando a tecla %s cos modificadores %x como "
|
||||
"combinación\n"
|
||||
|
||||
#: ../src/core/main.c:206
|
||||
#: ../src/core/main.c:196
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Desactivar a conexión ao xestor de sesión"
|
||||
|
||||
#: ../src/core/main.c:212
|
||||
#: ../src/core/main.c:202
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Substituír o xestor de xanelas en execución"
|
||||
|
||||
#: ../src/core/main.c:218
|
||||
#: ../src/core/main.c:208
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Especificar o ID de xestión de sesión"
|
||||
|
||||
#: ../src/core/main.c:223
|
||||
#: ../src/core/main.c:213
|
||||
msgid "X Display to use"
|
||||
msgstr "Pantalla X que se vai usar"
|
||||
|
||||
#: ../src/core/main.c:229
|
||||
#: ../src/core/main.c:219
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Iniciar sesión desde o ficheiro de salvagarda"
|
||||
msgstr "Inicializar sesión desde o ficheiro de salvagarda"
|
||||
|
||||
#: ../src/core/main.c:235
|
||||
#: ../src/core/main.c:225
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Facer que as chamadas a X sexan sincrónicas"
|
||||
|
||||
#: ../src/core/main.c:504
|
||||
#: ../src/core/main.c:494
|
||||
#, c-format
|
||||
msgid "Failed to scan themes directory: %s\n"
|
||||
msgstr "Fallou ao dixitalizar o directorio de temas: %s\n"
|
||||
msgstr "Produciuse un erro ao dixitalizar o directorio de temas: %s\n"
|
||||
|
||||
#: ../src/core/main.c:520
|
||||
#: ../src/core/main.c:510
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||
@@ -158,10 +158,10 @@ msgid "Print version"
|
||||
msgstr "Imprimir versión"
|
||||
|
||||
#: ../src/core/mutter.c:60
|
||||
msgid "Comma-separated list of compositor plugins"
|
||||
msgstr "Lista de separadas por comas dos complementos do compositor"
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Engadido de mutter que usar"
|
||||
|
||||
#: ../src/core/prefs.c:1069
|
||||
#: ../src/core/prefs.c:1079
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
"behave properly.\n"
|
||||
@@ -169,42 +169,42 @@ msgstr ""
|
||||
"Desactiváronse os arranxos para aplicativos danados. Pode que algúns "
|
||||
"aplicativos non se comporten correctamente.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1144
|
||||
#: ../src/core/prefs.c:1154
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||
msgstr ""
|
||||
"Non foi posíbel analizar a descrición do tipo de letra «%s» da chave "
|
||||
"GSettings %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:1210
|
||||
#: ../src/core/prefs.c:1220
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||
"modifier\n"
|
||||
msgstr ""
|
||||
"«%s» atopados na base de datos de configuración non é un valor válido para o "
|
||||
"modificador do botón do rato\n"
|
||||
"«%s» atopados na base de datos de configuración non é un valor correcto para "
|
||||
"o modificador do botón do rato\n"
|
||||
|
||||
#: ../src/core/prefs.c:1722
|
||||
#: ../src/core/prefs.c:1747
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
"\"%s\"\n"
|
||||
msgstr ""
|
||||
"«%s» atopados na base de datos de configuración non é un valor válido para a "
|
||||
"combinación de teclas «%s»\n"
|
||||
"«%s» atopados na base de datos de configuración non é un valor correcto para "
|
||||
"a combinación de teclas «%s»\n"
|
||||
|
||||
#: ../src/core/prefs.c:1819
|
||||
#: ../src/core/prefs.c:1844
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Espazo de traballo %d"
|
||||
|
||||
#: ../src/core/screen.c:730
|
||||
#: ../src/core/screen.c:652
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "A pantalla %d na visualización «%s» non é válida\n"
|
||||
|
||||
#: ../src/core/screen.c:746
|
||||
#: ../src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||
@@ -213,7 +213,7 @@ msgstr ""
|
||||
"A visualización %d na pantalla «%s» ten xa un xestor de xanelas, tente usar "
|
||||
"a opción --replace para substituír o xestor de xanelas.\n"
|
||||
|
||||
#: ../src/core/screen.c:773
|
||||
#: ../src/core/screen.c:695
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
@@ -221,12 +221,12 @@ msgstr ""
|
||||
"Non foi posíbel obter a selección do xestor de xanelas na pantalla %d na "
|
||||
"visualización «%s»\n"
|
||||
|
||||
#: ../src/core/screen.c:828
|
||||
#: ../src/core/screen.c:750
|
||||
#, c-format
|
||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||
msgstr "A visualización %d na pantalla «%s» ten xa un xestor de xanelas\n"
|
||||
|
||||
#: ../src/core/screen.c:1013
|
||||
#: ../src/core/screen.c:935
|
||||
#, c-format
|
||||
msgid "Could not release screen %d on display \"%s\"\n"
|
||||
msgstr "Non foi posíbel liberar a visualización %d na pantalla «%s»\n"
|
||||
@@ -244,17 +244,17 @@ msgstr "Non foi posíbel abrir o ficheiro de sesión «%s» para escritura: %s\n
|
||||
#: ../src/core/session.c:1001
|
||||
#, c-format
|
||||
msgid "Error writing session file '%s': %s\n"
|
||||
msgstr "Erro ao escribir o ficheiro de sesión «%s»: %s\n"
|
||||
msgstr "Produciuse un erro ao escribir o ficheiro de sesión «%s»: %s\n"
|
||||
|
||||
#: ../src/core/session.c:1006
|
||||
#, c-format
|
||||
msgid "Error closing session file '%s': %s\n"
|
||||
msgstr "Erro ao pechar o ficheiro de sesión «%s»: %s\n"
|
||||
msgstr "Produciuse un erro ao pechar o ficheiro de sesión «%s»: %s\n"
|
||||
|
||||
#: ../src/core/session.c:1136
|
||||
#, c-format
|
||||
msgid "Failed to parse saved session file: %s\n"
|
||||
msgstr "Produciuse un fallo ao analizar o ficheiro de sesión gardado: %s\n"
|
||||
msgstr "Produciuse un erro ao analizar o ficheiro de sesión gardado: %s\n"
|
||||
|
||||
#: ../src/core/session.c:1185
|
||||
#, c-format
|
||||
@@ -286,44 +286,44 @@ msgstr ""
|
||||
"Estas xanelas non soportan "save current setup" e terán que "
|
||||
"reiniciarse manualmente a próxima vez que inicie a sesión."
|
||||
|
||||
#: ../src/core/util.c:111
|
||||
#: ../src/core/util.c:80
|
||||
#, c-format
|
||||
msgid "Failed to open debug log: %s\n"
|
||||
msgstr "Produciuse un fallo ao abrir o rexistro de depuración: %s\n"
|
||||
msgstr "Produciuse un erro ao abrir o rexistro de depuración: %s\n"
|
||||
|
||||
#: ../src/core/util.c:121
|
||||
#: ../src/core/util.c:90
|
||||
#, c-format
|
||||
msgid "Failed to fdopen() log file %s: %s\n"
|
||||
msgstr "Produciuse un fallo ao facer fdopen() no ficheiro de rexistro %s: %s\n"
|
||||
msgstr "Produciuse un erro ao facer fdopen() no ficheiro de rexistro %s: %s\n"
|
||||
|
||||
#: ../src/core/util.c:127
|
||||
#: ../src/core/util.c:96
|
||||
#, c-format
|
||||
msgid "Opened log file %s\n"
|
||||
msgstr "Ficheiro de rexistro %s aberto\n"
|
||||
|
||||
#: ../src/core/util.c:146 ../src/tools/mutter-message.c:149
|
||||
#: ../src/core/util.c:115 ../src/tools/mutter-message.c:149
|
||||
#, c-format
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutter foi compilado sen compatibilidade para o modo detallado\n"
|
||||
|
||||
#: ../src/core/util.c:290
|
||||
#: ../src/core/util.c:259
|
||||
msgid "Window manager: "
|
||||
msgstr "Xestor de xanelas: "
|
||||
|
||||
#: ../src/core/util.c:438
|
||||
#: ../src/core/util.c:407
|
||||
msgid "Bug in window manager: "
|
||||
msgstr "Erro no xestor de xanelas: "
|
||||
msgstr "Fallo no xestor de xanelas: "
|
||||
|
||||
#: ../src/core/util.c:471
|
||||
#: ../src/core/util.c:438
|
||||
msgid "Window manager warning: "
|
||||
msgstr "Aviso do xestor de xanelas: "
|
||||
|
||||
#: ../src/core/util.c:499
|
||||
#: ../src/core/util.c:466
|
||||
msgid "Window manager error: "
|
||||
msgstr "Erro do xestor de xanelas: "
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:7180
|
||||
#: ../src/core/window.c:7237
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||
@@ -339,7 +339,7 @@ msgstr ""
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7843
|
||||
#: ../src/core/window.c:7902
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||
@@ -349,23 +349,23 @@ msgstr ""
|
||||
"mais configurou o tamaño mínimo a %d x %d e o tamaño máximo a %d x %d, isto "
|
||||
"non ten moito sentido.\n"
|
||||
|
||||
#: ../src/core/window-props.c:309
|
||||
#: ../src/core/window-props.c:274
|
||||
#, c-format
|
||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||
msgstr "O aplicativo configurou un _NET_WM_PID %lu falso\n"
|
||||
|
||||
#: ../src/core/window-props.c:426
|
||||
#: ../src/core/window-props.c:393
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (en %s)"
|
||||
|
||||
#: ../src/core/window-props.c:1481
|
||||
#: ../src/core/window-props.c:1448
|
||||
#, c-format
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr ""
|
||||
"WM_TRANSIENT_FOR non válido para a xanela 0x%lx especificada para %s.\n"
|
||||
|
||||
#: ../src/core/window-props.c:1492
|
||||
#: ../src/core/window-props.c:1459
|
||||
#, c-format
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr "WM_TRANSIENT_FOR xanela 0x%lx para %s crearía un bucle.\n"
|
||||
@@ -382,7 +382,7 @@ msgstr ""
|
||||
"A xanela 0x%lx ten a propiedade %s\n"
|
||||
"que se esperaba que tivese o tipo %s co formato %d\n"
|
||||
"e actualmente ten un tipo %s co formato %d e n_items %d.\n"
|
||||
"Isto non parece ser un erro do aplicativo nin do xestor de xanelas.\n"
|
||||
"Isto non parece ser un fallo do aplicativo nin do xestor de xanelas.\n"
|
||||
"A xanela ten título=«%s» a clase=«%s» e o nome=«%s»\n"
|
||||
|
||||
#: ../src/core/xprops.c:411
|
||||
@@ -434,22 +434,10 @@ msgstr ""
|
||||
"moveranse de forma conxunta á xanela pai."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:5
|
||||
msgid "Live Hidden Windows"
|
||||
msgstr "Xanelas agochadas en vivo"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"Determines whether hidden windows (i.e., minimized windows and windows on "
|
||||
"other workspaces than the current one) should be kept alive."
|
||||
msgstr ""
|
||||
"Determina se as xanelas agochadas (p.ex., xanelas minimizadas ou xanelas "
|
||||
"noutros espazos de traballo) deben manterse activas."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:7
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr "Activar o mosaico nos bordos ao arrastrar xanelas aos bordos da xanela"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:8
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"If enabled, dropping windows on vertical screen edges maximizes them "
|
||||
"vertically and resizes them horizontally to cover half of the available "
|
||||
@@ -460,6 +448,20 @@ msgstr ""
|
||||
"metade da área dispoñíbel. Arrastrar xanelas ao bordo superior da pantalla "
|
||||
"maximízaas por completo."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:7
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Os espazos de traballo xestiónanse dinamicamente"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:8
|
||||
msgid ""
|
||||
"Determines whether workspaces are managed dynamically or whether there's a "
|
||||
"static number of workspaces (determined by the num-workspaces key in org."
|
||||
"gnome.desktop.wm.preferences)."
|
||||
msgstr ""
|
||||
"Determina se os espazos de traballo se xestionan dinamicamente ou se hai un "
|
||||
"número estático de áreas de traballo (determinado pola chave «num-"
|
||||
"workspaces» en «org.gnome.desktop.wm.preferences»)."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:9
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Espazos de traballo só no principal"
|
||||
@@ -485,10 +487,24 @@ msgstr ""
|
||||
"realzados ao cambiar entre xanelas."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:13
|
||||
msgid "Delay focus changes until the pointer stops moving"
|
||||
msgstr "Retrasar o cambio de enfoque até que o punteiro se deteña ao moverse"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:14
|
||||
msgid ""
|
||||
"If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
|
||||
"the focus will not be changed immediately when entering a window, but only "
|
||||
"after the pointer stops moving."
|
||||
msgstr ""
|
||||
"Se está estabelecido a verdadeiro e o modo de enfoque é «sloopy» ou «mouse» "
|
||||
"entón o enfoque non se cambiará de forma inmediata ao entrar nunha xanela, "
|
||||
"só cando o punteiro se deteña sobre ela."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:15
|
||||
msgid "Draggable border width"
|
||||
msgstr "Anchura arrastrábel do bordo"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:14
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:16
|
||||
msgid ""
|
||||
"The amount of total draggable borders. If the theme's visible borders are "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
@@ -496,11 +512,11 @@ msgstr ""
|
||||
"A cantidade total de bordo arrastrábel. Se os bordos visíbeis do tema non "
|
||||
"son suficientes, engadiranse bordos invisíbeis para satisfacer este valor."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:15
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:17
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Seleccionar xanela da lapela emerxente"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:16
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:18
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Cancelar lapela emerxente"
|
||||
|
||||
@@ -509,50 +525,6 @@ msgstr "Cancelar lapela emerxente"
|
||||
msgid "Usage: %s\n"
|
||||
msgstr "Uso: %s\n"
|
||||
|
||||
#: ../src/ui/frames.c:1157
|
||||
msgid "Close Window"
|
||||
msgstr "Pechar a xanela"
|
||||
|
||||
#: ../src/ui/frames.c:1160
|
||||
msgid "Window Menu"
|
||||
msgstr "Menú da xanela"
|
||||
|
||||
#: ../src/ui/frames.c:1163
|
||||
msgid "Minimize Window"
|
||||
msgstr "Minimizar a xanela"
|
||||
|
||||
#: ../src/ui/frames.c:1166
|
||||
msgid "Maximize Window"
|
||||
msgstr "Maximizar a xanela"
|
||||
|
||||
#: ../src/ui/frames.c:1169
|
||||
msgid "Restore Window"
|
||||
msgstr "Restaurar a xanela"
|
||||
|
||||
#: ../src/ui/frames.c:1172
|
||||
msgid "Roll Up Window"
|
||||
msgstr "Pregar a xanela"
|
||||
|
||||
#: ../src/ui/frames.c:1175
|
||||
msgid "Unroll Window"
|
||||
msgstr "Despregar a xanela"
|
||||
|
||||
#: ../src/ui/frames.c:1178
|
||||
msgid "Keep Window On Top"
|
||||
msgstr "Manter a xanela na parte superior"
|
||||
|
||||
#: ../src/ui/frames.c:1181
|
||||
msgid "Remove Window From Top"
|
||||
msgstr "Quitar a xanela da parte superior"
|
||||
|
||||
#: ../src/ui/frames.c:1184
|
||||
msgid "Always On Visible Workspace"
|
||||
msgstr "Sempre no espazo de traballo visíbel"
|
||||
|
||||
#: ../src/ui/frames.c:1187
|
||||
msgid "Put Window On Only One Workspace"
|
||||
msgstr "Pór a xanela nun só espazo de traballo"
|
||||
|
||||
#. Translators: Translate this string the same way as you do in libwnck!
|
||||
#: ../src/ui/menu.c:69
|
||||
msgid "Mi_nimize"
|
||||
@@ -752,48 +724,48 @@ msgstr "Mod5"
|
||||
msgid "%d x %d"
|
||||
msgstr "%d x %d"
|
||||
|
||||
#: ../src/ui/theme.c:253
|
||||
#: ../src/ui/theme.c:234
|
||||
msgid "top"
|
||||
msgstr "superior"
|
||||
|
||||
#: ../src/ui/theme.c:255
|
||||
#: ../src/ui/theme.c:236
|
||||
msgid "bottom"
|
||||
msgstr "inferior"
|
||||
|
||||
#: ../src/ui/theme.c:257
|
||||
#: ../src/ui/theme.c:238
|
||||
msgid "left"
|
||||
msgstr "esquerda"
|
||||
|
||||
#: ../src/ui/theme.c:259
|
||||
#: ../src/ui/theme.c:240
|
||||
msgid "right"
|
||||
msgstr "dereita"
|
||||
|
||||
#: ../src/ui/theme.c:286
|
||||
#: ../src/ui/theme.c:268
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify \"%s\" dimension"
|
||||
msgstr "a xeometría do marco non especifica a dimensión «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:305
|
||||
#: ../src/ui/theme.c:287
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
msgstr "a xeometría do marco non especifica a dimensión «%s» para o bordo «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:342
|
||||
#: ../src/ui/theme.c:324
|
||||
#, c-format
|
||||
msgid "Button aspect ratio %g is not reasonable"
|
||||
msgstr "A proporción de aspecto do botón %g non é razoábel"
|
||||
|
||||
#: ../src/ui/theme.c:354
|
||||
#: ../src/ui/theme.c:336
|
||||
#, c-format
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "A xeometría do marco non especifica o tamaño dos botóns"
|
||||
|
||||
#: ../src/ui/theme.c:1067
|
||||
#: ../src/ui/theme.c:1049
|
||||
#, c-format
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "Os degradados deben ter polo menos dúas cores"
|
||||
msgstr "As gradacións deben ter polo menos dúas cores"
|
||||
|
||||
#: ../src/ui/theme.c:1219
|
||||
#: ../src/ui/theme.c:1201
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK custom color specification must have color name and fallback in "
|
||||
@@ -803,7 +775,7 @@ msgstr ""
|
||||
"entre parénteses, por exemplo: gtk:custom(foo,bar); non foi posíbel analizar "
|
||||
"«%s»."
|
||||
|
||||
#: ../src/ui/theme.c:1235
|
||||
#: ../src/ui/theme.c:1217
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||
@@ -812,7 +784,7 @@ msgstr ""
|
||||
"O carácter «%c» non é válido no parámetro «color_name» de «gtk:custom», só "
|
||||
"«A-Za-z0-9» son válidos"
|
||||
|
||||
#: ../src/ui/theme.c:1249
|
||||
#: ../src/ui/theme.c:1231
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
@@ -821,7 +793,7 @@ msgstr ""
|
||||
"O formato de «gtk:custom» é «gtk:custom(nome_de_cor,nome_alternativo», «%s» "
|
||||
"non respecta o formato"
|
||||
|
||||
#: ../src/ui/theme.c:1294
|
||||
#: ../src/ui/theme.c:1276
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
@@ -830,7 +802,7 @@ msgstr ""
|
||||
"A especificación de cor do GTK debe ter o estado entre parénteses, exemplo. "
|
||||
"gtk:fg[NORMAL] onde NORMAL é o estado; non foi posíbel analizar «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:1308
|
||||
#: ../src/ui/theme.c:1290
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||
@@ -840,17 +812,17 @@ msgstr ""
|
||||
"estado, exemplo. gtk:fg[NORMAL] onde NORMAL é o estado; non foi posíbel "
|
||||
"analizar «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:1319
|
||||
#: ../src/ui/theme.c:1301
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "Non se entende o estado «%s» na especificación da cor"
|
||||
|
||||
#: ../src/ui/theme.c:1332
|
||||
#: ../src/ui/theme.c:1314
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr "Non se entende o compoñente de cor «%s» na especificación da cor"
|
||||
|
||||
#: ../src/ui/theme.c:1361
|
||||
#: ../src/ui/theme.c:1343
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||
@@ -859,17 +831,17 @@ msgstr ""
|
||||
"O formato de blend é «blend/bg_color/fg_color/alpha», «%s»non coincide co "
|
||||
"formato"
|
||||
|
||||
#: ../src/ui/theme.c:1372
|
||||
#: ../src/ui/theme.c:1354
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "Non foi posíbel analizar o valor alfa «%s» na cor mesturada"
|
||||
|
||||
#: ../src/ui/theme.c:1382
|
||||
#: ../src/ui/theme.c:1364
|
||||
#, c-format
|
||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
msgstr "O valor alfa «%s» na cor mesturada non está entre 0.0 e 1.0"
|
||||
|
||||
#: ../src/ui/theme.c:1429
|
||||
#: ../src/ui/theme.c:1411
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
@@ -877,28 +849,28 @@ msgstr ""
|
||||
"O formato de sombreado é \"shade/base_color/factor\", «%s» non coincide co "
|
||||
"formato"
|
||||
|
||||
#: ../src/ui/theme.c:1440
|
||||
#: ../src/ui/theme.c:1422
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr "Non foi posíbel o factor de sombreado «%s» na cor sombreada"
|
||||
msgstr "Non foi posíbel analizar o factor de sombreado «%s» na cor sombreada"
|
||||
|
||||
#: ../src/ui/theme.c:1450
|
||||
#: ../src/ui/theme.c:1432
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "O factor de sombreado «%s» na cor sombreada é negativo"
|
||||
|
||||
#: ../src/ui/theme.c:1479
|
||||
#: ../src/ui/theme.c:1461
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "Non foi posíbel analizar a cor «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:1790
|
||||
#: ../src/ui/theme.c:1778
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr ""
|
||||
"A expresión de coordenadas contén un carácter «%s» que non está permitido"
|
||||
|
||||
#: ../src/ui/theme.c:1817
|
||||
#: ../src/ui/theme.c:1805
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contains floating point number '%s' which could not be "
|
||||
@@ -907,14 +879,14 @@ msgstr ""
|
||||
"A expresión de coordenadas contén un número de coma flotante «%s» que non "
|
||||
"foi posíbel analizar"
|
||||
|
||||
#: ../src/ui/theme.c:1831
|
||||
#: ../src/ui/theme.c:1819
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr ""
|
||||
"A expresión de coordenadas contén un enteiro «%s» que non foi posíbel "
|
||||
"analizar"
|
||||
|
||||
#: ../src/ui/theme.c:1953
|
||||
#: ../src/ui/theme.c:1940
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contained unknown operator at the start of this text: "
|
||||
@@ -923,17 +895,17 @@ msgstr ""
|
||||
"A expresión de coordenadas contén un operador non válido ao inicio do seu "
|
||||
"texto: «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:2010
|
||||
#: ../src/ui/theme.c:1997
|
||||
#, c-format
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr "A expresión de coordenadas está baleira ou non se entendeu"
|
||||
|
||||
#: ../src/ui/theme.c:2121 ../src/ui/theme.c:2131 ../src/ui/theme.c:2165
|
||||
#: ../src/ui/theme.c:2110 ../src/ui/theme.c:2120 ../src/ui/theme.c:2154
|
||||
#, c-format
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "A expresión de coordenadas resultou nun erro de división por cero"
|
||||
|
||||
#: ../src/ui/theme.c:2173
|
||||
#: ../src/ui/theme.c:2162
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||
@@ -941,25 +913,25 @@ msgstr ""
|
||||
"A expresión de coordenadas tentou usar un operador mod cun número de coma "
|
||||
"flotante"
|
||||
|
||||
#: ../src/ui/theme.c:2229
|
||||
#: ../src/ui/theme.c:2218
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
msgstr ""
|
||||
"A expresión de coordenadas ten un operador «%s» onde se esperaba un operando"
|
||||
|
||||
#: ../src/ui/theme.c:2238
|
||||
#: ../src/ui/theme.c:2227
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr ""
|
||||
"A expresión de coordenadas ten un operando onde se esperaba un operador"
|
||||
|
||||
#: ../src/ui/theme.c:2246
|
||||
#: ../src/ui/theme.c:2235
|
||||
#, c-format
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr "A expresión de coordenadas remata cun operador en vez dun operando"
|
||||
|
||||
#: ../src/ui/theme.c:2256
|
||||
#: ../src/ui/theme.c:2245
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||
@@ -968,42 +940,42 @@ msgstr ""
|
||||
"A expresión de coordenadas ten un operador \"%c\" seguido do operador \"%c\" "
|
||||
"sen un operando entre eles"
|
||||
|
||||
#: ../src/ui/theme.c:2407 ../src/ui/theme.c:2452
|
||||
#: ../src/ui/theme.c:2396 ../src/ui/theme.c:2441
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr ""
|
||||
"A expresión de coordenadas ten unha variábel ou constante descoñecida «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:2506
|
||||
#: ../src/ui/theme.c:2495
|
||||
#, c-format
|
||||
msgid "Coordinate expression parser overflowed its buffer."
|
||||
msgstr "O analizador da expresión de coordenadas desbordou o seu búfer."
|
||||
|
||||
#: ../src/ui/theme.c:2535
|
||||
#: ../src/ui/theme.c:2524
|
||||
#, c-format
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr ""
|
||||
"A expresión de coordenadas ten unha paréntese pechada sen unha paréntese "
|
||||
"aberta"
|
||||
|
||||
#: ../src/ui/theme.c:2599
|
||||
#: ../src/ui/theme.c:2588
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr ""
|
||||
"A expresión de coordenadas ten unha paréntese aberta sen unha paréntese "
|
||||
"pechada"
|
||||
|
||||
#: ../src/ui/theme.c:2610
|
||||
#: ../src/ui/theme.c:2599
|
||||
#, c-format
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr "A expresión de coordenadas non parece ter nin operadores nin operandos"
|
||||
|
||||
#: ../src/ui/theme.c:2822 ../src/ui/theme.c:2842 ../src/ui/theme.c:2862
|
||||
#: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852
|
||||
#, c-format
|
||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||
msgstr "O tema contiña unha expresión que resultou ser un erro: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:4533
|
||||
#: ../src/ui/theme.c:4498
|
||||
#, c-format
|
||||
msgid ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||
@@ -1012,24 +984,24 @@ msgstr ""
|
||||
"<button function=«%s» state=«%s» draw_ops=\"whatever\"/> débese especificar "
|
||||
"para este estilo de marco"
|
||||
|
||||
#: ../src/ui/theme.c:5066 ../src/ui/theme.c:5091
|
||||
#: ../src/ui/theme.c:5009 ../src/ui/theme.c:5034
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
msgstr "Falta <frame state=«%s» resize=«%s» focus=«%s» style=\"whatever\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5139
|
||||
#: ../src/ui/theme.c:5082
|
||||
#, c-format
|
||||
msgid "Failed to load theme \"%s\": %s\n"
|
||||
msgstr "Produciuse un fallo ao cargar o tema «%s»: %s\n"
|
||||
msgstr "Produciuse un erro ao cargar o tema «%s»: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:5275 ../src/ui/theme.c:5282 ../src/ui/theme.c:5289
|
||||
#: ../src/ui/theme.c:5296 ../src/ui/theme.c:5303
|
||||
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
|
||||
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
|
||||
#, c-format
|
||||
msgid "No <%s> set for theme \"%s\""
|
||||
msgstr "Non se configurou <%s> para o tema «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:5311
|
||||
#: ../src/ui/theme.c:5254
|
||||
#, c-format
|
||||
msgid ""
|
||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||
@@ -1038,7 +1010,7 @@ msgstr ""
|
||||
"Non hai un estilo de marco para o tipo de xanela «%s» no tema «%s», engada "
|
||||
"un elemento <window type=«%s» style_set=\"whatever\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5709 ../src/ui/theme.c:5771 ../src/ui/theme.c:5834
|
||||
#: ../src/ui/theme.c:5650 ../src/ui/theme.c:5712 ../src/ui/theme.c:5775
|
||||
#, c-format
|
||||
msgid ""
|
||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
@@ -1046,7 +1018,7 @@ msgstr ""
|
||||
"As constantes definidas polo usuario deben comezar cunha letra maiúscula; "
|
||||
"«%s» non o fai"
|
||||
|
||||
#: ../src/ui/theme.c:5717 ../src/ui/theme.c:5779 ../src/ui/theme.c:5842
|
||||
#: ../src/ui/theme.c:5658 ../src/ui/theme.c:5720 ../src/ui/theme.c:5783
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "A constante «%s» xa foi definida"
|
||||
@@ -1212,7 +1184,7 @@ msgstr "Non hai ningún atributo \"extent_angle\" nin \"to\" no elemento <%s>"
|
||||
#: ../src/ui/theme-parser.c:2115
|
||||
#, c-format
|
||||
msgid "Did not understand value \"%s\" for type of gradient"
|
||||
msgstr "Non se entendeu o valor «%s» para o tipo de degradado"
|
||||
msgstr "Non se entendeu o valor «%s» para o tipo de gradación"
|
||||
|
||||
#: ../src/ui/theme-parser.c:2193 ../src/ui/theme-parser.c:2568
|
||||
#, c-format
|
||||
@@ -1283,12 +1255,12 @@ msgstr "O estilo do marco xa ten un botón para a función %s estado %s"
|
||||
#: ../src/ui/theme-parser.c:3073
|
||||
#, c-format
|
||||
msgid "\"%s\" is not a valid value for focus attribute"
|
||||
msgstr "«%s» non é un valor válido para o atributo foco"
|
||||
msgstr "«%s» non é un valor correcto para o atributo foco"
|
||||
|
||||
#: ../src/ui/theme-parser.c:3082
|
||||
#, c-format
|
||||
msgid "\"%s\" is not a valid value for state attribute"
|
||||
msgstr "«%s» non é un valor válido para o atributo estado"
|
||||
msgstr "«%s» non é un valor correcto para o atributo estado"
|
||||
|
||||
#: ../src/ui/theme-parser.c:3092
|
||||
#, c-format
|
||||
@@ -1298,7 +1270,7 @@ msgstr "Non se definiu ningún estilo chamado «%s»"
|
||||
#: ../src/ui/theme-parser.c:3113 ../src/ui/theme-parser.c:3136
|
||||
#, c-format
|
||||
msgid "\"%s\" is not a valid value for resize attribute"
|
||||
msgstr "«%s» non é un valor válido para o atributo redimensionar"
|
||||
msgstr "«%s» non é un valor correcto para o atributo redimensionar"
|
||||
|
||||
#: ../src/ui/theme-parser.c:3147
|
||||
#, c-format
|
||||
@@ -1433,10 +1405,10 @@ msgstr "Non se permite texto dentro do elemento <%s>"
|
||||
msgid "<%s> specified twice for this theme"
|
||||
msgstr "<%s> especificada dúas veces para este tema"
|
||||
|
||||
#: ../src/ui/theme-parser.c:4348
|
||||
#: ../src/ui/theme-parser.c:4334
|
||||
#, c-format
|
||||
msgid "Failed to find a valid file for theme %s\n"
|
||||
msgstr "Non se atopou ningún ficheiro válido para o tema %s\n"
|
||||
msgstr "Produciuse un erro ao buscar un ficheiro correcto para o tema %s\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:99
|
||||
msgid "_Windows"
|
||||
@@ -1557,7 +1529,7 @@ msgstr "Uso: metacity-theme-viewer [NOMETEMA]\n"
|
||||
#: ../src/ui/theme-viewer.c:820
|
||||
#, c-format
|
||||
msgid "Error loading theme: %s\n"
|
||||
msgstr "Erro ao cargar o tema: %s\n"
|
||||
msgstr "Produciuse un erro ao cargar o tema: %s\n"
|
||||
|
||||
#: ../src/ui/theme-viewer.c:826
|
||||
#, c-format
|
||||
@@ -1640,6 +1612,52 @@ msgstr ""
|
||||
"%d expresións de coordenadas interpretadas en %g segundos (%g segundos de "
|
||||
"media)\n"
|
||||
|
||||
#~ msgid "Comma-separated list of compositor plugins"
|
||||
#~ msgstr "Lista de separadas por comas dos complementos do compositor"
|
||||
|
||||
#~ msgid "Live Hidden Windows"
|
||||
#~ msgstr "Xanelas agochadas en vivo"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Determines whether hidden windows (i.e., minimized windows and windows on "
|
||||
#~ "other workspaces than the current one) should be kept alive."
|
||||
#~ msgstr ""
|
||||
#~ "Determina se as xanelas agochadas (p.ex., xanelas minimizadas ou xanelas "
|
||||
#~ "noutros espazos de traballo) deben manterse activas."
|
||||
|
||||
#~ msgid "Close Window"
|
||||
#~ msgstr "Pechar a xanela"
|
||||
|
||||
#~ msgid "Window Menu"
|
||||
#~ msgstr "Menú da xanela"
|
||||
|
||||
#~ msgid "Minimize Window"
|
||||
#~ msgstr "Minimizar a xanela"
|
||||
|
||||
#~ msgid "Maximize Window"
|
||||
#~ msgstr "Maximizar a xanela"
|
||||
|
||||
#~ msgid "Restore Window"
|
||||
#~ msgstr "Restaurar a xanela"
|
||||
|
||||
#~ msgid "Roll Up Window"
|
||||
#~ msgstr "Pregar a xanela"
|
||||
|
||||
#~ msgid "Unroll Window"
|
||||
#~ msgstr "Despregar a xanela"
|
||||
|
||||
#~ msgid "Keep Window On Top"
|
||||
#~ msgstr "Manter a xanela na parte superior"
|
||||
|
||||
#~ msgid "Remove Window From Top"
|
||||
#~ msgstr "Quitar a xanela da parte superior"
|
||||
|
||||
#~ msgid "Always On Visible Workspace"
|
||||
#~ msgstr "Sempre no espazo de traballo visíbel"
|
||||
|
||||
#~ msgid "Put Window On Only One Workspace"
|
||||
#~ msgstr "Pór a xanela nun só espazo de traballo"
|
||||
|
||||
#~ msgid "Switch to workspace 1"
|
||||
#~ msgstr "Cambiar ao espazo de traballo 1"
|
||||
|
||||
@@ -1950,9 +1968,6 @@ msgstr ""
|
||||
#~ msgid "Error setting clutter plugin list: %s\n"
|
||||
#~ msgstr "Erro ao definir a lista de complementos de clutter: %s\n"
|
||||
|
||||
#~ msgid "Clutter Plugins"
|
||||
#~ msgstr "Complementos de Clutter"
|
||||
|
||||
#~ msgid "Plugins to load for the Clutter-based compositing manager."
|
||||
#~ msgstr ""
|
||||
#~ "Complementos a cargar polo xestor de composición baseado en Clutter."
|
||||
|
389
po/he.po
389
po/he.po
@@ -9,8 +9,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: metacity.HEAD.he\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-12-30 10:48+0200\n"
|
||||
"PO-Revision-Date: 2011-12-30 10:49+0200\n"
|
||||
"POT-Creation-Date: 2012-07-24 22:26+0300\n"
|
||||
"PO-Revision-Date: 2012-07-24 22:26+0200\n"
|
||||
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
|
||||
"Language-Team: Hebrew <he@li.org>\n"
|
||||
"Language: he\n"
|
||||
@@ -20,17 +20,17 @@ msgstr ""
|
||||
"X-Generator: KBabel 1.10.2\n"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:1
|
||||
msgid "Windows"
|
||||
msgstr "חלונות"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:2
|
||||
msgid "View split on left"
|
||||
msgstr "פיצול הצפייה משמאל"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:2
|
||||
#: ../src/50-mutter-windows.xml.in.h:3
|
||||
msgid "View split on right"
|
||||
msgstr "פיצול הצפייה מימין"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:3
|
||||
msgid "Windows"
|
||||
msgstr "חלונות"
|
||||
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#: ../src/compositor/compositor.c:492
|
||||
@@ -38,7 +38,7 @@ msgstr "חלונות"
|
||||
msgid "Another compositing manager is already running on screen %i on display \"%s\"."
|
||||
msgstr "מנהל תצוגת חלונות אחר כבר פועל במסך %i בתצוגה \"%s\"."
|
||||
|
||||
#: ../src/core/bell.c:307
|
||||
#: ../src/core/bell.c:320
|
||||
msgid "Bell event"
|
||||
msgstr "אירוע פעמון"
|
||||
|
||||
@@ -47,72 +47,72 @@ msgstr "אירוע פעמון"
|
||||
msgid "Unknown window information request: %d"
|
||||
msgstr "Unknown window information request: %d"
|
||||
|
||||
#: ../src/core/delete.c:111
|
||||
#, c-format
|
||||
msgid "<tt>%s</tt> is not responding."
|
||||
msgstr " <tt>%s</tt> אינו מגיב"
|
||||
|
||||
#: ../src/core/delete.c:114
|
||||
#, c-format
|
||||
msgid "%s is not responding."
|
||||
msgstr "%s אינו מגיב"
|
||||
|
||||
#: ../src/core/delete.c:118
|
||||
msgid "Application is not responding."
|
||||
msgstr "היישום אינו מגיב."
|
||||
|
||||
#: ../src/core/delete.c:119
|
||||
#: ../src/core/delete.c:123
|
||||
msgid "You may choose to wait a short while for it to continue or force the application to quit entirely."
|
||||
msgstr "באפשרותך להמתין זמן קצר ולתת ליישום להמשיך או להכריח את היישום להסתיים."
|
||||
|
||||
#: ../src/core/delete.c:126
|
||||
#: ../src/core/delete.c:130
|
||||
msgid "_Wait"
|
||||
msgstr "ה_מתנה"
|
||||
|
||||
#: ../src/core/delete.c:126
|
||||
#: ../src/core/delete.c:130
|
||||
msgid "_Force Quit"
|
||||
msgstr "_אילוץ סגירה"
|
||||
|
||||
#: ../src/core/display.c:361
|
||||
#: ../src/core/display.c:380
|
||||
#, c-format
|
||||
msgid "Missing %s extension required for compositing"
|
||||
msgstr "Missing %s extension required for compositing"
|
||||
|
||||
#: ../src/core/display.c:427
|
||||
#: ../src/core/display.c:446
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "Failed to open X Window System display '%s'\n"
|
||||
|
||||
#: ../src/core/keybindings.c:852
|
||||
#: ../src/core/keybindings.c:844
|
||||
#, c-format
|
||||
msgid "Some other program is already using the key %s with modifiers %x as a binding\n"
|
||||
msgstr "תוכנית אחרת כבר משתמשת במקש %s עם המקש %x כצירוף\n"
|
||||
|
||||
#: ../src/core/main.c:206
|
||||
#: ../src/core/main.c:196
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Disable connection to session manager"
|
||||
|
||||
#: ../src/core/main.c:212
|
||||
#: ../src/core/main.c:202
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Replace the running window manager"
|
||||
|
||||
#: ../src/core/main.c:218
|
||||
#: ../src/core/main.c:208
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Specify session management ID"
|
||||
|
||||
#: ../src/core/main.c:223
|
||||
#: ../src/core/main.c:213
|
||||
msgid "X Display to use"
|
||||
msgstr "X Display to use"
|
||||
|
||||
#: ../src/core/main.c:229
|
||||
#: ../src/core/main.c:219
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Initialize session from savefile"
|
||||
|
||||
#: ../src/core/main.c:235
|
||||
#: ../src/core/main.c:225
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Make X calls synchronous"
|
||||
|
||||
#: ../src/core/main.c:504
|
||||
#: ../src/core/main.c:494
|
||||
#, c-format
|
||||
msgid "Failed to scan themes directory: %s\n"
|
||||
msgstr "Failed to scan themes directory: %s\n"
|
||||
|
||||
#: ../src/core/main.c:520
|
||||
#: ../src/core/main.c:510
|
||||
#, c-format
|
||||
msgid "Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||
msgstr "Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||
@@ -135,54 +135,54 @@ msgid "Print version"
|
||||
msgstr "Print version"
|
||||
|
||||
#: ../src/core/mutter.c:60
|
||||
msgid "Comma-separated list of compositor plugins"
|
||||
msgstr "Comma-separated list of compositor plugins"
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "תוסף ה־mutter לשימוש"
|
||||
|
||||
#: ../src/core/prefs.c:1069
|
||||
#: ../src/core/prefs.c:1065
|
||||
msgid "Workarounds for broken applications disabled. Some applications may not behave properly.\n"
|
||||
msgstr "Workarounds for broken applications disabled. Some applications may not behave properly.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1144
|
||||
#: ../src/core/prefs.c:1140
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||
msgstr "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:1210
|
||||
#: ../src/core/prefs.c:1206
|
||||
#, c-format
|
||||
msgid "\"%s\" found in configuration database is not a valid value for mouse button modifier\n"
|
||||
msgstr "\"%s\" found in configuration database is not a valid value for mouse button modifier\n"
|
||||
|
||||
#: ../src/core/prefs.c:1722
|
||||
#: ../src/core/prefs.c:1724
|
||||
#, c-format
|
||||
msgid "\"%s\" found in configuration database is not a valid value for keybinding \"%s\"\n"
|
||||
msgstr "\"%s\" found in configuration database is not a valid value for keybinding \"%s\"\n"
|
||||
|
||||
#: ../src/core/prefs.c:1819
|
||||
#: ../src/core/prefs.c:1821
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "סביבת עבודה %d"
|
||||
|
||||
#: ../src/core/screen.c:730
|
||||
#: ../src/core/screen.c:652
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "Screen %d on display '%s' is invalid\n"
|
||||
|
||||
#: ../src/core/screen.c:746
|
||||
#: ../src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display \"%s\" already has a window manager; try using the --replace option to replace the current window manager.\n"
|
||||
msgstr "Screen %d on display \"%s\" already has a window manager; try using the --replace option to replace the current window manager.\n"
|
||||
|
||||
#: ../src/core/screen.c:773
|
||||
#: ../src/core/screen.c:695
|
||||
#, c-format
|
||||
msgid "Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
msgstr "Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
|
||||
#: ../src/core/screen.c:828
|
||||
#: ../src/core/screen.c:750
|
||||
#, c-format
|
||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||
msgstr "Screen %d on display \"%s\" already has a window manager\n"
|
||||
|
||||
#: ../src/core/screen.c:1013
|
||||
#: ../src/core/screen.c:935
|
||||
#, c-format
|
||||
msgid "Could not release screen %d on display \"%s\"\n"
|
||||
msgstr "Could not release screen %d on display \"%s\"\n"
|
||||
@@ -241,45 +241,45 @@ msgstr "Unknown element %s"
|
||||
msgid "These windows do not support "save current setup" and will have to be restarted manually next time you log in."
|
||||
msgstr "חלונות אלו אינם תומכים ב"שמירת ההגדרות הנוכחיות", ויהיה צורך באתחול ידני בכניסה הבאה שלך."
|
||||
|
||||
#: ../src/core/util.c:111
|
||||
#: ../src/core/util.c:80
|
||||
#, c-format
|
||||
msgid "Failed to open debug log: %s\n"
|
||||
msgstr "Failed to open debug log: %s\n"
|
||||
|
||||
#: ../src/core/util.c:121
|
||||
#: ../src/core/util.c:90
|
||||
#, c-format
|
||||
msgid "Failed to fdopen() log file %s: %s\n"
|
||||
msgstr "Failed to fdopen() log file %s: %s\n"
|
||||
|
||||
#: ../src/core/util.c:127
|
||||
#: ../src/core/util.c:96
|
||||
#, c-format
|
||||
msgid "Opened log file %s\n"
|
||||
msgstr "Opened log file %s\n"
|
||||
|
||||
#: ../src/core/util.c:146
|
||||
#: ../src/core/util.c:115
|
||||
#: ../src/tools/mutter-message.c:149
|
||||
#, c-format
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutter הודר ללא תמיכה במצב פירוט\n"
|
||||
|
||||
#: ../src/core/util.c:290
|
||||
#: ../src/core/util.c:259
|
||||
msgid "Window manager: "
|
||||
msgstr "Window manager: "
|
||||
|
||||
#: ../src/core/util.c:438
|
||||
#: ../src/core/util.c:407
|
||||
msgid "Bug in window manager: "
|
||||
msgstr "Bug in window manager: "
|
||||
|
||||
#: ../src/core/util.c:471
|
||||
#: ../src/core/util.c:438
|
||||
msgid "Window manager warning: "
|
||||
msgstr "Window manager warning: "
|
||||
|
||||
#: ../src/core/util.c:499
|
||||
#: ../src/core/util.c:466
|
||||
msgid "Window manager error: "
|
||||
msgstr "Window manager error: "
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:7180
|
||||
#: ../src/core/window.c:7234
|
||||
#, c-format
|
||||
msgid "Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER window as specified in the ICCCM.\n"
|
||||
msgstr "Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER window as specified in the ICCCM.\n"
|
||||
@@ -291,27 +291,27 @@ msgstr "Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADE
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7843
|
||||
#: ../src/core/window.c:7899
|
||||
#, c-format
|
||||
msgid "Window %s sets an MWM hint indicating it isn't resizable, but sets min size %d x %d and max size %d x %d; this doesn't make much sense.\n"
|
||||
msgstr "Window %s sets an MWM hint indicating it isn't resizable, but sets min size %d x %d and max size %d x %d; this doesn't make much sense.\n"
|
||||
|
||||
#: ../src/core/window-props.c:309
|
||||
#: ../src/core/window-props.c:310
|
||||
#, c-format
|
||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||
msgstr "Application set a bogus _NET_WM_PID %lu\n"
|
||||
|
||||
#: ../src/core/window-props.c:426
|
||||
#: ../src/core/window-props.c:429
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (מעל %s)"
|
||||
|
||||
#: ../src/core/window-props.c:1481
|
||||
#: ../src/core/window-props.c:1484
|
||||
#, c-format
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
|
||||
#: ../src/core/window-props.c:1492
|
||||
#: ../src/core/window-props.c:1495
|
||||
#, c-format
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
@@ -347,118 +347,74 @@ msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:1
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "Modifier to use for extended window management operations"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:2
|
||||
msgid "This key will initiate the \"overlay\", which is a combination window overview and application launching system. The default is intended to be the \"Windows key\" on PC hardware. It's expected that this binding either the default or set to the empty string."
|
||||
msgstr "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."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:3
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Attach modal dialogs"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:2
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Cancel tab popup"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:3
|
||||
msgid "Determines whether hidden windows (i.e., minimized windows and windows on other workspaces than the current one) should be kept alive."
|
||||
msgstr "Determines whether hidden windows (i.e., minimized windows and windows on other workspaces than the current one) should be kept alive."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:4
|
||||
msgid "Determines whether the use of popup and highlight frame should be disabled for window cycling."
|
||||
msgstr "Determines whether the use of popup and highlight frame should be disabled for window cycling."
|
||||
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 "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."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:5
|
||||
msgid "Determines whether workspace switching should happen for windows on all monitors or only for windows on the primary monitor."
|
||||
msgstr "Determines whether workspace switching should happen for windows on all monitors or only for windows on the primary monitor."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:6
|
||||
msgid "Draggable border width"
|
||||
msgstr "Draggable border width"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:7
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr "Enable edge tiling when dropping windows on screen edges"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:8
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:6
|
||||
msgid "If enabled, dropping windows on vertical screen edges maximizes them vertically and resizes them horizontally to cover half of the available area. Dropping windows on the top screen edge maximizes them completely."
|
||||
msgstr "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."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:7
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Workspaces are managed dynamically"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:8
|
||||
msgid "Determines whether workspaces are managed dynamically or whether there's a static number of workspaces (determined by the num-workspaces key in org.gnome.desktop.wm.preferences)."
|
||||
msgstr "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)."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:9
|
||||
msgid "Live Hidden Windows"
|
||||
msgstr "Live Hidden Windows"
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Workspaces only on primary"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:10
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "Modifier to use for extended window management operations"
|
||||
msgid "Determines whether workspace switching should happen for windows on all monitors or only for windows on the primary monitor."
|
||||
msgstr "Determines whether workspace switching should happen for windows on all monitors or only for windows on the primary monitor."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:11
|
||||
msgid "No tab popup"
|
||||
msgstr "No tab popup"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:12
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Select window from tab popup"
|
||||
msgid "Determines whether the use of popup and highlight frame should be disabled for window cycling."
|
||||
msgstr "Determines whether the use of popup and highlight frame should be disabled for window cycling."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:13
|
||||
msgid "Draggable border width"
|
||||
msgstr "Draggable border width"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:14
|
||||
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 "The amount of total draggable borders. If the theme's visible borders are not enough, invisible borders will be added to meet this value."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:14
|
||||
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 "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."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:15
|
||||
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 "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."
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Select window from tab popup"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:16
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Workspaces only on primary"
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Cancel tab popup"
|
||||
|
||||
#: ../src/tools/mutter-message.c:123
|
||||
#, c-format
|
||||
msgid "Usage: %s\n"
|
||||
msgstr "שימוש: %s\n"
|
||||
|
||||
#: ../src/ui/frames.c:1157
|
||||
msgid "Close Window"
|
||||
msgstr "סגור חלון"
|
||||
|
||||
#: ../src/ui/frames.c:1160
|
||||
msgid "Window Menu"
|
||||
msgstr "תפריט חלון"
|
||||
|
||||
#: ../src/ui/frames.c:1163
|
||||
msgid "Minimize Window"
|
||||
msgstr "מזער חלון"
|
||||
|
||||
#: ../src/ui/frames.c:1166
|
||||
msgid "Maximize Window"
|
||||
msgstr "הגדל חלון"
|
||||
|
||||
#: ../src/ui/frames.c:1169
|
||||
msgid "Restore Window"
|
||||
msgstr "שחזר חלון"
|
||||
|
||||
#: ../src/ui/frames.c:1172
|
||||
msgid "Roll Up Window"
|
||||
msgstr "גלול חלון מעלה"
|
||||
|
||||
#: ../src/ui/frames.c:1175
|
||||
msgid "Unroll Window"
|
||||
msgstr "בטל גלילה"
|
||||
|
||||
#: ../src/ui/frames.c:1178
|
||||
msgid "Keep Window On Top"
|
||||
msgstr "שמור על החלון גלוי"
|
||||
|
||||
#: ../src/ui/frames.c:1181
|
||||
msgid "Remove Window From Top"
|
||||
msgstr "בטל שמירת החלון גלוי"
|
||||
|
||||
#: ../src/ui/frames.c:1184
|
||||
msgid "Always On Visible Workspace"
|
||||
msgstr "הראה בכל סביבות העבודה"
|
||||
|
||||
#: ../src/ui/frames.c:1187
|
||||
msgid "Put Window On Only One Workspace"
|
||||
msgstr "הראה את החלון על סביבת עבודה אחת בלבד"
|
||||
|
||||
#. Translators: Translate this string the same way as you do in libwnck!
|
||||
#: ../src/ui/menu.c:69
|
||||
msgid "Mi_nimize"
|
||||
@@ -659,247 +615,247 @@ msgstr "Mod5"
|
||||
msgid "%d x %d"
|
||||
msgstr "%d x %d"
|
||||
|
||||
#: ../src/ui/theme.c:253
|
||||
#: ../src/ui/theme.c:234
|
||||
msgid "top"
|
||||
msgstr "top"
|
||||
|
||||
#: ../src/ui/theme.c:255
|
||||
#: ../src/ui/theme.c:236
|
||||
msgid "bottom"
|
||||
msgstr "bottom"
|
||||
|
||||
#: ../src/ui/theme.c:257
|
||||
#: ../src/ui/theme.c:238
|
||||
msgid "left"
|
||||
msgstr "left"
|
||||
|
||||
#: ../src/ui/theme.c:259
|
||||
#: ../src/ui/theme.c:240
|
||||
msgid "right"
|
||||
msgstr "right"
|
||||
|
||||
#: ../src/ui/theme.c:286
|
||||
#: ../src/ui/theme.c:268
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify \"%s\" dimension"
|
||||
msgstr "frame geometry does not specify \"%s\" dimension"
|
||||
|
||||
#: ../src/ui/theme.c:305
|
||||
#: ../src/ui/theme.c:287
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
msgstr "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:342
|
||||
#: ../src/ui/theme.c:324
|
||||
#, c-format
|
||||
msgid "Button aspect ratio %g is not reasonable"
|
||||
msgstr "Button aspect ratio %g is not reasonable"
|
||||
|
||||
#: ../src/ui/theme.c:354
|
||||
#: ../src/ui/theme.c:336
|
||||
#, c-format
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "Frame geometry does not specify size of buttons"
|
||||
|
||||
#: ../src/ui/theme.c:1067
|
||||
#: ../src/ui/theme.c:1049
|
||||
#, c-format
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "Gradients should have at least two colors"
|
||||
|
||||
#: ../src/ui/theme.c:1219
|
||||
#: ../src/ui/theme.c:1201
|
||||
#, c-format
|
||||
msgid "GTK custom color specification must have color name and fallback in parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
||||
msgstr "GTK custom color specification must have color name and fallback in parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1235
|
||||
#: ../src/ui/theme.c:1217
|
||||
#, c-format
|
||||
msgid "Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-_ are valid"
|
||||
msgstr "Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-_ are valid"
|
||||
|
||||
#: ../src/ui/theme.c:1249
|
||||
#: ../src/ui/theme.c:1231
|
||||
#, c-format
|
||||
msgid "Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not fit the format"
|
||||
msgstr "Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not fit the format"
|
||||
|
||||
#: ../src/ui/theme.c:1294
|
||||
#: ../src/ui/theme.c:1276
|
||||
#, c-format
|
||||
msgid "GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
||||
msgstr "GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1308
|
||||
#: ../src/ui/theme.c:1290
|
||||
#, c-format
|
||||
msgid "GTK color specification must have a close bracket after the state, e.g. gtk:fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
||||
msgstr "GTK color specification must have a close bracket after the state, e.g. gtk:fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1319
|
||||
#: ../src/ui/theme.c:1301
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "Did not understand state \"%s\" in color specification"
|
||||
|
||||
#: ../src/ui/theme.c:1332
|
||||
#: ../src/ui/theme.c:1314
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr "Did not understand color component \"%s\" in color specification"
|
||||
|
||||
#: ../src/ui/theme.c:1361
|
||||
#: ../src/ui/theme.c:1343
|
||||
#, c-format
|
||||
msgid "Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the format"
|
||||
msgstr "Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the format"
|
||||
|
||||
#: ../src/ui/theme.c:1372
|
||||
#: ../src/ui/theme.c:1354
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "Could not parse alpha value \"%s\" in blended color"
|
||||
|
||||
#: ../src/ui/theme.c:1382
|
||||
#: ../src/ui/theme.c:1364
|
||||
#, c-format
|
||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
msgstr "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
|
||||
#: ../src/ui/theme.c:1429
|
||||
#: ../src/ui/theme.c:1411
|
||||
#, c-format
|
||||
msgid "Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
msgstr "Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
|
||||
#: ../src/ui/theme.c:1440
|
||||
#: ../src/ui/theme.c:1422
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr "Could not parse shade factor \"%s\" in shaded color"
|
||||
|
||||
#: ../src/ui/theme.c:1450
|
||||
#: ../src/ui/theme.c:1432
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "Shade factor \"%s\" in shaded color is negative"
|
||||
|
||||
#: ../src/ui/theme.c:1479
|
||||
#: ../src/ui/theme.c:1461
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "Could not parse color \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1790
|
||||
#: ../src/ui/theme.c:1778
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr "Coordinate expression contains character '%s' which is not allowed"
|
||||
|
||||
#: ../src/ui/theme.c:1817
|
||||
#: ../src/ui/theme.c:1805
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains floating point number '%s' which could not be parsed"
|
||||
msgstr "Coordinate expression contains floating point number '%s' which could not be parsed"
|
||||
|
||||
#: ../src/ui/theme.c:1831
|
||||
#: ../src/ui/theme.c:1819
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
|
||||
#: ../src/ui/theme.c:1953
|
||||
#: ../src/ui/theme.c:1940
|
||||
#, c-format
|
||||
msgid "Coordinate expression contained unknown operator at the start of this text: \"%s\""
|
||||
msgstr "Coordinate expression contained unknown operator at the start of this text: \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:2010
|
||||
#: ../src/ui/theme.c:1997
|
||||
#, c-format
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr "Coordinate expression was empty or not understood"
|
||||
|
||||
#: ../src/ui/theme.c:2121
|
||||
#: ../src/ui/theme.c:2131
|
||||
#: ../src/ui/theme.c:2165
|
||||
#: ../src/ui/theme.c:2110
|
||||
#: ../src/ui/theme.c:2120
|
||||
#: ../src/ui/theme.c:2154
|
||||
#, c-format
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "Coordinate expression results in division by zero"
|
||||
|
||||
#: ../src/ui/theme.c:2173
|
||||
#: ../src/ui/theme.c:2162
|
||||
#, c-format
|
||||
msgid "Coordinate expression tries to use mod operator on a floating-point number"
|
||||
msgstr "Coordinate expression tries to use mod operator on a floating-point number"
|
||||
|
||||
#: ../src/ui/theme.c:2229
|
||||
#: ../src/ui/theme.c:2218
|
||||
#, c-format
|
||||
msgid "Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
msgstr "Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
|
||||
#: ../src/ui/theme.c:2238
|
||||
#: ../src/ui/theme.c:2227
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr "Coordinate expression had an operand where an operator was expected"
|
||||
|
||||
#: ../src/ui/theme.c:2246
|
||||
#: ../src/ui/theme.c:2235
|
||||
#, c-format
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr "Coordinate expression ended with an operator instead of an operand"
|
||||
|
||||
#: ../src/ui/theme.c:2256
|
||||
#: ../src/ui/theme.c:2245
|
||||
#, c-format
|
||||
msgid "Coordinate expression has operator \"%c\" following operator \"%c\" with no operand in between"
|
||||
msgstr "Coordinate expression has operator \"%c\" following operator \"%c\" with no operand in between"
|
||||
|
||||
#: ../src/ui/theme.c:2407
|
||||
#: ../src/ui/theme.c:2452
|
||||
#: ../src/ui/theme.c:2396
|
||||
#: ../src/ui/theme.c:2441
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr "Coordinate expression had unknown variable or constant \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:2506
|
||||
#: ../src/ui/theme.c:2495
|
||||
#, c-format
|
||||
msgid "Coordinate expression parser overflowed its buffer."
|
||||
msgstr "Coordinate expression parser overflowed its buffer."
|
||||
|
||||
#: ../src/ui/theme.c:2535
|
||||
#: ../src/ui/theme.c:2524
|
||||
#, c-format
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
|
||||
#: ../src/ui/theme.c:2599
|
||||
#: ../src/ui/theme.c:2588
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
|
||||
#: ../src/ui/theme.c:2610
|
||||
#: ../src/ui/theme.c:2599
|
||||
#, c-format
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr "Coordinate expression doesn't seem to have any operators or operands"
|
||||
|
||||
#: ../src/ui/theme.c:2822
|
||||
#: ../src/ui/theme.c:2842
|
||||
#: ../src/ui/theme.c:2862
|
||||
#: ../src/ui/theme.c:2812
|
||||
#: ../src/ui/theme.c:2832
|
||||
#: ../src/ui/theme.c:2852
|
||||
#, c-format
|
||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||
msgstr "Theme contained an expression that resulted in an error: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:4533
|
||||
#: ../src/ui/theme.c:4498
|
||||
#, c-format
|
||||
msgid "<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be specified for this frame style"
|
||||
msgstr "<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be specified for this frame style"
|
||||
|
||||
#: ../src/ui/theme.c:5066
|
||||
#: ../src/ui/theme.c:5091
|
||||
#: ../src/ui/theme.c:5009
|
||||
#: ../src/ui/theme.c:5034
|
||||
#, c-format
|
||||
msgid "Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
msgstr "Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5139
|
||||
#: ../src/ui/theme.c:5082
|
||||
#, c-format
|
||||
msgid "Failed to load theme \"%s\": %s\n"
|
||||
msgstr "Failed to load theme \"%s\": %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:5275
|
||||
#: ../src/ui/theme.c:5282
|
||||
#: ../src/ui/theme.c:5289
|
||||
#: ../src/ui/theme.c:5296
|
||||
#: ../src/ui/theme.c:5303
|
||||
#: ../src/ui/theme.c:5218
|
||||
#: ../src/ui/theme.c:5225
|
||||
#: ../src/ui/theme.c:5232
|
||||
#: ../src/ui/theme.c:5239
|
||||
#: ../src/ui/theme.c:5246
|
||||
#, c-format
|
||||
msgid "No <%s> set for theme \"%s\""
|
||||
msgstr "No <%s> set for theme \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:5311
|
||||
#: ../src/ui/theme.c:5254
|
||||
#, c-format
|
||||
msgid "No frame style set for window type \"%s\" in theme \"%s\", add a <window type=\"%s\" style_set=\"whatever\"/> element"
|
||||
msgstr "No frame style set for window type \"%s\" in theme \"%s\", add a <window type=\"%s\" style_set=\"whatever\"/> element"
|
||||
|
||||
#: ../src/ui/theme.c:5709
|
||||
#: ../src/ui/theme.c:5771
|
||||
#: ../src/ui/theme.c:5834
|
||||
#: ../src/ui/theme.c:5650
|
||||
#: ../src/ui/theme.c:5712
|
||||
#: ../src/ui/theme.c:5775
|
||||
#, c-format
|
||||
msgid "User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
msgstr "User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
|
||||
#: ../src/ui/theme.c:5717
|
||||
#: ../src/ui/theme.c:5779
|
||||
#: ../src/ui/theme.c:5842
|
||||
#: ../src/ui/theme.c:5658
|
||||
#: ../src/ui/theme.c:5720
|
||||
#: ../src/ui/theme.c:5783
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "Constant \"%s\" has already been defined"
|
||||
@@ -1271,7 +1227,7 @@ msgstr "מלל לא מורשה בתג <%s>"
|
||||
msgid "<%s> specified twice for this theme"
|
||||
msgstr "<%s> צוין פעמיים עבור ערכת נושא זו"
|
||||
|
||||
#: ../src/ui/theme-parser.c:4348
|
||||
#: ../src/ui/theme-parser.c:4334
|
||||
#, c-format
|
||||
msgid "Failed to find a valid file for theme %s\n"
|
||||
msgstr "Failed to find a valid file for theme %s\n"
|
||||
@@ -1468,6 +1424,52 @@ msgstr "y value was %d, %d was expected"
|
||||
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||
msgstr "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||
|
||||
#~ msgid "Comma-separated list of compositor plugins"
|
||||
#~ msgstr "Comma-separated list of compositor plugins"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Determines whether hidden windows (i.e., minimized windows and windows on "
|
||||
#~ "other workspaces than the current one) should be kept alive."
|
||||
#~ msgstr ""
|
||||
#~ "Determines whether hidden windows (i.e., minimized windows and windows on "
|
||||
#~ "other workspaces than the current one) should be kept alive."
|
||||
|
||||
#~ msgid "Live Hidden Windows"
|
||||
#~ msgstr "Live Hidden Windows"
|
||||
|
||||
#~ msgid "Close Window"
|
||||
#~ msgstr "סגור חלון"
|
||||
|
||||
#~ msgid "Window Menu"
|
||||
#~ msgstr "תפריט חלון"
|
||||
|
||||
#~ msgid "Minimize Window"
|
||||
#~ msgstr "מזער חלון"
|
||||
|
||||
#~ msgid "Maximize Window"
|
||||
#~ msgstr "הגדל חלון"
|
||||
|
||||
#~ msgid "Restore Window"
|
||||
#~ msgstr "שחזר חלון"
|
||||
|
||||
#~ msgid "Roll Up Window"
|
||||
#~ msgstr "גלול חלון מעלה"
|
||||
|
||||
#~ msgid "Unroll Window"
|
||||
#~ msgstr "בטל גלילה"
|
||||
|
||||
#~ msgid "Keep Window On Top"
|
||||
#~ msgstr "שמור על החלון גלוי"
|
||||
|
||||
#~ msgid "Remove Window From Top"
|
||||
#~ msgstr "בטל שמירת החלון גלוי"
|
||||
|
||||
#~ msgid "Always On Visible Workspace"
|
||||
#~ msgstr "הראה בכל סביבות העבודה"
|
||||
|
||||
#~ msgid "Put Window On Only One Workspace"
|
||||
#~ msgstr "הראה את החלון על סביבת עבודה אחת בלבד"
|
||||
|
||||
#~ msgid "Switch to workspace 1"
|
||||
#~ msgstr "מעבר למרחב עבודה 1"
|
||||
|
||||
@@ -1771,9 +1773,6 @@ msgstr "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||
#~ msgid "Error setting clutter plugin list: %s\n"
|
||||
#~ msgstr "ארעה שגיאה בהגדרת רשימת התוספים של clutter: %s\n"
|
||||
|
||||
#~ msgid "Clutter Plugins"
|
||||
#~ msgstr "תוספי Clutter"
|
||||
|
||||
#~ msgid "Plugins to load for the Clutter-based compositing manager."
|
||||
#~ msgstr "Plugins to load for the Clutter-based compositing manager."
|
||||
|
||||
|
417
po/nb.po
417
po/nb.po
@@ -1,13 +1,13 @@
|
||||
# Norwegian (bokmål) translation of mutter.
|
||||
# Norwegian bokmål translation of mutter.
|
||||
# Copyright © 2002-2004 Free Software Foundation, Inc.
|
||||
# Kjartan Maraas <kmaraas@gnome.org>, 2002-2011.
|
||||
# Kjartan Maraas <kmaraas@gnome.org>, 2002-2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter 3.3.x\n"
|
||||
"Project-Id-Version: mutter 3.6.x\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-12-14 22:59+0100\n"
|
||||
"PO-Revision-Date: 2011-12-14 22:59+0100\n"
|
||||
"POT-Creation-Date: 2012-10-22 19:51+0200\n"
|
||||
"PO-Revision-Date: 2012-10-22 19:52+0200\n"
|
||||
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
||||
"Language-Team: Norwegian bokmål <i18n-no@lister.ping.uio.no>\n"
|
||||
"Language: \n"
|
||||
@@ -16,17 +16,17 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:1
|
||||
msgid "Windows"
|
||||
msgstr "Vinduer"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:2
|
||||
msgid "View split on left"
|
||||
msgstr "Visning delt til venstre"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:2
|
||||
#: ../src/50-mutter-windows.xml.in.h:3
|
||||
msgid "View split on right"
|
||||
msgstr "Visning delt til høyre"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:3
|
||||
msgid "Windows"
|
||||
msgstr "Vinduer"
|
||||
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#: ../src/compositor/compositor.c:492
|
||||
@@ -36,7 +36,7 @@ msgid ""
|
||||
"\"."
|
||||
msgstr "En annen compositing manager kjører skjerm %i på display «%s»."
|
||||
|
||||
#: ../src/core/bell.c:307
|
||||
#: ../src/core/bell.c:320
|
||||
msgid "Bell event"
|
||||
msgstr "Klokkehendelse"
|
||||
|
||||
@@ -47,14 +47,14 @@ msgstr "Ukjent forespørsel om vindusinformasjon: %d"
|
||||
|
||||
#: ../src/core/delete.c:111
|
||||
#, c-format
|
||||
msgid "<tt>%s</tt> is not responding."
|
||||
msgstr "<tt>%s</tt> svarer ikke."
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "«%s» svarer ikke."
|
||||
|
||||
#: ../src/core/delete.c:114
|
||||
#: ../src/core/delete.c:113
|
||||
msgid "Application is not responding."
|
||||
msgstr "Programmet svarer ikke."
|
||||
|
||||
#: ../src/core/delete.c:119
|
||||
#: ../src/core/delete.c:118
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
@@ -62,25 +62,25 @@ msgstr ""
|
||||
"Du kan velge å vente en kort stund for å se om det fortsetter eller tvinge "
|
||||
"programmet til å avslutte helt."
|
||||
|
||||
#: ../src/core/delete.c:126
|
||||
#: ../src/core/delete.c:125
|
||||
msgid "_Wait"
|
||||
msgstr "_Vent"
|
||||
|
||||
#: ../src/core/delete.c:126
|
||||
#: ../src/core/delete.c:125
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Tvungen nedstenging"
|
||||
|
||||
#: ../src/core/display.c:361
|
||||
#: ../src/core/display.c:396
|
||||
#, c-format
|
||||
msgid "Missing %s extension required for compositing"
|
||||
msgstr "Mangler utvidelsen %s som kreves for komposittfunksjon"
|
||||
|
||||
#: ../src/core/display.c:427
|
||||
#: ../src/core/display.c:493
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "Feil under åpning av X Window System skjerm «%s»\n"
|
||||
|
||||
#: ../src/core/keybindings.c:852
|
||||
#: ../src/core/keybindings.c:853
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Some other program is already using the key %s with modifiers %x as a "
|
||||
@@ -89,36 +89,36 @@ msgstr ""
|
||||
"Et annet program bruker allerede nøkkelen %s med modifikatorer %x som "
|
||||
"binding\n"
|
||||
|
||||
#: ../src/core/main.c:206
|
||||
#: ../src/core/main.c:196
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Deaktiver tilkobling til sesjonshåndtereren"
|
||||
|
||||
#: ../src/core/main.c:212
|
||||
#: ../src/core/main.c:202
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Erstatt kjørende vindushåndterer"
|
||||
|
||||
#: ../src/core/main.c:218
|
||||
#: ../src/core/main.c:208
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Oppgi sesjonshåndterings-ID"
|
||||
|
||||
#: ../src/core/main.c:223
|
||||
#: ../src/core/main.c:213
|
||||
msgid "X Display to use"
|
||||
msgstr "X-skjerm som skal brukes"
|
||||
|
||||
#: ../src/core/main.c:229
|
||||
#: ../src/core/main.c:219
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Initier sesjonen fra en lagret fil"
|
||||
|
||||
#: ../src/core/main.c:235
|
||||
#: ../src/core/main.c:225
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Gjør X-kall synkrone"
|
||||
|
||||
#: ../src/core/main.c:504
|
||||
#: ../src/core/main.c:494
|
||||
#, c-format
|
||||
msgid "Failed to scan themes directory: %s\n"
|
||||
msgstr "Feil under søk i temakatalog: %s\n"
|
||||
|
||||
#: ../src/core/main.c:520
|
||||
#: ../src/core/main.c:510
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||
@@ -126,7 +126,7 @@ msgstr ""
|
||||
"Kunne ikke finne et tema! Sjekk at %s eksisterer og inneholder de vanlige "
|
||||
"temaene.\n"
|
||||
|
||||
#: ../src/core/mutter.c:42
|
||||
#: ../src/core/mutter.c:40
|
||||
#, c-format
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
@@ -140,15 +140,15 @@ msgstr ""
|
||||
"Dette er fri programvare; se i kildekoden for kopibetingelser.\n"
|
||||
"Det gis INGEN garanti.\n"
|
||||
|
||||
#: ../src/core/mutter.c:56
|
||||
#: ../src/core/mutter.c:54
|
||||
msgid "Print version"
|
||||
msgstr "Skriv versjonsnummer"
|
||||
|
||||
#: ../src/core/mutter.c:62
|
||||
msgid "Comma-separated list of compositor plugins"
|
||||
msgstr "Kommaseparert liste av tillegg for compositor"
|
||||
#: ../src/core/mutter.c:60
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Mutter-tillegg som skal brukes"
|
||||
|
||||
#: ../src/core/prefs.c:1067
|
||||
#: ../src/core/prefs.c:1079
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
"behave properly.\n"
|
||||
@@ -156,12 +156,12 @@ msgstr ""
|
||||
"Funksjonalitet for å gå rundt ødelagte programmer er deaktivert. Noen "
|
||||
"programmer vil kanskje ikke oppføre seg korrekt.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1142
|
||||
#: ../src/core/prefs.c:1154
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||
msgstr "Kunne ikke tolke skriftbeskrivelsen «%s» fra GSettings-nøkkel %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:1208
|
||||
#: ../src/core/prefs.c:1220
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||
@@ -170,7 +170,7 @@ msgstr ""
|
||||
"«%s» funnet i konfigurasjonsdatabasen er ikke en gyldig verdi for endring av "
|
||||
"musknapp\n"
|
||||
|
||||
#: ../src/core/prefs.c:1720
|
||||
#: ../src/core/prefs.c:1747
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
@@ -179,17 +179,17 @@ msgstr ""
|
||||
"«%s» funnet i konfigurasjonsdatabasen er ikke en gyldig verdi for "
|
||||
"tastaturbinding «%s»\n"
|
||||
|
||||
#: ../src/core/prefs.c:1817
|
||||
#: ../src/core/prefs.c:1844
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Arbeidsområde %d"
|
||||
|
||||
#: ../src/core/screen.c:730
|
||||
#: ../src/core/screen.c:652
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "Skjerm %d på display «%s» er ugyldig\n"
|
||||
|
||||
#: ../src/core/screen.c:746
|
||||
#: ../src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||
@@ -198,19 +198,19 @@ msgstr ""
|
||||
"Skjerm %d på display «%s» har allerede en vindushåndterer; prøv å bruke "
|
||||
"flagget --replace for å erstatte aktiv vindushåndterer.\n"
|
||||
|
||||
#: ../src/core/screen.c:773
|
||||
#: ../src/core/screen.c:695
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
msgstr ""
|
||||
"Kunne ikke hente utvalg fra vinduhåndterer på skjerm %d, display «%s»\n"
|
||||
|
||||
#: ../src/core/screen.c:828
|
||||
#: ../src/core/screen.c:750
|
||||
#, c-format
|
||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||
msgstr "Skjerm %d på display «%s» har allerede en vinduhåndterer\n"
|
||||
|
||||
#: ../src/core/screen.c:1013
|
||||
#: ../src/core/screen.c:935
|
||||
#, c-format
|
||||
msgid "Could not release screen %d on display \"%s\"\n"
|
||||
msgstr "Kunne ikke slippe skjerm %d på display «%s»\n"
|
||||
@@ -270,44 +270,44 @@ msgstr ""
|
||||
"Disse vinduene støtter ikke "lagre aktiv konfigurasjon"og vil "
|
||||
"måtte startes på nytt manuelt neste gang du logger inn."
|
||||
|
||||
#: ../src/core/util.c:111
|
||||
#: ../src/core/util.c:80
|
||||
#, c-format
|
||||
msgid "Failed to open debug log: %s\n"
|
||||
msgstr "Feil under åpning av feilsøkingslogg: %s\n"
|
||||
|
||||
#: ../src/core/util.c:121
|
||||
#: ../src/core/util.c:90
|
||||
#, c-format
|
||||
msgid "Failed to fdopen() log file %s: %s\n"
|
||||
msgstr "Feil under fdopen() av loggfil %s: %s\n"
|
||||
|
||||
#: ../src/core/util.c:127
|
||||
#: ../src/core/util.c:96
|
||||
#, c-format
|
||||
msgid "Opened log file %s\n"
|
||||
msgstr "Åpnet loggfil %s\n"
|
||||
|
||||
#: ../src/core/util.c:146 ../src/tools/mutter-message.c:149
|
||||
#: ../src/core/util.c:115 ../src/tools/mutter-message.c:149
|
||||
#, c-format
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutter er kompilert uten støtte for «verbose» modus\n"
|
||||
|
||||
#: ../src/core/util.c:290
|
||||
#: ../src/core/util.c:259
|
||||
msgid "Window manager: "
|
||||
msgstr "Vindushåndterer: "
|
||||
|
||||
#: ../src/core/util.c:438
|
||||
#: ../src/core/util.c:407
|
||||
msgid "Bug in window manager: "
|
||||
msgstr "Feil i vindushåndterer: "
|
||||
|
||||
#: ../src/core/util.c:471
|
||||
#: ../src/core/util.c:438
|
||||
msgid "Window manager warning: "
|
||||
msgstr "Advarsel fra vindushåndterer: "
|
||||
|
||||
#: ../src/core/util.c:499
|
||||
#: ../src/core/util.c:466
|
||||
msgid "Window manager error: "
|
||||
msgstr "Feil i vindushåndterer: "
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:7141
|
||||
#: ../src/core/window.c:7237
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||
@@ -323,7 +323,7 @@ msgstr ""
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7804
|
||||
#: ../src/core/window.c:7902
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||
@@ -333,22 +333,22 @@ msgstr ""
|
||||
"men setter minste størrelse %d x %d og maks størrelse %d x %d; dette virker "
|
||||
"ikke fornuftig.\n"
|
||||
|
||||
#: ../src/core/window-props.c:309
|
||||
#: ../src/core/window-props.c:274
|
||||
#, c-format
|
||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||
msgstr "Programmet satte en feil _NET_WM_PID %lu\n"
|
||||
|
||||
#: ../src/core/window-props.c:426
|
||||
#: ../src/core/window-props.c:393
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (på %s)"
|
||||
|
||||
#: ../src/core/window-props.c:1481
|
||||
#: ../src/core/window-props.c:1448
|
||||
#, c-format
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr "Ugyldig WM_TRANSIENT_FOR vindu 0x%lx oppgitt for %s.\n"
|
||||
|
||||
#: ../src/core/window-props.c:1492
|
||||
#: ../src/core/window-props.c:1459
|
||||
#, c-format
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr "WM_TRANSIENT_FOR vindu 0x%lx for %s ville skapt en løkke.\n"
|
||||
@@ -386,81 +386,10 @@ msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:1
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Fest modale dialoger"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:2
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Avbryt tabulatordialog"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:3
|
||||
msgid ""
|
||||
"Determines whether hidden windows (i.e., minimized windows and windows on "
|
||||
"other workspaces than the current one) should be kept alive."
|
||||
msgstr ""
|
||||
"Bestemmer om skjulte vinduer, f.eks minimerte vinduer og vinduer på andre "
|
||||
"arbeidsområder enn aktivt arbeidsområde, skal holdes i live."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"Determines whether the use of popup and highlight frame should be disabled "
|
||||
"for window cycling."
|
||||
msgstr ""
|
||||
"Bestemmer om bruk av dialog og uthevingsramme skal slås av for bytting "
|
||||
"mellom vinduer."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:5
|
||||
msgid ""
|
||||
"Determines whether workspace switching should happen for windows on all "
|
||||
"monitors or only for windows on the primary monitor."
|
||||
msgstr ""
|
||||
"Bestemmer om bytting mellom arbeidsområder skal skje for vinduer på alle "
|
||||
"skjermer eller kun på primær skjerm."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:6
|
||||
msgid "Draggable border width"
|
||||
msgstr "Bredde på drakant"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:7
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr "Slå på kantflising ved slipp av vinduer på skjermkantene"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:8
|
||||
msgid ""
|
||||
"If enabled, dropping windows on vertical screen edges maximizes them "
|
||||
"vertically and resizes them horizontally to cover half of the available "
|
||||
"area. Dropping windows on the top screen edge maximizes them completely."
|
||||
msgstr ""
|
||||
"Maksimerer vinduer vertikalt og endrer størrelse horisontalt slik at de "
|
||||
"dekker halve det tilgjengeligeområdet hvis de slippes på vertikale "
|
||||
"skjermkanter. Hvis vindu slippes på øverste kant av skjermen maksimeres de "
|
||||
"fullstendig."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:9
|
||||
msgid "Live Hidden Windows"
|
||||
msgstr "Levende skjulte vinduer"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:10
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "Endringstast som skal brukes for utvidede vindushåndteringsoperasjoner"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:11
|
||||
msgid "No tab popup"
|
||||
msgstr "Ingen tabulatordialog"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:12
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Fjern vindu fra tabulatordialog"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:13
|
||||
msgid ""
|
||||
"The amount of total draggable borders. If the theme's visible borders are "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
msgstr ""
|
||||
"Total mengde med drakant. Hvis temas synlige kanter ikke er nok vil usynlige "
|
||||
"kanter legges til for å imøtekomme denne verdien."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:14
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"This key will initiate the \"overlay\", which is a combination window "
|
||||
"overview and application launching system. The default is intended to be the "
|
||||
@@ -472,7 +401,11 @@ msgstr ""
|
||||
"tasten» på PC-maskinvare. Det forventes at denne bindingen er satt til "
|
||||
"forvalg eller en tom streng."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:15
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:3
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Fest modale dialoger"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
@@ -482,59 +415,95 @@ msgstr ""
|
||||
"tittellinjen på opphavsvinduet og flyttes sammen med dette i stedet for å ha "
|
||||
"individuelle tittellinjer."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:16
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:5
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr "Slå på kantflising ved slipp av vinduer på skjermkantene"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"If enabled, dropping windows on vertical screen edges maximizes them "
|
||||
"vertically and resizes them horizontally to cover half of the available "
|
||||
"area. Dropping windows on the top screen edge maximizes them completely."
|
||||
msgstr ""
|
||||
"Maksimerer vinduer vertikalt og endrer størrelse horisontalt slik at de "
|
||||
"dekker halve det tilgjengeligeområdet hvis de slippes på vertikale "
|
||||
"skjermkanter. Hvis vindu slippes på øverste kant av skjermen maksimeres de "
|
||||
"fullstendig."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:7
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Arbeidsområder håndteres dynamisk"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:8
|
||||
msgid ""
|
||||
"Determines whether workspaces are managed dynamically or whether there's a "
|
||||
"static number of workspaces (determined by the num-workspaces key in org."
|
||||
"gnome.desktop.wm.preferences)."
|
||||
msgstr ""
|
||||
"Bestemmer om arbeidsområder skal håndteres dynamisk eller om det er et fast "
|
||||
"antall arbeidsområder (bestemt av num-workspaces nøkkelen i org.gnome."
|
||||
"desktop.wm.preferences)."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:9
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Arbeidsområder kun på primær skjerm"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"Determines whether workspace switching should happen for windows on all "
|
||||
"monitors or only for windows on the primary monitor."
|
||||
msgstr ""
|
||||
"Bestemmer om bytting mellom arbeidsområder skal skje for vinduer på alle "
|
||||
"skjermer eller kun på primær skjerm."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:11
|
||||
msgid "No tab popup"
|
||||
msgstr "Ingen tabulatordialog"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:12
|
||||
msgid ""
|
||||
"Determines whether the use of popup and highlight frame should be disabled "
|
||||
"for window cycling."
|
||||
msgstr ""
|
||||
"Bestemmer om bruk av dialog og uthevingsramme skal slås av for bytting "
|
||||
"mellom vinduer."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:13
|
||||
msgid "Delay focus changes until the pointer stops moving"
|
||||
msgstr "Utsett fokusendringer til pekeren slutter å bevege seg"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:14
|
||||
msgid ""
|
||||
"If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
|
||||
"the focus will not be changed immediately when entering a window, but only "
|
||||
"after the pointer stops moving."
|
||||
msgstr ""
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:15
|
||||
msgid "Draggable border width"
|
||||
msgstr "Bredde på drakant"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:16
|
||||
msgid ""
|
||||
"The amount of total draggable borders. If the theme's visible borders are "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
msgstr ""
|
||||
"Total mengde med drakant. Hvis temas synlige kanter ikke er nok vil usynlige "
|
||||
"kanter legges til for å imøtekomme denne verdien."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:17
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Fjern vindu fra tabulatordialog"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:18
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Avbryt tabulatordialog"
|
||||
|
||||
#: ../src/tools/mutter-message.c:123
|
||||
#, c-format
|
||||
msgid "Usage: %s\n"
|
||||
msgstr " Bruk: %s\n"
|
||||
|
||||
#: ../src/ui/frames.c:1157
|
||||
msgid "Close Window"
|
||||
msgstr "Lukk vindu"
|
||||
|
||||
#: ../src/ui/frames.c:1160
|
||||
msgid "Window Menu"
|
||||
msgstr "Vindumeny"
|
||||
|
||||
#: ../src/ui/frames.c:1163
|
||||
msgid "Minimize Window"
|
||||
msgstr "Minimer vindu"
|
||||
|
||||
#: ../src/ui/frames.c:1166
|
||||
msgid "Maximize Window"
|
||||
msgstr "Maksimer vindu"
|
||||
|
||||
#: ../src/ui/frames.c:1169
|
||||
msgid "Restore Window"
|
||||
msgstr "Gjenopprett vindu"
|
||||
|
||||
#: ../src/ui/frames.c:1172
|
||||
msgid "Roll Up Window"
|
||||
msgstr "Rull opp vindu"
|
||||
|
||||
#: ../src/ui/frames.c:1175
|
||||
msgid "Unroll Window"
|
||||
msgstr "Rull ned vindu"
|
||||
|
||||
#: ../src/ui/frames.c:1178
|
||||
msgid "Keep Window On Top"
|
||||
msgstr "Plasser vindu i forgrunnen"
|
||||
|
||||
#: ../src/ui/frames.c:1181
|
||||
msgid "Remove Window From Top"
|
||||
msgstr "Fjern vindu fra forgrunnen"
|
||||
|
||||
#: ../src/ui/frames.c:1184
|
||||
msgid "Always On Visible Workspace"
|
||||
msgstr "Alltid på synlig arbeidsområde"
|
||||
|
||||
#: ../src/ui/frames.c:1187
|
||||
msgid "Put Window On Only One Workspace"
|
||||
msgstr "Plasser vindu kun på ett arbeidsområde"
|
||||
|
||||
#. Translators: Translate this string the same way as you do in libwnck!
|
||||
#: ../src/ui/menu.c:69
|
||||
msgid "Mi_nimize"
|
||||
@@ -734,48 +703,48 @@ msgstr "Mod5"
|
||||
msgid "%d x %d"
|
||||
msgstr "%d x %d"
|
||||
|
||||
#: ../src/ui/theme.c:253
|
||||
#: ../src/ui/theme.c:234
|
||||
msgid "top"
|
||||
msgstr "topp"
|
||||
|
||||
#: ../src/ui/theme.c:255
|
||||
#: ../src/ui/theme.c:236
|
||||
msgid "bottom"
|
||||
msgstr "bunn"
|
||||
|
||||
#: ../src/ui/theme.c:257
|
||||
#: ../src/ui/theme.c:238
|
||||
msgid "left"
|
||||
msgstr "venstre"
|
||||
|
||||
#: ../src/ui/theme.c:259
|
||||
#: ../src/ui/theme.c:240
|
||||
msgid "right"
|
||||
msgstr "høyre"
|
||||
|
||||
#: ../src/ui/theme.c:286
|
||||
#: ../src/ui/theme.c:268
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify \"%s\" dimension"
|
||||
msgstr "rammegeometrien spesifiserer ikke «%s»-dimensjon"
|
||||
|
||||
#: ../src/ui/theme.c:305
|
||||
#: ../src/ui/theme.c:287
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
msgstr "rammegeometri spesifiserer ikke dimensjon «%s» for kant «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:342
|
||||
#: ../src/ui/theme.c:324
|
||||
#, c-format
|
||||
msgid "Button aspect ratio %g is not reasonable"
|
||||
msgstr "Aspektrate %g for knapp er ikke fornuftig"
|
||||
|
||||
#: ../src/ui/theme.c:354
|
||||
#: ../src/ui/theme.c:336
|
||||
#, c-format
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "Rammegeometrien spesifiserer ikke størrelse på knapper"
|
||||
|
||||
#: ../src/ui/theme.c:1067
|
||||
#: ../src/ui/theme.c:1049
|
||||
#, c-format
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "Gradienter må ha minst to farger"
|
||||
|
||||
#: ../src/ui/theme.c:1219
|
||||
#: ../src/ui/theme.c:1201
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK custom color specification must have color name and fallback in "
|
||||
@@ -784,7 +753,7 @@ msgstr ""
|
||||
"Egendefinert GTK-fargespesifikasjon må ha fargenavn og reserve i parantes, f."
|
||||
"eks gtk:custom(foo,bar); kunne ikke lese «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:1235
|
||||
#: ../src/ui/theme.c:1217
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||
@@ -793,7 +762,7 @@ msgstr ""
|
||||
"Ugyldig tegn «%c» i parameter color_name for gtk:custom, kun A-Za-z0-9-_ er "
|
||||
"gyldig"
|
||||
|
||||
#: ../src/ui/theme.c:1249
|
||||
#: ../src/ui/theme.c:1231
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
@@ -802,7 +771,7 @@ msgstr ""
|
||||
"Gtk:custom-format er «gtk:custom(color_name,fallback)», «%s» passer ikke i "
|
||||
"formatet"
|
||||
|
||||
#: ../src/ui/theme.c:1294
|
||||
#: ../src/ui/theme.c:1276
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
@@ -811,7 +780,7 @@ msgstr ""
|
||||
"GTK-fargespesifikasjon må ha tilstand i klammer, f.eks. gtk:fg[NORMAL], hvor "
|
||||
"NORMAL er tilstanden; kunne ikke lese «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:1308
|
||||
#: ../src/ui/theme.c:1290
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||
@@ -820,17 +789,17 @@ msgstr ""
|
||||
"GTK-fargespesifikasjon må ha en avsluttende klamme etter tilstanden, f.eks. "
|
||||
"gtk:fg[NORMAL], hvor NORMAL er tilstanden; kunne ikke lese «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:1319
|
||||
#: ../src/ui/theme.c:1301
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "Forsto ikke tilstand «%s» i fargespesifikasjonen"
|
||||
|
||||
#: ../src/ui/theme.c:1332
|
||||
#: ../src/ui/theme.c:1314
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr "Forsto ikke fargekomponent «%s» i fargespesifikasjonen"
|
||||
|
||||
#: ../src/ui/theme.c:1361
|
||||
#: ../src/ui/theme.c:1343
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||
@@ -839,56 +808,56 @@ msgstr ""
|
||||
"Blandingsformat er «blend/bg_color/fg_color/alpha», «%s» passer ikke i "
|
||||
"formatet"
|
||||
|
||||
#: ../src/ui/theme.c:1372
|
||||
#: ../src/ui/theme.c:1354
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "Kunne ikke lese alpha-verdi «%s» i blandet farge"
|
||||
|
||||
#: ../src/ui/theme.c:1382
|
||||
#: ../src/ui/theme.c:1364
|
||||
#, c-format
|
||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
msgstr "Alpha-verdi «%s» i blandet farge er ikke mellom 0.0 og 1.0"
|
||||
|
||||
#: ../src/ui/theme.c:1429
|
||||
#: ../src/ui/theme.c:1411
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
msgstr ""
|
||||
"Skyggeformatet er «shade/base_color/factor», «%s» passer ikke i formatet"
|
||||
|
||||
#: ../src/ui/theme.c:1440
|
||||
#: ../src/ui/theme.c:1422
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr "Kunne ikke lese skyggefaktor «%s» i skyggelagt farge"
|
||||
|
||||
#: ../src/ui/theme.c:1450
|
||||
#: ../src/ui/theme.c:1432
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "Skyggefaktor «%s» i skyggelagt farge er negativ"
|
||||
|
||||
#: ../src/ui/theme.c:1479
|
||||
#: ../src/ui/theme.c:1461
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "Kunne ikke lese farge «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:1790
|
||||
#: ../src/ui/theme.c:1778
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr "Koordinatuttrykk inneholder tegn «%s» som ikke er tillatt"
|
||||
|
||||
#: ../src/ui/theme.c:1817
|
||||
#: ../src/ui/theme.c:1805
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contains floating point number '%s' which could not be "
|
||||
"parsed"
|
||||
msgstr "Koordinatuttrykk inneholder flyttall «%s» som ikke kunne tolkes"
|
||||
|
||||
#: ../src/ui/theme.c:1831
|
||||
#: ../src/ui/theme.c:1819
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr "Koordinatuttrykk inneholder heltall «%s» som ikke kunne tolkes"
|
||||
|
||||
#: ../src/ui/theme.c:1953
|
||||
#: ../src/ui/theme.c:1940
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contained unknown operator at the start of this text: "
|
||||
@@ -897,39 +866,39 @@ msgstr ""
|
||||
"Koordinatuttrykket inneholdt en ukjent operator ved begynnelsen av denne "
|
||||
"teksten: «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:2010
|
||||
#: ../src/ui/theme.c:1997
|
||||
#, c-format
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr "Koordinatuttrykket var tomt eller ble ikke forstått"
|
||||
|
||||
#: ../src/ui/theme.c:2121 ../src/ui/theme.c:2131 ../src/ui/theme.c:2165
|
||||
#: ../src/ui/theme.c:2110 ../src/ui/theme.c:2120 ../src/ui/theme.c:2154
|
||||
#, c-format
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "Koordinatuttrykket resulterer i divisjon med null"
|
||||
|
||||
#: ../src/ui/theme.c:2173
|
||||
#: ../src/ui/theme.c:2162
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||
msgstr "Koordinatuttrykket prøver å bruke mod-operator på et flyttall"
|
||||
|
||||
#: ../src/ui/theme.c:2229
|
||||
#: ../src/ui/theme.c:2218
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
msgstr "Koordinatuttrykket har en operator «%s» hvor en operand var ventet"
|
||||
|
||||
#: ../src/ui/theme.c:2238
|
||||
#: ../src/ui/theme.c:2227
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr "Koordinatuttrykket hadde en operand hvor en operator var ventet"
|
||||
|
||||
#: ../src/ui/theme.c:2246
|
||||
#: ../src/ui/theme.c:2235
|
||||
#, c-format
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr "Koordinatuttrykket sluttet med en operator i stedet for en operand"
|
||||
|
||||
#: ../src/ui/theme.c:2256
|
||||
#: ../src/ui/theme.c:2245
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||
@@ -938,38 +907,38 @@ msgstr ""
|
||||
"Koordinatuttrykket har en operator «%c» etter en operator «%c» og ingen "
|
||||
"operand mellom dem."
|
||||
|
||||
#: ../src/ui/theme.c:2407 ../src/ui/theme.c:2452
|
||||
#: ../src/ui/theme.c:2396 ../src/ui/theme.c:2441
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr "Koordinatuttrykket haddeen ukjent variabel eller konstant «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:2506
|
||||
#: ../src/ui/theme.c:2495
|
||||
#, c-format
|
||||
msgid "Coordinate expression parser overflowed its buffer."
|
||||
msgstr "Tolkeren for koordinatuttrykk oversteg buffergrensen."
|
||||
|
||||
#: ../src/ui/theme.c:2535
|
||||
#: ../src/ui/theme.c:2524
|
||||
#, c-format
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr "Koordinatuttrykket hadde en parantes slutt uten parantes start"
|
||||
|
||||
#: ../src/ui/theme.c:2599
|
||||
#: ../src/ui/theme.c:2588
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr "Koordinatuttrykket hadde en åpen parantes uten en avsluttende parantes"
|
||||
|
||||
#: ../src/ui/theme.c:2610
|
||||
#: ../src/ui/theme.c:2599
|
||||
#, c-format
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr ""
|
||||
"Koordinatuttrykket ser ikke ut til å ha noen operatorer eller operander"
|
||||
|
||||
#: ../src/ui/theme.c:2822 ../src/ui/theme.c:2842 ../src/ui/theme.c:2862
|
||||
#: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852
|
||||
#, c-format
|
||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||
msgstr "Tema inneholdt et uttrykk som resulterte i en feil: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:4533
|
||||
#: ../src/ui/theme.c:4498
|
||||
#, c-format
|
||||
msgid ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||
@@ -978,25 +947,25 @@ msgstr ""
|
||||
"<button function=«%s» state=«%s» draw_ops=«ett-eller-annet»/> må "
|
||||
"spesifiseres for denne rammestilen"
|
||||
|
||||
#: ../src/ui/theme.c:5066 ../src/ui/theme.c:5091
|
||||
#: ../src/ui/theme.c:5009 ../src/ui/theme.c:5034
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
msgstr ""
|
||||
"Mangler <frame state=«%s» resize=«%s» focus=«%s» stil=«ett-eller-annet»/>"
|
||||
|
||||
#: ../src/ui/theme.c:5139
|
||||
#: ../src/ui/theme.c:5082
|
||||
#, c-format
|
||||
msgid "Failed to load theme \"%s\": %s\n"
|
||||
msgstr "Klarte ikke å laste tema «%s»: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:5275 ../src/ui/theme.c:5282 ../src/ui/theme.c:5289
|
||||
#: ../src/ui/theme.c:5296 ../src/ui/theme.c:5303
|
||||
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
|
||||
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
|
||||
#, c-format
|
||||
msgid "No <%s> set for theme \"%s\""
|
||||
msgstr "<%s> er ikke satt for tema «%s»"
|
||||
|
||||
#: ../src/ui/theme.c:5311
|
||||
#: ../src/ui/theme.c:5254
|
||||
#, c-format
|
||||
msgid ""
|
||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||
@@ -1005,14 +974,14 @@ msgstr ""
|
||||
"Ingen rammestil satt for vindutype «%s» i tema «%s», legg til et <window "
|
||||
"type=«%s» style_set=«ett-eller-annet»/>-element"
|
||||
|
||||
#: ../src/ui/theme.c:5709 ../src/ui/theme.c:5771 ../src/ui/theme.c:5834
|
||||
#: ../src/ui/theme.c:5650 ../src/ui/theme.c:5712 ../src/ui/theme.c:5775
|
||||
#, c-format
|
||||
msgid ""
|
||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
msgstr ""
|
||||
"Brukerdefinerte konstanter må begynne med stor bokstav; «%s» gjør ikke det"
|
||||
|
||||
#: ../src/ui/theme.c:5717 ../src/ui/theme.c:5779 ../src/ui/theme.c:5842
|
||||
#: ../src/ui/theme.c:5658 ../src/ui/theme.c:5720 ../src/ui/theme.c:5783
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "Konstant «%s» er allerede definert"
|
||||
@@ -1393,7 +1362,7 @@ msgstr "Ingen tekst er tillatt inne i element <%s>"
|
||||
msgid "<%s> specified twice for this theme"
|
||||
msgstr "<%s> spesifisert to ganger for dette temaet"
|
||||
|
||||
#: ../src/ui/theme-parser.c:4348
|
||||
#: ../src/ui/theme-parser.c:4334
|
||||
#, c-format
|
||||
msgid "Failed to find a valid file for theme %s\n"
|
||||
msgstr "Fant ikke en gyldig fil for tema %s\n"
|
||||
|
1263
po/pt_BR.po
1263
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
442
po/sl.po
442
po/sl.po
@@ -4,14 +4,14 @@
|
||||
#
|
||||
# Andraž Tori <andraz.tori1@guest.arnes.si>, 2000.
|
||||
# Matjaž Horvat <m@owca.info>, 2006.
|
||||
# Matej Urbančič <mateju@svn.gnome.org>, 2007 - 2011.
|
||||
# Matej Urbančič <mateju@svn.gnome.org>, 2007 - 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2011-12-16 13:21+0000\n"
|
||||
"PO-Revision-Date: 2011-12-16 21:47+0100\n"
|
||||
"POT-Creation-Date: 2012-10-16 12:48+0000\n"
|
||||
"PO-Revision-Date: 2012-10-16 14:57+0100\n"
|
||||
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
|
||||
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
|
||||
"Language: \n"
|
||||
@@ -24,17 +24,17 @@ msgstr ""
|
||||
"X-Poedit-SourceCharset: utf-8\n"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:1
|
||||
msgid "Windows"
|
||||
msgstr "Okna"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:2
|
||||
msgid "View split on left"
|
||||
msgstr "Poglej razdelek na levi"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:2
|
||||
#: ../src/50-mutter-windows.xml.in.h:3
|
||||
msgid "View split on right"
|
||||
msgstr "Poglej razdelek na desni"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:3
|
||||
msgid "Windows"
|
||||
msgstr "Okna"
|
||||
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#: ../src/compositor/compositor.c:492
|
||||
@@ -42,7 +42,7 @@ msgstr "Okna"
|
||||
msgid "Another compositing manager is already running on screen %i on display \"%s\"."
|
||||
msgstr "Drug upravljalnik sestavljanja je že zagnan na zaslonu %i prikaza \"%s\"."
|
||||
|
||||
#: ../src/core/bell.c:307
|
||||
#: ../src/core/bell.c:320
|
||||
msgid "Bell event"
|
||||
msgstr "Dogodek zvonjenja"
|
||||
|
||||
@@ -53,71 +53,71 @@ msgstr "Zahteva izpisa podrobnosti neznanega okna: %d"
|
||||
|
||||
#: ../src/core/delete.c:111
|
||||
#, c-format
|
||||
msgid "<tt>%s</tt> is not responding."
|
||||
msgstr "<tt>%s</tt> se ne odziva."
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "“%s” se ne odziva."
|
||||
|
||||
#: ../src/core/delete.c:114
|
||||
#: ../src/core/delete.c:113
|
||||
msgid "Application is not responding."
|
||||
msgstr "Program se ne odziva."
|
||||
|
||||
#: ../src/core/delete.c:119
|
||||
#: ../src/core/delete.c:118
|
||||
msgid "You may choose to wait a short while for it to continue or force the application to quit entirely."
|
||||
msgstr "Lahko še malo počakate, če program morda spet začne delovati, ali pa vsilite končanje delovanja."
|
||||
|
||||
#: ../src/core/delete.c:126
|
||||
#: ../src/core/delete.c:125
|
||||
msgid "_Wait"
|
||||
msgstr "_Počakaj"
|
||||
|
||||
#: ../src/core/delete.c:126
|
||||
#: ../src/core/delete.c:125
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Vsili konec"
|
||||
|
||||
#: ../src/core/display.c:361
|
||||
#: ../src/core/display.c:396
|
||||
#, c-format
|
||||
msgid "Missing %s extension required for compositing"
|
||||
msgstr "Manjka razširitev %s, ki je ključna za sestavljanje"
|
||||
|
||||
#: ../src/core/display.c:427
|
||||
#: ../src/core/display.c:493
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "Ni mogoče odpreti zaslona '%s' okenskega sistema X\n"
|
||||
|
||||
# G:1 K:0 O:0
|
||||
#: ../src/core/keybindings.c:852
|
||||
#: ../src/core/keybindings.c:853
|
||||
#, c-format
|
||||
msgid "Some other program is already using the key %s with modifiers %x as a binding\n"
|
||||
msgstr "Tipko %s s spremenilnikom %x uporablja že nek drug program\n"
|
||||
|
||||
#: ../src/core/main.c:206
|
||||
#: ../src/core/main.c:196
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Onemogoči povezavo z upravljalnikom sej"
|
||||
|
||||
#: ../src/core/main.c:212
|
||||
#: ../src/core/main.c:202
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Zamenjaj trenutni upravljalnik oken"
|
||||
|
||||
#: ../src/core/main.c:218
|
||||
#: ../src/core/main.c:208
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Navedite ID upravljanja seje"
|
||||
|
||||
#: ../src/core/main.c:223
|
||||
#: ../src/core/main.c:213
|
||||
msgid "X Display to use"
|
||||
msgstr "Zaslon X za uporabo"
|
||||
|
||||
#: ../src/core/main.c:229
|
||||
#: ../src/core/main.c:219
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Začni sejo iz shranjene datoteke"
|
||||
|
||||
#: ../src/core/main.c:235
|
||||
#: ../src/core/main.c:225
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Uskladi klice X"
|
||||
|
||||
#: ../src/core/main.c:504
|
||||
#: ../src/core/main.c:494
|
||||
#, c-format
|
||||
msgid "Failed to scan themes directory: %s\n"
|
||||
msgstr "Ni mogoče preiskati mape tem: %s\n"
|
||||
|
||||
#: ../src/core/main.c:520
|
||||
#: ../src/core/main.c:510
|
||||
#, c-format
|
||||
msgid "Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||
msgstr "Ni mogoče najti teme! Prepričajte se, da %s obstaja in vsebuje običajni zapis teme.\n"
|
||||
@@ -140,55 +140,55 @@ msgid "Print version"
|
||||
msgstr "Izpiši različico"
|
||||
|
||||
#: ../src/core/mutter.c:60
|
||||
msgid "Comma-separated list of compositor plugins"
|
||||
msgstr "Z vejico ločen seznam vstavkov sestavljanja"
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Vstavek Mutter za uporabo"
|
||||
|
||||
#: ../src/core/prefs.c:1067
|
||||
#: ../src/core/prefs.c:1079
|
||||
msgid "Workarounds for broken applications disabled. Some applications may not behave properly.\n"
|
||||
msgstr "Obhodi za pokvarjene programe so onemogočeni. Nekateri programi se morda ne bodo odzivali na pričakovan način.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1142
|
||||
#: ../src/core/prefs.c:1154
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||
msgstr "Ni mogoče razčleniti opisa pisave \"%s\" iz ključa GSettings %s\n"
|
||||
|
||||
#: ../src/core/prefs.c:1208
|
||||
#: ../src/core/prefs.c:1220
|
||||
#, c-format
|
||||
msgid "\"%s\" found in configuration database is not a valid value for mouse button modifier\n"
|
||||
msgstr "\"%s\", najden v podatkovni zbirki nastavitev, ni veljaven spremenilnik za miškine gumbe.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1720
|
||||
#: ../src/core/prefs.c:1747
|
||||
#, c-format
|
||||
msgid "\"%s\" found in configuration database is not a valid value for keybinding \"%s\"\n"
|
||||
msgstr "\"%s\", najden v podatkovni zbirki nastavitev, ni veljaven ključ za tipkovno bližnjico \"%s\"\n"
|
||||
|
||||
# G:1 K:0 O:0
|
||||
#: ../src/core/prefs.c:1817
|
||||
#: ../src/core/prefs.c:1844
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Delovna površina %d"
|
||||
|
||||
#: ../src/core/screen.c:730
|
||||
#: ../src/core/screen.c:652
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "Zaslon %d na prikazu '%s' ni veljaven\n"
|
||||
|
||||
#: ../src/core/screen.c:746
|
||||
#: ../src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid "Screen %d on display \"%s\" already has a window manager; try using the --replace option to replace the current window manager.\n"
|
||||
msgstr "Zaslon %d na prikazu \"%s\" je že upravljan z upravljalnikom oken; poskušajte uporabiti možnost --replace za zamenjavo trenutnega.\n"
|
||||
|
||||
#: ../src/core/screen.c:773
|
||||
#: ../src/core/screen.c:695
|
||||
#, c-format
|
||||
msgid "Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
msgstr "Ni mogoče dobiti izbire upravljalnika oken na zaslonu %d prikaza \"%s\"\n"
|
||||
|
||||
#: ../src/core/screen.c:828
|
||||
#: ../src/core/screen.c:750
|
||||
#, c-format
|
||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||
msgstr "Zaslon %d na prikazu \"%s\" je že upravljan z upravljalnikom oken\n"
|
||||
|
||||
#: ../src/core/screen.c:1013
|
||||
#: ../src/core/screen.c:935
|
||||
#, c-format
|
||||
msgid "Could not release screen %d on display \"%s\"\n"
|
||||
msgstr "Ni mogoče opustiti zaslona %d na prikazu \"%s\"\n"
|
||||
@@ -249,46 +249,46 @@ msgstr "Neznan predmet %s"
|
||||
msgid "These windows do not support "save current setup" and will have to be restarted manually next time you log in."
|
||||
msgstr "Ta okna ne podpirajo možnosti "shranjevanja trenutnih nastavitev", zato jih bo treba ob naslednji prijavi zagnati ročno."
|
||||
|
||||
#: ../src/core/util.c:111
|
||||
#: ../src/core/util.c:80
|
||||
#, c-format
|
||||
msgid "Failed to open debug log: %s\n"
|
||||
msgstr "Napaka med odpiranjem dnevnika razhroščevanja: %s\n"
|
||||
|
||||
#: ../src/core/util.c:121
|
||||
#: ../src/core/util.c:90
|
||||
#, c-format
|
||||
msgid "Failed to fdopen() log file %s: %s\n"
|
||||
msgstr "Napaka ukaza fdopen() dnevniške datoteke %s: %s\n"
|
||||
|
||||
#: ../src/core/util.c:127
|
||||
#: ../src/core/util.c:96
|
||||
#, c-format
|
||||
msgid "Opened log file %s\n"
|
||||
msgstr "Odprta dnevniška datoteka %s\n"
|
||||
|
||||
#: ../src/core/util.c:146
|
||||
#: ../src/core/util.c:115
|
||||
#: ../src/tools/mutter-message.c:149
|
||||
#, c-format
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Program Mutter je kodno preveden brez podpore za podrobni način izpisovanja\n"
|
||||
|
||||
#: ../src/core/util.c:290
|
||||
#: ../src/core/util.c:259
|
||||
msgid "Window manager: "
|
||||
msgstr "Upravljalnik oken: "
|
||||
|
||||
# G:4 K:0 O:0
|
||||
#: ../src/core/util.c:438
|
||||
#: ../src/core/util.c:407
|
||||
msgid "Bug in window manager: "
|
||||
msgstr "Hrošč v upravljalniku oken: "
|
||||
|
||||
#: ../src/core/util.c:471
|
||||
#: ../src/core/util.c:438
|
||||
msgid "Window manager warning: "
|
||||
msgstr "Opozorilo upravljalnika oken: "
|
||||
|
||||
#: ../src/core/util.c:499
|
||||
#: ../src/core/util.c:466
|
||||
msgid "Window manager error: "
|
||||
msgstr "Napaka upravljalnika oken: "
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:7180
|
||||
#: ../src/core/window.c:7237
|
||||
#, c-format
|
||||
msgid "Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER window as specified in the ICCCM.\n"
|
||||
msgstr "Okno %s nastavi svoj SM_CLIENT_ID, namesto, da bi nastavilo WM_CLIENT_LEADER kot je zavedeno v ICCCM.\n"
|
||||
@@ -300,27 +300,27 @@ msgstr "Okno %s nastavi svoj SM_CLIENT_ID, namesto, da bi nastavilo WM_CLIENT_LE
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7843
|
||||
#: ../src/core/window.c:7902
|
||||
#, c-format
|
||||
msgid "Window %s sets an MWM hint indicating it isn't resizable, but sets min size %d x %d and max size %d x %d; this doesn't make much sense.\n"
|
||||
msgstr "Okno %s določi namig MWM, ki pove, da ni mogoče spremeniti velikosti, hkrati pa določi najmanjšo velikost na %d x %d in največjo na %d x %d; vrednost ni smiselna.\n"
|
||||
|
||||
#: ../src/core/window-props.c:309
|
||||
#: ../src/core/window-props.c:274
|
||||
#, c-format
|
||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||
msgstr "Program je nastavil pokvarjen _NET_WM_PID %lu\n"
|
||||
|
||||
#: ../src/core/window-props.c:426
|
||||
#: ../src/core/window-props.c:393
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (na %s)"
|
||||
|
||||
#: ../src/core/window-props.c:1481
|
||||
#: ../src/core/window-props.c:1448
|
||||
#, c-format
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr "Neveljaven WM_TRANSIENT_FOR za okno 0x%lx naveden za %s.\n"
|
||||
|
||||
#: ../src/core/window-props.c:1492
|
||||
#: ../src/core/window-props.c:1459
|
||||
#, c-format
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr "Predmet WM_TRANSIENT_FOR okna 0x%lx za %s lahko ustvari zanko.\n"
|
||||
@@ -356,122 +356,82 @@ msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:1
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "Spremenilnik, ki naj se uporabi za upravljanje oken"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:2
|
||||
msgid "This key will initiate the \"overlay\", which is a combination window overview and application launching system. The default is intended to be the \"Windows key\" on PC hardware. It's expected that this binding either the default or set to the empty string."
|
||||
msgstr "Ta vrednost določa \"prevleko\", ki združuje predogled okna in zaganjalnik programa. Vrednost je zamišljena kot \"ključ oken\" na strojni opremi računalnika. Pričakovano je, da je vrednost določena privzeto ali pa ni določena."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:3
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Pripni modalna pogovorna okna"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:2
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Prekliči pojavni zavihek"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:3
|
||||
msgid "Determines whether hidden windows (i.e., minimized windows and windows on other workspaces than the current one) should be kept alive."
|
||||
msgstr "Določa ali naj se skrita okna (skrčena okna in okna na drugih delovnih površinah) ohranjajo odprta."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:4
|
||||
msgid "Determines whether the use of popup and highlight frame should be disabled for window cycling."
|
||||
msgstr "Določa ali naj bo uporaba pojavnih zavihkov in poudarjanja onemogočena med kroženjem oken."
|
||||
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 "Izbrana možnost omogoči, da je namesto samostojnih nazivnih vrstic, na to mesto pripeto modalno pogovorno okno, ki se premika z nadrejenim oknom."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:5
|
||||
msgid "Determines whether workspace switching should happen for windows on all monitors or only for windows on the primary monitor."
|
||||
msgstr "Določa ali naj se delovne površine preklapljajo na vseh zaslonih ali le na prvem, glavnem zaslonu."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:6
|
||||
msgid "Draggable border width"
|
||||
msgstr "Prilagodljiva obroba pravokotnika"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:7
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr "Omogoči prilagajanje velikosti okna ob dotiku robov zaslona"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:8
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:6
|
||||
msgid "If enabled, dropping windows on vertical screen edges maximizes them vertically and resizes them horizontally to cover half of the available area. Dropping windows on the top screen edge maximizes them completely."
|
||||
msgstr "Izbrana možnost omogoča, da se okna, ki se dotaknejo navpičnih robov zaslona razpeta po navpični osi in razširjena na polovično širino. Dotik vrhnjega roba razpne okno čez cel zaslon."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:7
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Število delovnih površin je spremenljivo"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:8
|
||||
msgid "Determines whether workspaces are managed dynamically or whether there's a static number of workspaces (determined by the num-workspaces key in org.gnome.desktop.wm.preferences)."
|
||||
msgstr "Možnost določa ali je število delovnih površin spremenljivo ali pa je to število stalno (določenih s ključem števila delovnih površin med možnostmi v org.gnome.desktop.wm.preferences)."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:9
|
||||
msgid "Live Hidden Windows"
|
||||
msgstr "Ohranjena skrita okna"
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Delovne površine le na prvem zaslonu"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:10
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "Spremenilnik, ki naj se uporabi za upravljanje oken"
|
||||
msgid "Determines whether workspace switching should happen for windows on all monitors or only for windows on the primary monitor."
|
||||
msgstr "Določa ali naj se delovne površine preklapljajo na vseh zaslonih ali le na prvem, glavnem zaslonu."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:11
|
||||
msgid "No tab popup"
|
||||
msgstr "Brez pojavnih zavihkov"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:12
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Izbor okna iz pojavnega zavihka"
|
||||
msgid "Determines whether the use of popup and highlight frame should be disabled for window cycling."
|
||||
msgstr "Določa ali naj bo uporaba pojavnih zavihkov in poudarjanja onemogočena med kroženjem oken."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:13
|
||||
msgid "Delay focus changes until the pointer stops moving"
|
||||
msgstr "Zamakni spremembe žarišča, dokler se kazalnik še premika"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:14
|
||||
msgid "If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then the focus will not be changed immediately when entering a window, but only after the pointer stops moving."
|
||||
msgstr "Izbrana možnost omogoča, da se žarišče, v kolikor je izbran način \"sloppy\" ali \"miška\", ne spremeni takoj ob izbiri okna. Žarišče se spremeni, ko se kazalnik preneha premikati."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:15
|
||||
msgid "Draggable border width"
|
||||
msgstr "Prilagodljiva obroba pravokotnika"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:16
|
||||
msgid "The amount of total draggable borders. If the theme's visible borders are not enough, invisible borders will be added to meet this value."
|
||||
msgstr "Delež skupne prilagodljive obrobe. V kolikor vidni robovi teme niso dovolj, so dodane nevidne obrobe, za dodatno prilagajanje."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:14
|
||||
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 "Ta vrednost določa \"prevleko\", ki združuje predogled okna in zaganjalnik programa. Vrednost je zamišljena kot \"ključ oken\" na strojni opremi računalnika. Pričakovano je, da je vrednost določena privzeto ali pa ni določena."
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:17
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Izbor okna iz pojavnega zavihka"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:15
|
||||
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 "Izbrana možnost omogoči, da je namesto samostojnih nazivnih vrstic, na to mesto pripeto modalno pogovorno okno, ki se premika z nadrejenim oknom."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:16
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Delovne površine le na prvem zaslonu"
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:18
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Prekliči pojavni zavihek"
|
||||
|
||||
#: ../src/tools/mutter-message.c:123
|
||||
#, c-format
|
||||
msgid "Usage: %s\n"
|
||||
msgstr "Uporaba: %s\n"
|
||||
|
||||
#: ../src/ui/frames.c:1157
|
||||
msgid "Close Window"
|
||||
msgstr "Zapri okno"
|
||||
|
||||
# G:1 K:1 O:0
|
||||
#: ../src/ui/frames.c:1160
|
||||
msgid "Window Menu"
|
||||
msgstr "Meni okna"
|
||||
|
||||
# G:0 K:1 O:0
|
||||
#: ../src/ui/frames.c:1163
|
||||
msgid "Minimize Window"
|
||||
msgstr "Skrči okno"
|
||||
|
||||
#: ../src/ui/frames.c:1166
|
||||
msgid "Maximize Window"
|
||||
msgstr "Razpni okno"
|
||||
|
||||
#: ../src/ui/frames.c:1169
|
||||
msgid "Restore Window"
|
||||
msgstr "Obnovi okno"
|
||||
|
||||
# G:2 K:0 O:0
|
||||
#: ../src/ui/frames.c:1172
|
||||
msgid "Roll Up Window"
|
||||
msgstr "Zavij okno"
|
||||
|
||||
#: ../src/ui/frames.c:1175
|
||||
msgid "Unroll Window"
|
||||
msgstr "Odvij okno"
|
||||
|
||||
#: ../src/ui/frames.c:1178
|
||||
msgid "Keep Window On Top"
|
||||
msgstr "Ohrani okno na vrhu"
|
||||
|
||||
#: ../src/ui/frames.c:1181
|
||||
msgid "Remove Window From Top"
|
||||
msgstr "Odstrani okno z vrha"
|
||||
|
||||
# G:1 K:0 O:0
|
||||
#: ../src/ui/frames.c:1184
|
||||
msgid "Always On Visible Workspace"
|
||||
msgstr "Vedno na vidni delovni površini"
|
||||
|
||||
#: ../src/ui/frames.c:1187
|
||||
msgid "Put Window On Only One Workspace"
|
||||
msgstr "Postavi okno na samo eno delovno površino"
|
||||
|
||||
#. Translators: Translate this string the same way as you do in libwnck!
|
||||
#: ../src/ui/menu.c:69
|
||||
msgid "Mi_nimize"
|
||||
@@ -690,251 +650,251 @@ msgstr "Mod5"
|
||||
msgid "%d x %d"
|
||||
msgstr "%d x %d"
|
||||
|
||||
#: ../src/ui/theme.c:253
|
||||
#: ../src/ui/theme.c:234
|
||||
msgid "top"
|
||||
msgstr "zgoraj"
|
||||
|
||||
# G:12 K:5 O:0
|
||||
#: ../src/ui/theme.c:255
|
||||
#: ../src/ui/theme.c:236
|
||||
msgid "bottom"
|
||||
msgstr "spodaj"
|
||||
|
||||
# G:10 K:4 O:0
|
||||
#: ../src/ui/theme.c:257
|
||||
#: ../src/ui/theme.c:238
|
||||
msgid "left"
|
||||
msgstr "levo"
|
||||
|
||||
# G:1 K:0 O:0
|
||||
#: ../src/ui/theme.c:259
|
||||
#: ../src/ui/theme.c:240
|
||||
msgid "right"
|
||||
msgstr "desno"
|
||||
|
||||
# G:1 K:0 O:0
|
||||
#: ../src/ui/theme.c:286
|
||||
#: ../src/ui/theme.c:268
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify \"%s\" dimension"
|
||||
msgstr "geometrija okvirja ne navaja dimenzije \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:305
|
||||
#: ../src/ui/theme.c:287
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
msgstr "geometrija okvirja ne navaja dimenzije \"%s\" za rob \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:342
|
||||
#: ../src/ui/theme.c:324
|
||||
#, c-format
|
||||
msgid "Button aspect ratio %g is not reasonable"
|
||||
msgstr "Vrednost razmerja gumba %g ni smiselna"
|
||||
|
||||
#: ../src/ui/theme.c:354
|
||||
#: ../src/ui/theme.c:336
|
||||
#, c-format
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "Geometrija okvirja ne navaja velikosti gumbov"
|
||||
|
||||
#: ../src/ui/theme.c:1067
|
||||
#: ../src/ui/theme.c:1049
|
||||
#, c-format
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "Prelivi bi morali imeti vsaj dve barvi"
|
||||
|
||||
#: ../src/ui/theme.c:1219
|
||||
#: ../src/ui/theme.c:1201
|
||||
#, c-format
|
||||
msgid "GTK custom color specification must have color name and fallback in parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
||||
msgstr "Navedba barve GTK mora biti opredeljena z imenom barve in v navednicah povrnjeno barvo , npr. gtk:izbirno(ime_barve,povrnjena_barva); ni mogoče razčleniti \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1235
|
||||
#: ../src/ui/theme.c:1217
|
||||
#, c-format
|
||||
msgid "Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-_ are valid"
|
||||
msgstr "Neveljaven znak '%c' v imenu barve gtk:izbirno; dovoljeni znaki so le A-Za-z0-9-_."
|
||||
|
||||
#: ../src/ui/theme.c:1249
|
||||
#: ../src/ui/theme.c:1231
|
||||
#, c-format
|
||||
msgid "Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not fit the format"
|
||||
msgstr "Gtk:zapis po meri \"gtk:izbirno(ime_barve,povrnjena_barva)\", \"%s\" ne ustreza pravilni obliki."
|
||||
|
||||
#: ../src/ui/theme.c:1294
|
||||
#: ../src/ui/theme.c:1276
|
||||
#, c-format
|
||||
msgid "GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
||||
msgstr "Navedba barve GTK mora vsebovati stanje v oglatih oklepajih, npr. gtk:fg[NORMAL], kjer je NORMAL stanje; ni mogoče razčleniti \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1308
|
||||
#: ../src/ui/theme.c:1290
|
||||
#, c-format
|
||||
msgid "GTK color specification must have a close bracket after the state, e.g. gtk:fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
||||
msgstr "Navedbi barve GTK manjka oglati zaklepaj za stanjem, npr. gtk:fg[NORMAL], kjer je NORMAL stanje; ni mogoče razčleniti \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1319
|
||||
#: ../src/ui/theme.c:1301
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "Ni mogoče razumeti stanja \"%s\" v navedbi barve "
|
||||
|
||||
#: ../src/ui/theme.c:1332
|
||||
#: ../src/ui/theme.c:1314
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr "Ni mogoče razumeti barvne komponente \"%s\" v navedbi barve"
|
||||
|
||||
#: ../src/ui/theme.c:1361
|
||||
#: ../src/ui/theme.c:1343
|
||||
#, c-format
|
||||
msgid "Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the format"
|
||||
msgstr "Oblika zapisa preliva je \"blend/bg_color/fg_color/alpha\", \"%s\" ne ustreza pravilni obliki"
|
||||
|
||||
#: ../src/ui/theme.c:1372
|
||||
#: ../src/ui/theme.c:1354
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "V prelivni barvi ni mogoče razčleniti vrednosti alfa \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1382
|
||||
#: ../src/ui/theme.c:1364
|
||||
#, c-format
|
||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
msgstr "V prelivni barvi alfa vrednost \"%s\" ni med 0.0 in 1.0"
|
||||
|
||||
#: ../src/ui/theme.c:1429
|
||||
#: ../src/ui/theme.c:1411
|
||||
#, c-format
|
||||
msgid "Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
msgstr "Oblika zapisa barve senčenja je \"shade/base_color/factor\", \"%s\" ne ustreza pravilni obliki."
|
||||
|
||||
#: ../src/ui/theme.c:1440
|
||||
#: ../src/ui/theme.c:1422
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr "Ni mogoče razčleniti vrednosti senčenja \"%s\" v senčeni barvi"
|
||||
|
||||
#: ../src/ui/theme.c:1450
|
||||
#: ../src/ui/theme.c:1432
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "V senčeni barvi je vrednost senčenja \"%s\" negativna"
|
||||
|
||||
#: ../src/ui/theme.c:1479
|
||||
#: ../src/ui/theme.c:1461
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "Ni mogoče razčleniti barve \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:1790
|
||||
#: ../src/ui/theme.c:1778
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr "Izraz koordinat vsebuje znak '%s', ki pa ni dovoljen"
|
||||
|
||||
#: ../src/ui/theme.c:1817
|
||||
#: ../src/ui/theme.c:1805
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains floating point number '%s' which could not be parsed"
|
||||
msgstr "Izraz koordinat vsebuje številko s plavajočo vejico '%s', ki je ni mogoče razčleniti"
|
||||
|
||||
#: ../src/ui/theme.c:1831
|
||||
#: ../src/ui/theme.c:1819
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr "Izraz koordinat vsebuje celo število '%s', ki ga ni mogoče razčleniti"
|
||||
|
||||
#: ../src/ui/theme.c:1953
|
||||
#: ../src/ui/theme.c:1940
|
||||
#, c-format
|
||||
msgid "Coordinate expression contained unknown operator at the start of this text: \"%s\""
|
||||
msgstr "Izraz koordinat vsebuje neznan operator na začetku besedila: \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:2010
|
||||
#: ../src/ui/theme.c:1997
|
||||
#, c-format
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr "Izraz koordinat je prazen ali pa ni v razumljivem zapisu"
|
||||
|
||||
#: ../src/ui/theme.c:2121
|
||||
#: ../src/ui/theme.c:2131
|
||||
#: ../src/ui/theme.c:2165
|
||||
#: ../src/ui/theme.c:2110
|
||||
#: ../src/ui/theme.c:2120
|
||||
#: ../src/ui/theme.c:2154
|
||||
#, c-format
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "Izraz koordinat povzroči deljenje z vrednostjo nič"
|
||||
|
||||
#: ../src/ui/theme.c:2173
|
||||
#: ../src/ui/theme.c:2162
|
||||
#, c-format
|
||||
msgid "Coordinate expression tries to use mod operator on a floating-point number"
|
||||
msgstr "Izraz koordinat poskuša uporabiti operator mod ali številko s plavajočo vejico"
|
||||
|
||||
#: ../src/ui/theme.c:2229
|
||||
#: ../src/ui/theme.c:2218
|
||||
#, c-format
|
||||
msgid "Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
msgstr "Izraz koordinat vsebuje operator \"%s\", kjer je pričakovan operand"
|
||||
|
||||
#: ../src/ui/theme.c:2238
|
||||
#: ../src/ui/theme.c:2227
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr "Izraz koordinat vsebuje operand kjer je pričakovan operator"
|
||||
|
||||
#: ../src/ui/theme.c:2246
|
||||
#: ../src/ui/theme.c:2235
|
||||
#, c-format
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr "Izraz koordinat se konča z operatorjem namesto z operandom"
|
||||
|
||||
#: ../src/ui/theme.c:2256
|
||||
#: ../src/ui/theme.c:2245
|
||||
#, c-format
|
||||
msgid "Coordinate expression has operator \"%c\" following operator \"%c\" with no operand in between"
|
||||
msgstr "Izraz koordinat vsebuje operator \"%c\", ki sledi operatorju \"%c\", brez vmesnega operanda"
|
||||
|
||||
#: ../src/ui/theme.c:2407
|
||||
#: ../src/ui/theme.c:2452
|
||||
#: ../src/ui/theme.c:2396
|
||||
#: ../src/ui/theme.c:2441
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr "Izraz koordinat vsebuje neznano spremenljivko ali konstanto \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:2506
|
||||
#: ../src/ui/theme.c:2495
|
||||
#, c-format
|
||||
msgid "Coordinate expression parser overflowed its buffer."
|
||||
msgstr "Razčlenjevalnik izrazov koordinat je preplavil medpomnilnik."
|
||||
|
||||
#: ../src/ui/theme.c:2535
|
||||
#: ../src/ui/theme.c:2524
|
||||
#, c-format
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr "Izraz koordinat vsebuje zaklepaj, ne pa tudi uklepaja"
|
||||
|
||||
#: ../src/ui/theme.c:2599
|
||||
#: ../src/ui/theme.c:2588
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr "Izraz koordinat vsebuje uklepaj, vendar je brez zaklepaja"
|
||||
|
||||
#: ../src/ui/theme.c:2610
|
||||
#: ../src/ui/theme.c:2599
|
||||
#, c-format
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr "Videti je, da izraz koordinat ne vsebuje operatorjev ali operandov"
|
||||
|
||||
#: ../src/ui/theme.c:2822
|
||||
#: ../src/ui/theme.c:2842
|
||||
#: ../src/ui/theme.c:2862
|
||||
#: ../src/ui/theme.c:2812
|
||||
#: ../src/ui/theme.c:2832
|
||||
#: ../src/ui/theme.c:2852
|
||||
#, c-format
|
||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||
msgstr "Tema vsebuje izraz, ki povzroča napako: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:4533
|
||||
#: ../src/ui/theme.c:4498
|
||||
#, c-format
|
||||
msgid "<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be specified for this frame style"
|
||||
msgstr "Za ta slog okvirja mora biti naveden <button function=\"%s\" state=\"%s\" draw_ops=\"karkoli\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5066
|
||||
#: ../src/ui/theme.c:5091
|
||||
#: ../src/ui/theme.c:5009
|
||||
#: ../src/ui/theme.c:5034
|
||||
#, c-format
|
||||
msgid "Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
msgstr "Manjka <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"karkoli\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5139
|
||||
#: ../src/ui/theme.c:5082
|
||||
#, c-format
|
||||
msgid "Failed to load theme \"%s\": %s\n"
|
||||
msgstr "Napaka med nalaganjem teme \"%s\": %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:5275
|
||||
#: ../src/ui/theme.c:5282
|
||||
#: ../src/ui/theme.c:5289
|
||||
#: ../src/ui/theme.c:5296
|
||||
#: ../src/ui/theme.c:5303
|
||||
#: ../src/ui/theme.c:5218
|
||||
#: ../src/ui/theme.c:5225
|
||||
#: ../src/ui/theme.c:5232
|
||||
#: ../src/ui/theme.c:5239
|
||||
#: ../src/ui/theme.c:5246
|
||||
#, c-format
|
||||
msgid "No <%s> set for theme \"%s\""
|
||||
msgstr "Ni nastavljena vrednost <%s> za temo \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:5311
|
||||
#: ../src/ui/theme.c:5254
|
||||
#, c-format
|
||||
msgid "No frame style set for window type \"%s\" in theme \"%s\", add a <window type=\"%s\" style_set=\"whatever\"/> element"
|
||||
msgstr "Ni določenega sloga okvirja okna vrste \"%s\" v temi \"%s\". Dodajte predmet <window type=\"%s\" style_set=\"whatever\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5709
|
||||
#: ../src/ui/theme.c:5771
|
||||
#: ../src/ui/theme.c:5834
|
||||
#: ../src/ui/theme.c:5650
|
||||
#: ../src/ui/theme.c:5712
|
||||
#: ../src/ui/theme.c:5775
|
||||
#, c-format
|
||||
msgid "User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
msgstr "Uporabniško določene konstante se morajo začeti z veliko črko; vrednost \"%s\" se ne"
|
||||
|
||||
#: ../src/ui/theme.c:5717
|
||||
#: ../src/ui/theme.c:5779
|
||||
#: ../src/ui/theme.c:5842
|
||||
#: ../src/ui/theme.c:5658
|
||||
#: ../src/ui/theme.c:5720
|
||||
#: ../src/ui/theme.c:5783
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "Konstanta \"%s\" je že določena"
|
||||
@@ -1306,7 +1266,7 @@ msgstr "Znotraj predmeta <%s> besedilo ni dovoljeno"
|
||||
msgid "<%s> specified twice for this theme"
|
||||
msgstr "Vrednost <%s> je za to temo navedena dvakrat"
|
||||
|
||||
#: ../src/ui/theme-parser.c:4348
|
||||
#: ../src/ui/theme-parser.c:4334
|
||||
#, c-format
|
||||
msgid "Failed to find a valid file for theme %s\n"
|
||||
msgstr "Ni mogoče najti veljavne datoteke za temo %s\n"
|
||||
@@ -1503,84 +1463,18 @@ msgstr "vrednost y je %d, pričakovana pa je %d"
|
||||
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||
msgstr "%d izjav koordinat razčlenjenih v %g sekundah (%g sekund v povprečju)\n"
|
||||
|
||||
#~ msgid "Switch to workspace 1"
|
||||
#~ msgstr "Preklopi na delovno površino 1"
|
||||
#~ msgid "Comma-separated list of compositor plugins"
|
||||
#~ msgstr "Z vejico ločen seznam vstavkov sestavljanja"
|
||||
|
||||
#~ msgid "Switch to workspace 2"
|
||||
#~ msgstr "Preklopi na delovno površino 2"
|
||||
|
||||
#~ msgid "Switch to workspace 3"
|
||||
#~ msgstr "Preklopi na delovno površino 3"
|
||||
|
||||
#~ msgid "Switch to workspace 4"
|
||||
#~ msgstr "Preklopi na delovno površino 4"
|
||||
|
||||
#~ msgid "Switch to workspace 5"
|
||||
#~ msgstr "Preklopi na delovno površino 5"
|
||||
|
||||
#~ msgid "Switch to workspace 6"
|
||||
#~ msgstr "Preklopi na delovno površino 6"
|
||||
|
||||
#~ msgid "Switch to workspace 7"
|
||||
#~ msgstr "Preklopi na delovno površino 7"
|
||||
|
||||
#~ msgid "Switch to workspace 8"
|
||||
#~ msgstr "Preklopi na delovno površino 8"
|
||||
|
||||
#~ msgid "Switch to workspace 9"
|
||||
#~ msgstr "Preklopi na delovno površino 9"
|
||||
|
||||
#~ msgid "Switch to workspace 10"
|
||||
#~ msgstr "Preklopi na delovno površino 10"
|
||||
|
||||
#~ msgid "Switch to workspace 11"
|
||||
#~ msgstr "Preklopi na delovno površino 11"
|
||||
|
||||
#~ msgid "Switch to workspace 12"
|
||||
#~ msgstr "Preklopi na delovno površino 12"
|
||||
|
||||
#~ msgid "Switch to workspace on the left of the current workspace"
|
||||
#~ msgstr "Preklopi na delovno površino na levi od trenutne delovne površine"
|
||||
|
||||
#~ msgid "Switch to workspace on the right of the current workspace"
|
||||
#~ msgstr "Preklopi na delovno površino na desni od trenutne delovne površine"
|
||||
|
||||
#~ msgid "Switch to workspace above the current workspace"
|
||||
#~ msgstr "Preklopi na delovno površino nad trenutno delovno površino"
|
||||
|
||||
#~ msgid "Switch to workspace below the current workspace"
|
||||
#~ msgstr "Preklopi na delovno površino pod trenutno delovno površino"
|
||||
|
||||
#~ msgid "Move between windows of an application, using a popup window"
|
||||
#~ msgstr "Premakni med okni programa s pojavnim oknom"
|
||||
#~ msgid "Live Hidden Windows"
|
||||
#~ msgstr "Ohranjena skrita okna"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Move backward between windows of an application, using a popup window"
|
||||
#~ msgstr "Premakni nazaj med okni programa s pojavnim oknom"
|
||||
#~ "Determines whether hidden windows (i.e., minimized windows and windows on "
|
||||
#~ "other workspaces than the current one) should be kept alive."
|
||||
#~ msgstr ""
|
||||
#~ "Določa ali naj se skrita okna (skrčena okna in okna na drugih delovnih "
|
||||
#~ "površinah) ohranjajo odprta."
|
||||
|
||||
#~ msgid "Move between windows, using a popup window"
|
||||
#~ msgstr "Premakni med okni s pojavnim oknom"
|
||||
|
||||
#~ msgid "Move backward between windows, using a popup window"
|
||||
#~ msgstr "Premakni nazaj med okni s pojavnim oknom"
|
||||
|
||||
#~ msgid "Move between panels and the desktop, using a popup window"
|
||||
#~ msgstr "Premakni med pulti in namizjem s pojavnim oknom"
|
||||
|
||||
#~ msgid "Move backward between panels and the desktop, using a popup window"
|
||||
#~ msgstr "Premakni nazaj med pulti in namizjem s pojavnim oknom"
|
||||
|
||||
#~ msgid "Move between windows of an application immediately"
|
||||
#~ msgstr "Takoj premakni med okni programa"
|
||||
|
||||
#~ msgid "Move backward between windows of an application immediately"
|
||||
#~ msgstr "Takoj premakni nazaj med okni programa"
|
||||
|
||||
#~ msgid "Move between windows immediately"
|
||||
#~ msgstr "Takoj premakni med okni"
|
||||
|
||||
#~ msgid "Move backward between windows immediately"
|
||||
#~ msgstr "Takoj premakni nazaj med okni"
|
||||
|
||||
#~ msgid "Move between panels and the desktop immediately"
|
||||
#~ msgstr "Takoj premakni med pulti in namizjem"
|
||||
#~ msgid "Close Window"
|
||||
#~ msgstr "Zapri okno"
|
||||
|
2995
po/sr@latin.po
2995
po/sr@latin.po
File diff suppressed because it is too large
Load Diff
473
po/tr.po
473
po/tr.po
@@ -6,36 +6,35 @@
|
||||
# Baris Cicek <baris@teamforce.name.tr>, 2004, 2005, 2008, 2009.
|
||||
# İlker DAĞLI <ilker@ilkerdagli.info>, 2011.
|
||||
# Muhammed EKEN <gnome@m-eken.com>, 2011.
|
||||
# Muhammet Kara <muhammet.k@gmail.com>, 2011.
|
||||
# Muhammet Kara <muhammetk@acikkaynak.name.tr>, 2011, 2012.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2011-12-13 13:41+0000\n"
|
||||
"PO-Revision-Date: 2011-12-24 16:54+0200\n"
|
||||
"Last-Translator: Muhammet Kara <muhammet.k@gmail.com>\n"
|
||||
"POT-Creation-Date: 2012-08-06 23:35+0000\n"
|
||||
"PO-Revision-Date: 2012-08-09 16:48+0000\n"
|
||||
"Last-Translator: Muhammet Kara <muhammetk@acikkaynak.name.tr>\n"
|
||||
"Language-Team: Turkish <gnome-turk@gnome.org>\n"
|
||||
"Language: tr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Lokalize 1.2\n"
|
||||
"X-Generator: Lokalize 1.4\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"Language: tr\n"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:1
|
||||
msgid "Windows"
|
||||
msgstr "Pencereler"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:2
|
||||
msgid "View split on left"
|
||||
msgstr "Solda bölünmüş olarak göster"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:2
|
||||
#: ../src/50-mutter-windows.xml.in.h:3
|
||||
msgid "View split on right"
|
||||
msgstr "Sağda bölünmüş olarak göster"
|
||||
|
||||
#: ../src/50-mutter-windows.xml.in.h:3
|
||||
#| msgid "_Windows"
|
||||
msgid "Windows"
|
||||
msgstr "Pencereler"
|
||||
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#: ../src/compositor/compositor.c:492
|
||||
@@ -47,7 +46,7 @@ msgstr ""
|
||||
"\"%2$s\" monitöründeki %1$i ekranında zaten başka bir birleştirme yöneticisi "
|
||||
"çalışıyor."
|
||||
|
||||
#: ../src/core/bell.c:307
|
||||
#: ../src/core/bell.c:320
|
||||
msgid "Bell event"
|
||||
msgstr "Etkinlik zili"
|
||||
|
||||
@@ -56,16 +55,17 @@ msgstr "Etkinlik zili"
|
||||
msgid "Unknown window information request: %d"
|
||||
msgstr "Bilinmeyen pencere bilgi isteği: %d"
|
||||
|
||||
#: ../src/core/delete.c:111
|
||||
#, c-format
|
||||
msgid "<tt>%s</tt> is not responding."
|
||||
msgstr "<tt>%s</tt> cevap vermiyor."
|
||||
|
||||
#: ../src/core/delete.c:114
|
||||
#, c-format
|
||||
#| msgid "<tt>%s</tt> is not responding."
|
||||
msgid "%s is not responding."
|
||||
msgstr "%s yanıt vermiyor."
|
||||
|
||||
#: ../src/core/delete.c:118
|
||||
msgid "Application is not responding."
|
||||
msgstr "Uygulama cevap vermiyor"
|
||||
|
||||
#: ../src/core/delete.c:119
|
||||
#: ../src/core/delete.c:123
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
@@ -73,25 +73,25 @@ msgstr ""
|
||||
"Uygulamanın devam etmesi için bir müddet bekleyi seçebilirsiniz ya d a "
|
||||
"uygulamanın tamamen çıkması için onu zorlayabilirsiniz."
|
||||
|
||||
#: ../src/core/delete.c:126
|
||||
#: ../src/core/delete.c:130
|
||||
msgid "_Wait"
|
||||
msgstr "_Bekle"
|
||||
|
||||
#: ../src/core/delete.c:126
|
||||
#: ../src/core/delete.c:130
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Sonlandır"
|
||||
|
||||
#: ../src/core/display.c:365
|
||||
#: ../src/core/display.c:380
|
||||
#, c-format
|
||||
msgid "Missing %s extension required for compositing"
|
||||
msgstr "Kompozisyon için gerekli olan %s eklentisi eksik"
|
||||
|
||||
#: ../src/core/display.c:431
|
||||
#: ../src/core/display.c:446
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "X Pencere Sistemi '%s' ekranı açılamadı\n"
|
||||
|
||||
#: ../src/core/keybindings.c:852
|
||||
#: ../src/core/keybindings.c:844
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Some other program is already using the key %s with modifiers %x as a "
|
||||
@@ -100,36 +100,36 @@ msgstr ""
|
||||
"%s tuşu %x değiştiricileriyle birlikte başka bir uygulama tarafından tuş "
|
||||
"bağıolarak kullanılıyor\n"
|
||||
|
||||
#: ../src/core/main.c:206
|
||||
#: ../src/core/main.c:196
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Ortam yöneticisine olan bağlantıyı kapat"
|
||||
|
||||
#: ../src/core/main.c:212
|
||||
#: ../src/core/main.c:202
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Çalışan pencere yöneticisinin yerini al"
|
||||
|
||||
#: ../src/core/main.c:218
|
||||
#: ../src/core/main.c:208
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Ortam yönetim ID'sini belirtin"
|
||||
|
||||
#: ../src/core/main.c:223
|
||||
#: ../src/core/main.c:213
|
||||
msgid "X Display to use"
|
||||
msgstr "Kullanılacak X Ekranı"
|
||||
|
||||
#: ../src/core/main.c:229
|
||||
#: ../src/core/main.c:219
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Ortamı kayıtlı dosyadan başlat"
|
||||
|
||||
#: ../src/core/main.c:235
|
||||
#: ../src/core/main.c:225
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "X çağrılarını eşazamanlı yap"
|
||||
|
||||
#: ../src/core/main.c:504
|
||||
#: ../src/core/main.c:494
|
||||
#, c-format
|
||||
msgid "Failed to scan themes directory: %s\n"
|
||||
msgstr "Tema dizini taranırken hata oluştu: %s\n"
|
||||
|
||||
#: ../src/core/main.c:520
|
||||
#: ../src/core/main.c:510
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||
@@ -137,7 +137,7 @@ msgstr ""
|
||||
"Hiç tema bulunamadı! %s varlığından ve bildiğimiz temaları içerdiğinden emin "
|
||||
"olun.\n"
|
||||
|
||||
#: ../src/core/mutter.c:42
|
||||
#: ../src/core/mutter.c:40
|
||||
#, c-format
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
@@ -151,15 +151,15 @@ msgstr ""
|
||||
"Bu bir özgür yazılımdır; telif koşullarını öğrenmek için kaynak koda bakın.\n"
|
||||
"Hiç bir garantisi, BELİRLİ BİR AMACA UYGUNLUĞU için dahi, YOKTUR.\n"
|
||||
|
||||
#: ../src/core/mutter.c:56
|
||||
#: ../src/core/mutter.c:54
|
||||
msgid "Print version"
|
||||
msgstr "Sürümü yazdır"
|
||||
|
||||
#: ../src/core/mutter.c:62
|
||||
msgid "Comma-separated list of compositor plugins"
|
||||
msgstr "Kompozisyon eklentilerinin listesi (virgül ile ayrılmış)"
|
||||
#: ../src/core/mutter.c:60
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Kullanılacak Mutter eklentisi"
|
||||
|
||||
#: ../src/core/prefs.c:1067
|
||||
#: ../src/core/prefs.c:1065
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
"behave properly.\n"
|
||||
@@ -167,14 +167,13 @@ msgstr ""
|
||||
"Hatalı uygulamalara yönelik çözümler devre dışı. Bazı uygulamalar düzgün "
|
||||
"işlemeyebilir.\n"
|
||||
|
||||
#: ../src/core/prefs.c:1142
|
||||
#: ../src/core/prefs.c:1140
|
||||
#, c-format
|
||||
#| msgid "Could not parse font description \"%s\" from GConf key %s\n"
|
||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||
msgstr ""
|
||||
"\"%s\" yazıtipi tanımlaması, %s GSettings anahtarından ayrıştırılamadı\n"
|
||||
|
||||
#: ../src/core/prefs.c:1208
|
||||
#: ../src/core/prefs.c:1206
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||
@@ -183,7 +182,7 @@ msgstr ""
|
||||
"Yapılandırma veritabanında bulunan \"%s\", fare düğme düzenleyicisi olarak "
|
||||
"geçerli bir değer değil\n"
|
||||
|
||||
#: ../src/core/prefs.c:1720
|
||||
#: ../src/core/prefs.c:1724
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
@@ -192,17 +191,17 @@ msgstr ""
|
||||
"Yapılandırma veritabanında bulunan \"%s\", \"%s\" tuş bağı olarak geçerli "
|
||||
"bir değer değil\n"
|
||||
|
||||
#: ../src/core/prefs.c:1817
|
||||
#: ../src/core/prefs.c:1821
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Çalışma Alanı %d"
|
||||
|
||||
#: ../src/core/screen.c:741
|
||||
#: ../src/core/screen.c:652
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "'%2$s' X oturumundaki ekran %1$d geçersiz\n"
|
||||
|
||||
#: ../src/core/screen.c:757
|
||||
#: ../src/core/screen.c:668
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||
@@ -212,7 +211,7 @@ msgstr ""
|
||||
"geçerli pencere yöneticisinin yerine bir başkasını koymak için --replace "
|
||||
"seçeneğini kullanmayı deneyin.\n"
|
||||
|
||||
#: ../src/core/screen.c:784
|
||||
#: ../src/core/screen.c:695
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||
@@ -220,13 +219,13 @@ msgstr ""
|
||||
"\"%2$s\" X oturumundaki ekran %1$d hangi pencere yöneticisine "
|
||||
"sahipöğrenilemedi\n"
|
||||
|
||||
#: ../src/core/screen.c:839
|
||||
#: ../src/core/screen.c:750
|
||||
#, c-format
|
||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||
msgstr ""
|
||||
"\"%2$s\" X oturumundaki ekran %1$d bir pencere yöneticisine zaten sahip\n"
|
||||
|
||||
#: ../src/core/screen.c:1024
|
||||
#: ../src/core/screen.c:935
|
||||
#, c-format
|
||||
msgid "Could not release screen %d on display \"%s\"\n"
|
||||
msgstr "\"%2$s\" X oturumundaki ekran %1$d serberst bırakılamadı\"\n"
|
||||
@@ -288,44 +287,44 @@ msgstr ""
|
||||
"Bu pencereler, "geçerli ayarları kaydet" özelliğini desteklemiyor "
|
||||
"ve bir dahaki girişinizde elle yeniden başlatmanız gerekecek."
|
||||
|
||||
#: ../src/core/util.c:111
|
||||
#: ../src/core/util.c:80
|
||||
#, c-format
|
||||
msgid "Failed to open debug log: %s\n"
|
||||
msgstr "Hata ayıklama günlüğü açılamadı: %s\n"
|
||||
|
||||
#: ../src/core/util.c:121
|
||||
#: ../src/core/util.c:90
|
||||
#, c-format
|
||||
msgid "Failed to fdopen() log file %s: %s\n"
|
||||
msgstr "fdopen() günlük dosyası %s açılamadı: %s\n"
|
||||
|
||||
#: ../src/core/util.c:127
|
||||
#: ../src/core/util.c:96
|
||||
#, c-format
|
||||
msgid "Opened log file %s\n"
|
||||
msgstr "%s günlük dosyası açıldı\n"
|
||||
|
||||
#: ../src/core/util.c:146 ../src/tools/mutter-message.c:149
|
||||
#: ../src/core/util.c:115 ../src/tools/mutter-message.c:149
|
||||
#, c-format
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutter, ayrıntılı kip desteği olmadan derlenmiş\n"
|
||||
|
||||
#: ../src/core/util.c:290
|
||||
#: ../src/core/util.c:259
|
||||
msgid "Window manager: "
|
||||
msgstr "Pencere yöneticisi: "
|
||||
|
||||
#: ../src/core/util.c:438
|
||||
#: ../src/core/util.c:407
|
||||
msgid "Bug in window manager: "
|
||||
msgstr "Pencere yöneticisinde hata: "
|
||||
|
||||
#: ../src/core/util.c:471
|
||||
#: ../src/core/util.c:438
|
||||
msgid "Window manager warning: "
|
||||
msgstr "Pencere yöneticisi uyarısı: "
|
||||
|
||||
#: ../src/core/util.c:499
|
||||
#: ../src/core/util.c:466
|
||||
msgid "Window manager error: "
|
||||
msgstr "Pencere yöneticisi hatası: "
|
||||
|
||||
#. first time through
|
||||
#: ../src/core/window.c:7145
|
||||
#: ../src/core/window.c:7234
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||
@@ -341,32 +340,32 @@ msgstr ""
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/core/window.c:7808
|
||||
#: ../src/core/window.c:7899
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size %"
|
||||
"d x %d and max size %d x %d; this doesn't make much sense.\n"
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||
"%d x %d and max size %d x %d; this doesn't make much sense.\n"
|
||||
msgstr ""
|
||||
"%s penceresi bir yandan yeniden boyutlandırılamaz olduğunu gösteren bir MWM "
|
||||
"ipucu verirken anlamsız bir biçimde en küçük (%d x %d) ve en büyük (%d x %d) "
|
||||
"boyut sınırlarını da atıyor.\n"
|
||||
|
||||
#: ../src/core/window-props.c:309
|
||||
#: ../src/core/window-props.c:310
|
||||
#, c-format
|
||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||
msgstr "Uygulama geçersiz _NET_WM_PID %lu atadı\n"
|
||||
|
||||
#: ../src/core/window-props.c:426
|
||||
#: ../src/core/window-props.c:429
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (%s üzerinde)"
|
||||
|
||||
#: ../src/core/window-props.c:1481
|
||||
#: ../src/core/window-props.c:1484
|
||||
#, c-format
|
||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||
msgstr "Geçersiz WM_TRANSIENT_FOR pencere 0x%lx belirtilen %s.\n"
|
||||
|
||||
#: ../src/core/window-props.c:1492
|
||||
#: ../src/core/window-props.c:1495
|
||||
#, c-format
|
||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||
msgstr "WM_TRANSIENT_FOR penceresi 0x%lx (%s için) döngü oluşturacak.\n"
|
||||
@@ -404,87 +403,10 @@ msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:1
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Yardımcı diyalogları ekle"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:2
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Sekmeyi yeni pencerede açmayı iptal et"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:3
|
||||
msgid ""
|
||||
"Determines whether hidden windows (i.e., minimized windows and windows on "
|
||||
"other workspaces than the current one) should be kept alive."
|
||||
msgstr ""
|
||||
"Gizli pencerelerin (ö.r. küçültülmüş pencereler ve diğer çalışma alanındaki "
|
||||
"pencereler) çalışır bırakılıp bırakılmayacağını belirler."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"Determines whether the use of popup and highlight frame should be disabled "
|
||||
"for window cycling."
|
||||
msgstr ""
|
||||
"Pencere geçişinde çerçeve vurgulanması ve açılır pencere kullanımının "
|
||||
"kapatılıp "
|
||||
"kapatılmayacağını belirler."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:5
|
||||
msgid ""
|
||||
"Determines whether workspace switching should happen for windows on all "
|
||||
"monitors or only for windows on the primary monitor."
|
||||
msgstr ""
|
||||
"Çalışma alanı değiştirilmesinin, tüm monitörlerdeki pencerelerde mi yoksa "
|
||||
"sadece birincil monitördekilerde mi gerçekleşeceğini belirler."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:6
|
||||
msgid "Draggable border width"
|
||||
msgstr "Sürüklenebilir kenarlık genişliği"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:7
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
"Pencereler ekran kenarlarında bırakıldığında kenar döşemeyi etkinleştir."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:8
|
||||
msgid ""
|
||||
"If enabled, dropping windows on vertical screen edges maximizes them "
|
||||
"vertically and resizes them horizontally to cover half of the available "
|
||||
"area. Dropping windows on the top screen edge maximizes them completely."
|
||||
msgstr ""
|
||||
"Eğer etkinleştirilirse, dikey ekran kenarlarına bırakılan pencereler dikey "
|
||||
"olarak "
|
||||
"ekranı kaplar ve yatayda kullanılabilir alanın yarısını kaplayacak şekilde "
|
||||
"yeniden "
|
||||
"boyutlandırılır. Ekranın tepedeki kenarına bırakılan pencereler ekranı "
|
||||
"tamamen kaplar."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:9
|
||||
msgid "Live Hidden Windows"
|
||||
msgstr "Çalışır Durumdaki Gizli Pencereler"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:10
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "Genişletilmiş pencere yönetimi işlemleri için kullanılacak değiştirici"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:11
|
||||
msgid "No tab popup"
|
||||
msgstr "Sekme açılır penceresi yok"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:12
|
||||
#| msgid "Remove Window From Top"
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Pencereyi, sekme açılır penceresinden seç"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:13
|
||||
msgid ""
|
||||
"The amount of total draggable borders. If the theme's visible borders are "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
msgstr ""
|
||||
"Sürüklenebilir kenarlıkların toplam miktarı. Eğer temanın görünür "
|
||||
"kenarlıkları yetersiz gelirse, bu değere ulaşmak için görünmez kenarlıklar "
|
||||
"eklenir."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:14
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:2
|
||||
msgid ""
|
||||
"This key will initiate the \"overlay\", which is a combination window "
|
||||
"overview and application launching system. The default is intended to be the "
|
||||
@@ -496,7 +418,11 @@ msgstr ""
|
||||
"donanımındaki \"windows tuşu\" olması tasarlanmıştır. Bağlayıcı varsayılan "
|
||||
"olarak veya boş dize olarak ayarlanması beklenir."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:15
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:3
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Yardımcı diyalogları ekle"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
@@ -506,59 +432,86 @@ msgstr ""
|
||||
"diyalogları üst pencerenin başlık çubuğunda ekli gözükür ve üst pencere ile "
|
||||
"birlikte hareket eder."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:16
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:5
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
"Pencereler ekran kenarlarında bırakıldığında kenar döşemeyi etkinleştir."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:6
|
||||
msgid ""
|
||||
"If enabled, dropping windows on vertical screen edges maximizes them "
|
||||
"vertically and resizes them horizontally to cover half of the available "
|
||||
"area. Dropping windows on the top screen edge maximizes them completely."
|
||||
msgstr ""
|
||||
"Eğer etkinleştirilirse, dikey ekran kenarlarına bırakılan pencereler dikey "
|
||||
"olarak ekranı kaplar ve yatayda kullanılabilir alanın yarısını kaplayacak "
|
||||
"şekilde yeniden boyutlandırılır. Ekranın tepedeki kenarına bırakılan "
|
||||
"pencereler ekranı tamamen kaplar."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:7
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Çalışma alanları dinamik olarak yönetilir"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:8
|
||||
msgid ""
|
||||
"Determines whether workspaces are managed dynamically or whether there's a "
|
||||
"static number of workspaces (determined by the num-workspaces key in org."
|
||||
"gnome.desktop.wm.preferences)."
|
||||
msgstr ""
|
||||
"Çalışma alanlarının dinamik olarak mı yönetileceğini yoksa sabit sayıda "
|
||||
"çalışma alanı mı olacağını belirler (org.gnome.desktop.wm.preferences "
|
||||
"içindeki num-workspaces değişkeni tarafından belirlenir)."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:9
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Sadece birincil monitördeki çalışma alanları"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:10
|
||||
msgid ""
|
||||
"Determines whether workspace switching should happen for windows on all "
|
||||
"monitors or only for windows on the primary monitor."
|
||||
msgstr ""
|
||||
"Çalışma alanı değiştirilmesinin, tüm monitörlerdeki pencerelerde mi yoksa "
|
||||
"sadece birincil monitördekilerde mi gerçekleşeceğini belirler."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:11
|
||||
msgid "No tab popup"
|
||||
msgstr "Sekme açılır penceresi yok"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:12
|
||||
msgid ""
|
||||
"Determines whether the use of popup and highlight frame should be disabled "
|
||||
"for window cycling."
|
||||
msgstr ""
|
||||
"Pencere geçişinde çerçeve vurgulanması ve açılır pencere kullanımının "
|
||||
"kapatılıp kapatılmayacağını belirler."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:13
|
||||
msgid "Draggable border width"
|
||||
msgstr "Sürüklenebilir kenarlık genişliği"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:14
|
||||
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 ""
|
||||
"Sürüklenebilir kenarlıkların toplam miktarı. Eğer temanın görünür "
|
||||
"kenarlıkları yetersiz gelirse, bu değere ulaşmak için görünmez kenarlıklar "
|
||||
"eklenir."
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:15
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Pencereyi, sekme açılır penceresinden seç"
|
||||
|
||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:16
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Sekmeyi yeni pencerede açmayı iptal et"
|
||||
|
||||
#: ../src/tools/mutter-message.c:123
|
||||
#, c-format
|
||||
msgid "Usage: %s\n"
|
||||
msgstr "Kullanım: %s\n"
|
||||
|
||||
#: ../src/ui/frames.c:1157
|
||||
msgid "Close Window"
|
||||
msgstr "Pencereyi Kapat"
|
||||
|
||||
#: ../src/ui/frames.c:1160
|
||||
msgid "Window Menu"
|
||||
msgstr "Pencere Menüsü"
|
||||
|
||||
#: ../src/ui/frames.c:1163
|
||||
msgid "Minimize Window"
|
||||
msgstr "Pencereyi Küçült"
|
||||
|
||||
#: ../src/ui/frames.c:1166
|
||||
msgid "Maximize Window"
|
||||
msgstr "Pencereyi Büyült"
|
||||
|
||||
#: ../src/ui/frames.c:1169
|
||||
msgid "Restore Window"
|
||||
msgstr "Pencere Geri Getir"
|
||||
|
||||
#: ../src/ui/frames.c:1172
|
||||
msgid "Roll Up Window"
|
||||
msgstr "Pencereyi Yukarı Sar"
|
||||
|
||||
#: ../src/ui/frames.c:1175
|
||||
msgid "Unroll Window"
|
||||
msgstr "Pencereyi Geri Sar"
|
||||
|
||||
#: ../src/ui/frames.c:1178
|
||||
msgid "Keep Window On Top"
|
||||
msgstr "Pencereyi Üstte Tut"
|
||||
|
||||
#: ../src/ui/frames.c:1181
|
||||
msgid "Remove Window From Top"
|
||||
msgstr "Pencereyi Üstten Kaldır"
|
||||
|
||||
#: ../src/ui/frames.c:1184
|
||||
msgid "Always On Visible Workspace"
|
||||
msgstr "Her Zaman Görünen Çalışma Alanında"
|
||||
|
||||
#: ../src/ui/frames.c:1187
|
||||
msgid "Put Window On Only One Workspace"
|
||||
msgstr "Pencereyi Sadece Bir Çalışma Alanına Yerleştir"
|
||||
|
||||
#. Translators: Translate this string the same way as you do in libwnck!
|
||||
#: ../src/ui/menu.c:69
|
||||
msgid "Mi_nimize"
|
||||
@@ -758,49 +711,49 @@ msgstr "Mod5"
|
||||
msgid "%d x %d"
|
||||
msgstr "%d x %d"
|
||||
|
||||
#: ../src/ui/theme.c:253
|
||||
#: ../src/ui/theme.c:234
|
||||
msgid "top"
|
||||
msgstr "üst"
|
||||
|
||||
#: ../src/ui/theme.c:255
|
||||
#: ../src/ui/theme.c:236
|
||||
msgid "bottom"
|
||||
msgstr "alt"
|
||||
|
||||
#: ../src/ui/theme.c:257
|
||||
#: ../src/ui/theme.c:238
|
||||
msgid "left"
|
||||
msgstr "sol"
|
||||
|
||||
#: ../src/ui/theme.c:259
|
||||
#: ../src/ui/theme.c:240
|
||||
msgid "right"
|
||||
msgstr "sağ"
|
||||
|
||||
#: ../src/ui/theme.c:286
|
||||
#: ../src/ui/theme.c:268
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify \"%s\" dimension"
|
||||
msgstr "çerçeve geometrisi \"%s\" boyutunu tanımlamıyor"
|
||||
|
||||
#: ../src/ui/theme.c:305
|
||||
#: ../src/ui/theme.c:287
|
||||
#, c-format
|
||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||
msgstr ""
|
||||
"çerçeve geometrisi \"%s\" boyutunu \"%s\" pencere kenarı için tanımlamıyor"
|
||||
|
||||
#: ../src/ui/theme.c:342
|
||||
#: ../src/ui/theme.c:324
|
||||
#, c-format
|
||||
msgid "Button aspect ratio %g is not reasonable"
|
||||
msgstr "%g kabul edilebilir bir düğme en-boy oranı değil"
|
||||
|
||||
#: ../src/ui/theme.c:354
|
||||
#: ../src/ui/theme.c:336
|
||||
#, c-format
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "Çerçeve geometrisi düğmelerin boyutunu tanımlamıyor"
|
||||
|
||||
#: ../src/ui/theme.c:1067
|
||||
#: ../src/ui/theme.c:1049
|
||||
#, c-format
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "Renk geçişlerinde en az iki renk olmalı"
|
||||
|
||||
#: ../src/ui/theme.c:1219
|
||||
#: ../src/ui/theme.c:1201
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK custom color specification must have color name and fallback in "
|
||||
@@ -809,7 +762,7 @@ msgstr ""
|
||||
"GTK özel renk belirtiminde parantez içinde renk adı ve fallback kelimesi yer "
|
||||
"almalıdır; örneğin, gtk:custom[foo,bar]; \"%s\" ayrıştırılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1235
|
||||
#: ../src/ui/theme.c:1217
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||
@@ -818,7 +771,7 @@ msgstr ""
|
||||
"gtk:custom color_name parametresinin adında geçersiz karakter '%c'; sadece A-"
|
||||
"Za-z0-9-_ karakterleri geçerlidir"
|
||||
|
||||
#: ../src/ui/theme.c:1249
|
||||
#: ../src/ui/theme.c:1231
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||
@@ -827,7 +780,7 @@ msgstr ""
|
||||
"Gtk:custom biçimi \"gtk:custom(color_name,fallback)\" şeklindedir; \"%s\" "
|
||||
"biçime uymuyor"
|
||||
|
||||
#: ../src/ui/theme.c:1294
|
||||
#: ../src/ui/theme.c:1276
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
@@ -837,7 +790,7 @@ msgstr ""
|
||||
"örneğin, gtk:fg[NORMAL] belirtiminde NORMAL, durumu gösterir; \"%s\" "
|
||||
"ayrıştırılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1308
|
||||
#: ../src/ui/theme.c:1290
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||
@@ -847,17 +800,17 @@ msgstr ""
|
||||
"örneğin, gtk:fg[NORMAL] belirtiminde NORMAL, durumu gösterir; \"%s\" "
|
||||
"ayrıştırılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1319
|
||||
#: ../src/ui/theme.c:1301
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "Renk belirtimindeki \"%s\" durumu anlaşılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1332
|
||||
#: ../src/ui/theme.c:1314
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr "Renk belirtimindeki \"%s\" renk bileşeni anlaşılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1361
|
||||
#: ../src/ui/theme.c:1343
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||
@@ -866,17 +819,17 @@ msgstr ""
|
||||
"Renk karışımının doğru biçimi \"blend/bg_color/fg_color/alpha\"dır; \"%s\" "
|
||||
"bu biçime uymuyor"
|
||||
|
||||
#: ../src/ui/theme.c:1372
|
||||
#: ../src/ui/theme.c:1354
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "Renk karışımındaki \"%s\" alfa değeri ayrıştırılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1382
|
||||
#: ../src/ui/theme.c:1364
|
||||
#, c-format
|
||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
msgstr "Renk karışımının alfa değeri \"%s\", 0.0 ile 1.0 arasında değil"
|
||||
|
||||
#: ../src/ui/theme.c:1429
|
||||
#: ../src/ui/theme.c:1411
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
@@ -884,27 +837,27 @@ msgstr ""
|
||||
"Gölgelendirmenin doğru biçimi \"shade/bas_color/factor\"dır; \"%s\" bu "
|
||||
"biçime uymuyor"
|
||||
|
||||
#: ../src/ui/theme.c:1440
|
||||
#: ../src/ui/theme.c:1422
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr "Gölgeli rengin gölge katsayısı olan \"%s\" ayrıştırılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1450
|
||||
#: ../src/ui/theme.c:1432
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "Gölgeli rengin gölge katsayısı olan \"%s\", negatif"
|
||||
|
||||
#: ../src/ui/theme.c:1479
|
||||
#: ../src/ui/theme.c:1461
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "\"%s\" rengi ayrıştırılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:1790
|
||||
#: ../src/ui/theme.c:1778
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr "Kordinat ifadesi izin verilmeyen '%s' karakterini içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:1817
|
||||
#: ../src/ui/theme.c:1805
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contains floating point number '%s' which could not be "
|
||||
@@ -912,12 +865,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Kordinat ifadesi '%s' gerçel sayısını içeriyor ve bu sayı ayrıştırılamıyor"
|
||||
|
||||
#: ../src/ui/theme.c:1831
|
||||
#: ../src/ui/theme.c:1819
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr "Kordinat ifadesi ayrıştırılamayan '%s' tamsayısını içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:1953
|
||||
#: ../src/ui/theme.c:1940
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contained unknown operator at the start of this text: "
|
||||
@@ -925,17 +878,17 @@ msgid ""
|
||||
msgstr ""
|
||||
"Kordinat ifadesi bu metnin başında bilinmeyen bir işleç içeriyor: \"%s\""
|
||||
|
||||
#: ../src/ui/theme.c:2010
|
||||
#: ../src/ui/theme.c:1997
|
||||
#, c-format
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr "Kordinat ifadesi boş ya da anlaşılamadı"
|
||||
|
||||
#: ../src/ui/theme.c:2121 ../src/ui/theme.c:2131 ../src/ui/theme.c:2165
|
||||
#: ../src/ui/theme.c:2110 ../src/ui/theme.c:2120 ../src/ui/theme.c:2154
|
||||
#, c-format
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "Kordinat ifadesi sıfıra bölümle sonuçlanıyor"
|
||||
|
||||
#: ../src/ui/theme.c:2173
|
||||
#: ../src/ui/theme.c:2162
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||
@@ -943,23 +896,23 @@ msgstr ""
|
||||
"Kordinat ifadesi bir gerçel sayı üzerinde mod (kalan bulma) işlecini "
|
||||
"kullanmaya çalıştı"
|
||||
|
||||
#: ../src/ui/theme.c:2229
|
||||
#: ../src/ui/theme.c:2218
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
msgstr "Kordinat ifadesi işleneni beklenen \"%s\", işlecini içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:2238
|
||||
#: ../src/ui/theme.c:2227
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr "Kordinat ifadesi işleci beklenen bir işlenen içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:2246
|
||||
#: ../src/ui/theme.c:2235
|
||||
#, c-format
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr "Kordinat ifadesi bir işlenen yerine işleçle bitiyor"
|
||||
|
||||
#: ../src/ui/theme.c:2256
|
||||
#: ../src/ui/theme.c:2245
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||
@@ -968,38 +921,38 @@ msgstr ""
|
||||
"Kordinat ifadesi birbirlerinin izleyen ve aralarında işlenen olmayan \"%2$c"
|
||||
"\" ve \"%1$c\" işleçlerini içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:2407 ../src/ui/theme.c:2452
|
||||
#: ../src/ui/theme.c:2396 ../src/ui/theme.c:2441
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr ""
|
||||
"Kordinat ifadesi bilinmeyen bir değişken ya da sabit olan \"%s\" içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:2506
|
||||
#: ../src/ui/theme.c:2495
|
||||
#, c-format
|
||||
msgid "Coordinate expression parser overflowed its buffer."
|
||||
msgstr "Kordinat belirtim ayrıştırıcısı tamponundan taştı."
|
||||
|
||||
#: ../src/ui/theme.c:2535
|
||||
#: ../src/ui/theme.c:2524
|
||||
#, c-format
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr "Kordinat ifadesi sol parantezi olmayan bir sağ parantez içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:2599
|
||||
#: ../src/ui/theme.c:2588
|
||||
#, c-format
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr "Kordinat ifadesi sağ parantezi olmayan bir sol parantez içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:2610
|
||||
#: ../src/ui/theme.c:2599
|
||||
#, c-format
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr "Kordinat ifadesi göründüğü kadarıyla ne işleç ne de işlenen içeriyor"
|
||||
|
||||
#: ../src/ui/theme.c:2822 ../src/ui/theme.c:2842 ../src/ui/theme.c:2862
|
||||
#: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852
|
||||
#, c-format
|
||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||
msgstr "Tema bir hata ile sonuçlanan ifadeye sahip: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:4533
|
||||
#: ../src/ui/theme.c:4498
|
||||
#, c-format
|
||||
msgid ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||
@@ -1008,25 +961,25 @@ msgstr ""
|
||||
"Bu çerçeve biçeminde <button function=\"%s\" state=\"%s\" draw_ops=\"her "
|
||||
"neyse\"/> belirtilmek zorunda"
|
||||
|
||||
#: ../src/ui/theme.c:5066 ../src/ui/theme.c:5091
|
||||
#: ../src/ui/theme.c:5009 ../src/ui/theme.c:5034
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
msgstr ""
|
||||
"Eksik <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"her neyse\"/>"
|
||||
|
||||
#: ../src/ui/theme.c:5139
|
||||
#: ../src/ui/theme.c:5082
|
||||
#, c-format
|
||||
msgid "Failed to load theme \"%s\": %s\n"
|
||||
msgstr "\"%s\" teması yüklenemedi: %s\n"
|
||||
|
||||
#: ../src/ui/theme.c:5275 ../src/ui/theme.c:5282 ../src/ui/theme.c:5289
|
||||
#: ../src/ui/theme.c:5296 ../src/ui/theme.c:5303
|
||||
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
|
||||
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
|
||||
#, c-format
|
||||
msgid "No <%s> set for theme \"%s\""
|
||||
msgstr "\"%2$s\" temasında hiç <%1$s> atanmamış"
|
||||
|
||||
#: ../src/ui/theme.c:5311
|
||||
#: ../src/ui/theme.c:5254
|
||||
#, c-format
|
||||
msgid ""
|
||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||
@@ -1035,14 +988,14 @@ msgstr ""
|
||||
"\"%2$s\" temasında \"%1$s\" pencere türüne çerçeve biçemi atanmamış, bir "
|
||||
"<window type=\"%3$s\" style_set=\"her neyse\"/> öğesi ekleyin"
|
||||
|
||||
#: ../src/ui/theme.c:5709 ../src/ui/theme.c:5771 ../src/ui/theme.c:5834
|
||||
#: ../src/ui/theme.c:5650 ../src/ui/theme.c:5712 ../src/ui/theme.c:5775
|
||||
#, c-format
|
||||
msgid ""
|
||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
msgstr ""
|
||||
"Kullanıcı tanımlı sabitler büyük harfle başlamalıdır; \"%s\" buna uymuyor"
|
||||
|
||||
#: ../src/ui/theme.c:5717 ../src/ui/theme.c:5779 ../src/ui/theme.c:5842
|
||||
#: ../src/ui/theme.c:5658 ../src/ui/theme.c:5720 ../src/ui/theme.c:5783
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "\"%s\" sabit değeri zaten tanımlanmış"
|
||||
@@ -1425,7 +1378,7 @@ msgstr "<%s> öğesinin içinde metin bulunmamalıdır"
|
||||
msgid "<%s> specified twice for this theme"
|
||||
msgstr "Bu tema için <%s> iki kez belirtilmiş"
|
||||
|
||||
#: ../src/ui/theme-parser.c:4348
|
||||
#: ../src/ui/theme-parser.c:4334
|
||||
#, c-format
|
||||
msgid "Failed to find a valid file for theme %s\n"
|
||||
msgstr "Tema %s için geçerli bir dosya bulunamadı\n"
|
||||
@@ -1629,6 +1582,52 @@ msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||
msgstr ""
|
||||
"%d kordinat ifadesi %g saniye içinde ayrıştırıldı (%g saniye ortalama ile)\n"
|
||||
|
||||
#~ msgid "Comma-separated list of compositor plugins"
|
||||
#~ msgstr "Kompozisyon eklentilerinin listesi (virgül ile ayrılmış)"
|
||||
|
||||
#~ msgid "Live Hidden Windows"
|
||||
#~ msgstr "Çalışır Durumdaki Gizli Pencereler"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Determines whether hidden windows (i.e., minimized windows and windows on "
|
||||
#~ "other workspaces than the current one) should be kept alive."
|
||||
#~ msgstr ""
|
||||
#~ "Gizli pencerelerin (ö.r. küçültülmüş pencereler ve diğer çalışma "
|
||||
#~ "alanındaki pencereler) çalışır bırakılıp bırakılmayacağını belirler."
|
||||
|
||||
#~ msgid "Close Window"
|
||||
#~ msgstr "Pencereyi Kapat"
|
||||
|
||||
#~ msgid "Window Menu"
|
||||
#~ msgstr "Pencere Menüsü"
|
||||
|
||||
#~ msgid "Minimize Window"
|
||||
#~ msgstr "Pencereyi Küçült"
|
||||
|
||||
#~ msgid "Maximize Window"
|
||||
#~ msgstr "Pencereyi Büyült"
|
||||
|
||||
#~ msgid "Restore Window"
|
||||
#~ msgstr "Pencere Geri Getir"
|
||||
|
||||
#~ msgid "Roll Up Window"
|
||||
#~ msgstr "Pencereyi Yukarı Sar"
|
||||
|
||||
#~ msgid "Unroll Window"
|
||||
#~ msgstr "Pencereyi Geri Sar"
|
||||
|
||||
#~ msgid "Keep Window On Top"
|
||||
#~ msgstr "Pencereyi Üstte Tut"
|
||||
|
||||
#~ msgid "Remove Window From Top"
|
||||
#~ msgstr "Pencereyi Üstten Kaldır"
|
||||
|
||||
#~ msgid "Always On Visible Workspace"
|
||||
#~ msgstr "Her Zaman Görünen Çalışma Alanında"
|
||||
|
||||
#~ msgid "Put Window On Only One Workspace"
|
||||
#~ msgstr "Pencereyi Sadece Bir Çalışma Alanına Yerleştir"
|
||||
|
||||
#~ msgid "Switch to workspace 1"
|
||||
#~ msgstr "Çalışma alanı 1'e geç"
|
||||
|
||||
|
1100
po/zh_CN.po
1100
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
1294
po/zh_HK.po
1294
po/zh_HK.po
File diff suppressed because it is too large
Load Diff
1301
po/zh_TW.po
1301
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@@ -52,7 +52,6 @@ libmutter_la_SOURCES = \
|
||||
compositor/meta-shadow-factory.c \
|
||||
compositor/meta-shadow-factory-private.h \
|
||||
compositor/meta-shaped-texture.c \
|
||||
compositor/meta-shaped-texture.h \
|
||||
compositor/meta-texture-rectangle.c \
|
||||
compositor/meta-texture-rectangle.h \
|
||||
compositor/meta-texture-tower.c \
|
||||
@@ -76,6 +75,20 @@ libmutter_la_SOURCES = \
|
||||
core/constraints.h \
|
||||
core/core.c \
|
||||
core/delete.c \
|
||||
core/device.c \
|
||||
meta/device.h \
|
||||
core/device-keyboard.c \
|
||||
core/device-keyboard.h \
|
||||
core/device-pointer.c \
|
||||
core/device-pointer.h \
|
||||
core/device-private.h \
|
||||
core/device-map.c \
|
||||
meta/device-map.h \
|
||||
core/device-map-private.h \
|
||||
core/device-map-core.c \
|
||||
core/device-map-core.h \
|
||||
core/devices-core.c \
|
||||
core/devices-core.h \
|
||||
core/display.c \
|
||||
core/display-private.h \
|
||||
meta/display.h \
|
||||
@@ -98,6 +111,8 @@ libmutter_la_SOURCES = \
|
||||
meta/group.h \
|
||||
core/iconcache.c \
|
||||
core/iconcache.h \
|
||||
core/input-events.c \
|
||||
core/input-events.h \
|
||||
core/keybindings.c \
|
||||
core/keybindings-private.h \
|
||||
core/main.c \
|
||||
@@ -131,8 +146,6 @@ libmutter_la_SOURCES = \
|
||||
core/core.h \
|
||||
ui/ui.h \
|
||||
inlinepixbufs.h \
|
||||
ui/fixedtip.c \
|
||||
ui/fixedtip.h \
|
||||
ui/frames.c \
|
||||
ui/frames.h \
|
||||
ui/menu.c \
|
||||
@@ -154,6 +167,14 @@ libmutter_la_SOURCES = \
|
||||
ui/preview-widget.c \
|
||||
$(mutter_built_sources)
|
||||
|
||||
if HAVE_XINPUT2
|
||||
libmutter_la_SOURCES += \
|
||||
core/device-map-xi2.c \
|
||||
core/device-map-xi2.h \
|
||||
core/devices-xi2.c \
|
||||
core/devices-xi2.h
|
||||
endif
|
||||
|
||||
libmutter_la_LDFLAGS = -no-undefined
|
||||
libmutter_la_LIBADD = $(MUTTER_LIBS)
|
||||
|
||||
@@ -164,6 +185,8 @@ libmutterinclude_base_headers = \
|
||||
meta/common.h \
|
||||
meta/compositor-mutter.h \
|
||||
meta/compositor.h \
|
||||
meta/device.h \
|
||||
meta/device-map.h \
|
||||
meta/display.h \
|
||||
meta/errors.h \
|
||||
meta/gradient.h \
|
||||
@@ -172,6 +195,7 @@ libmutterinclude_base_headers = \
|
||||
meta/main.h \
|
||||
meta/meta-background-actor.h \
|
||||
meta/meta-plugin.h \
|
||||
meta/meta-shaped-texture.h \
|
||||
meta/meta-shadow-factory.h \
|
||||
meta/meta-window-actor.h \
|
||||
meta/prefs.h \
|
||||
@@ -224,7 +248,7 @@ INTROSPECTION_GIRS = Meta-$(api_version).gir
|
||||
|
||||
Meta-$(api_version).gir: libmutter.la
|
||||
@META_GIR@_INCLUDES = GObject-2.0 GDesktopEnums-3.0 Gdk-3.0 Gtk-3.0 Clutter-1.0 xlib-2.0 xfixes-4.0
|
||||
@META_GIR@_PACKAGES = clutter-1.0 gtk+-3.0
|
||||
@META_GIR@_EXPORT_PACKAGES = libmutter
|
||||
@META_GIR@_CFLAGS = $(INCLUDES)
|
||||
@META_GIR@_LIBS = libmutter.la
|
||||
@META_GIR@_FILES = \
|
||||
|
@@ -55,9 +55,6 @@ struct _MetaCompScreen
|
||||
};
|
||||
|
||||
void meta_switch_workspace_completed (MetaScreen *screen);
|
||||
void meta_set_stage_input_region (MetaScreen *screen,
|
||||
XserverRegion region);
|
||||
void meta_empty_stage_input_region (MetaScreen *screen);
|
||||
|
||||
gboolean meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
MetaPlugin *plugin,
|
||||
|
@@ -18,6 +18,8 @@
|
||||
#include "meta-background-actor-private.h"
|
||||
#include "window-private.h" /* to check window->hidden */
|
||||
#include "display-private.h" /* for meta_display_lookup_x_window() */
|
||||
#include "core.h" /* for meta_core_select_events() */
|
||||
#include "input-events.h"
|
||||
#include <X11/extensions/shape.h>
|
||||
#include <X11/extensions/Xcomposite.h>
|
||||
|
||||
@@ -155,7 +157,6 @@ get_output_window (MetaScreen *screen)
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdisplay = meta_display_get_xdisplay (display);
|
||||
Window output, xroot;
|
||||
XWindowAttributes attr;
|
||||
long event_mask;
|
||||
|
||||
xroot = meta_screen_get_xroot (screen);
|
||||
@@ -169,13 +170,7 @@ get_output_window (MetaScreen *screen)
|
||||
KeyPressMask | KeyReleaseMask;
|
||||
|
||||
output = XCompositeGetOverlayWindow (xdisplay, xroot);
|
||||
|
||||
if (XGetWindowAttributes (xdisplay, output, &attr))
|
||||
{
|
||||
event_mask |= attr.your_event_mask;
|
||||
}
|
||||
|
||||
XSelectInput (xdisplay, output, event_mask);
|
||||
meta_core_select_events (xdisplay, output, event_mask, TRUE);
|
||||
|
||||
return output;
|
||||
}
|
||||
@@ -347,26 +342,34 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
* merge the two.
|
||||
*/
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdpy = meta_display_get_xdisplay (display);
|
||||
MetaCompositor *compositor = display->compositor;
|
||||
gboolean pointer_grabbed = FALSE;
|
||||
gboolean keyboard_grabbed = FALSE;
|
||||
int result;
|
||||
gboolean result;
|
||||
MetaDevice *device;
|
||||
MetaGrabInfo *grab_info;
|
||||
|
||||
if (compositor->modal_plugin != NULL || display->grab_op != META_GRAB_OP_NONE)
|
||||
/* FIXME: need a real device here, and probably
|
||||
* some exclusion mode for other devices */
|
||||
device = meta_device_map_lookup (display->device_map,
|
||||
META_CORE_POINTER_ID);
|
||||
|
||||
grab_info = meta_display_get_grab_info (display, device);
|
||||
|
||||
if (compositor->modal_plugin != NULL || grab_info != NULL)
|
||||
return FALSE;
|
||||
|
||||
if ((options & META_MODAL_POINTER_ALREADY_GRABBED) == 0)
|
||||
{
|
||||
result = XGrabPointer (xdpy, grab_window,
|
||||
False, /* owner_events */
|
||||
(ButtonPressMask | ButtonReleaseMask |
|
||||
EnterWindowMask | LeaveWindowMask | PointerMotionMask),
|
||||
GrabModeAsync, GrabModeAsync,
|
||||
None, /* confine to */
|
||||
cursor,
|
||||
timestamp);
|
||||
if (result != Success)
|
||||
result = meta_device_grab (device,
|
||||
grab_window,
|
||||
(ButtonPressMask | ButtonReleaseMask |
|
||||
EnterWindowMask | LeaveWindowMask | PointerMotionMask),
|
||||
cursor,
|
||||
FALSE,
|
||||
FALSE,
|
||||
timestamp);
|
||||
if (!result)
|
||||
goto fail;
|
||||
|
||||
pointer_grabbed = TRUE;
|
||||
@@ -374,22 +377,25 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
|
||||
if ((options & META_MODAL_KEYBOARD_ALREADY_GRABBED) == 0)
|
||||
{
|
||||
result = XGrabKeyboard (xdpy, grab_window,
|
||||
False, /* owner_events */
|
||||
GrabModeAsync, GrabModeAsync,
|
||||
timestamp);
|
||||
|
||||
if (result != Success)
|
||||
result = meta_device_grab (meta_device_get_paired_device (device),
|
||||
grab_window,
|
||||
(KeyPressMask | KeyReleaseMask),
|
||||
META_CURSOR_DEFAULT,
|
||||
FALSE, FALSE,
|
||||
timestamp);
|
||||
if (!result)
|
||||
goto fail;
|
||||
|
||||
keyboard_grabbed = TRUE;
|
||||
}
|
||||
|
||||
display->grab_op = META_GRAB_OP_COMPOSITOR;
|
||||
display->grab_window = NULL;
|
||||
display->grab_screen = screen;
|
||||
display->grab_have_pointer = TRUE;
|
||||
display->grab_have_keyboard = TRUE;
|
||||
grab_info = meta_display_create_grab_info (display, device);
|
||||
|
||||
grab_info->grab_op = META_GRAB_OP_COMPOSITOR;
|
||||
grab_info->grab_window = NULL;
|
||||
grab_info->grab_screen = screen;
|
||||
grab_info->grab_have_pointer = TRUE;
|
||||
grab_info->grab_have_keyboard = TRUE;
|
||||
|
||||
compositor->modal_plugin = plugin;
|
||||
|
||||
@@ -397,9 +403,9 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||
|
||||
fail:
|
||||
if (pointer_grabbed)
|
||||
XUngrabPointer (xdpy, timestamp);
|
||||
meta_device_ungrab (device, timestamp);
|
||||
if (keyboard_grabbed)
|
||||
XUngrabKeyboard (xdpy, timestamp);
|
||||
meta_device_ungrab (meta_device_get_paired_device (device), timestamp);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@@ -410,20 +416,19 @@ meta_end_modal_for_plugin (MetaScreen *screen,
|
||||
guint32 timestamp)
|
||||
{
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdpy = meta_display_get_xdisplay (display);
|
||||
MetaCompositor *compositor = display->compositor;
|
||||
MetaDevice *device;
|
||||
|
||||
g_return_if_fail (compositor->modal_plugin == plugin);
|
||||
|
||||
XUngrabPointer (xdpy, timestamp);
|
||||
XUngrabKeyboard (xdpy, timestamp);
|
||||
/* FIXME: need a real device here */
|
||||
device = meta_device_map_lookup (display->device_map,
|
||||
META_CORE_POINTER_ID);
|
||||
|
||||
display->grab_op = META_GRAB_OP_NONE;
|
||||
display->grab_window = NULL;
|
||||
display->grab_screen = NULL;
|
||||
display->grab_have_pointer = FALSE;
|
||||
display->grab_have_keyboard = FALSE;
|
||||
meta_device_ungrab (device, timestamp);
|
||||
meta_device_ungrab (meta_device_get_paired_device (device), timestamp);
|
||||
|
||||
meta_display_remove_grab_info (display, device);
|
||||
compositor->modal_plugin = NULL;
|
||||
}
|
||||
|
||||
@@ -456,7 +461,6 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
Window xroot = meta_screen_get_xroot (screen);
|
||||
Window xwin;
|
||||
gint width, height;
|
||||
XWindowAttributes attr;
|
||||
long event_mask;
|
||||
guint n_retries;
|
||||
guint max_retries;
|
||||
@@ -533,12 +537,7 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
KeyPressMask | KeyReleaseMask |
|
||||
StructureNotifyMask;
|
||||
|
||||
if (XGetWindowAttributes (xdisplay, xwin, &attr))
|
||||
{
|
||||
event_mask |= attr.your_event_mask;
|
||||
}
|
||||
|
||||
XSelectInput (xdisplay, xwin, event_mask);
|
||||
meta_core_select_events (xdisplay, xwin, event_mask, TRUE);
|
||||
|
||||
info->window_group = meta_window_group_new (screen);
|
||||
info->background_actor = meta_background_actor_new_for_screen (screen);
|
||||
@@ -557,9 +556,7 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
|
||||
clutter_actor_hide (info->hidden_group);
|
||||
|
||||
info->plugin_mgr =
|
||||
meta_plugin_manager_get (screen);
|
||||
meta_plugin_manager_initialize (info->plugin_mgr);
|
||||
info->plugin_mgr = meta_plugin_manager_new (screen);
|
||||
|
||||
/*
|
||||
* Delay the creation of the overlay window as long as we can, to avoid
|
||||
@@ -697,9 +694,15 @@ meta_compositor_set_updates (MetaCompositor *compositor,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_grabbed_event (XEvent *event)
|
||||
is_grabbed_event (MetaDisplay *display,
|
||||
XEvent *event)
|
||||
{
|
||||
switch (event->xany.type)
|
||||
guint evtype;
|
||||
|
||||
if (!meta_input_event_get_type (display, event, &evtype))
|
||||
return FALSE;
|
||||
|
||||
switch (evtype)
|
||||
{
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
@@ -732,7 +735,8 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
||||
XEvent *event,
|
||||
MetaWindow *window)
|
||||
{
|
||||
if (compositor->modal_plugin && is_grabbed_event (event))
|
||||
if (compositor->modal_plugin &&
|
||||
is_grabbed_event (compositor->display, event))
|
||||
{
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (compositor->modal_plugin);
|
||||
|
||||
@@ -871,29 +875,6 @@ meta_compositor_unmaximize_window (MetaCompositor *compositor,
|
||||
meta_window_actor_unmaximize (window_actor, old_rect, new_rect);
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_update_workspace_geometry (MetaCompositor *compositor,
|
||||
MetaWorkspace *workspace)
|
||||
{
|
||||
#if 0
|
||||
/* FIXME -- should do away with this function in favour of MetaWorkspace
|
||||
* signal.
|
||||
*/
|
||||
MetaScreen *screen = meta_workspace_get_screen (workspace);
|
||||
MetaCompScreen *info;
|
||||
MetaPluginManager *mgr;
|
||||
|
||||
DEBUG_TRACE ("meta_compositor_update_workspace_geometry\n");
|
||||
info = meta_screen_get_compositor_data (screen);
|
||||
mgr = info->plugin_mgr;
|
||||
|
||||
if (!mgr || !workspace)
|
||||
return;
|
||||
|
||||
meta_plugin_manager_update_workspace (mgr, workspace);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_switch_workspace (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
|
@@ -28,6 +28,9 @@
|
||||
#define COGL_ENABLE_EXPERIMENTAL_API
|
||||
#include <cogl/cogl-texture-pixmap-x11.h>
|
||||
|
||||
#define CLUTTER_ENABLE_EXPERIMENTAL_API
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
#include <X11/Xatom.h>
|
||||
|
||||
#include "cogl-utils.h"
|
||||
@@ -252,6 +255,8 @@ meta_background_actor_dispose (GObject *object)
|
||||
cogl_handle_unref (priv->material);
|
||||
priv->material = COGL_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (meta_background_actor_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -537,9 +542,11 @@ meta_background_actor_update (MetaScreen *screen)
|
||||
if (root_pixmap_id != None)
|
||||
{
|
||||
CoglHandle texture;
|
||||
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||
GError *error = NULL;
|
||||
|
||||
meta_error_trap_push (display);
|
||||
texture = cogl_texture_pixmap_x11_new (root_pixmap_id, FALSE);
|
||||
texture = cogl_texture_pixmap_x11_new (ctx, root_pixmap_id, FALSE, &error);
|
||||
meta_error_trap_pop (display);
|
||||
|
||||
if (texture != COGL_INVALID_HANDLE)
|
||||
@@ -550,6 +557,12 @@ meta_background_actor_update (MetaScreen *screen)
|
||||
background->have_pixmap = True;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_warning ("Failed to create background texture from pixmap: %s",
|
||||
error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
}
|
||||
|
||||
background->have_pixmap = False;
|
||||
|
@@ -35,34 +35,32 @@
|
||||
|
||||
#include <clutter/x11/clutter-x11.h>
|
||||
|
||||
static GSList *plugin_types;
|
||||
|
||||
/*
|
||||
* We have one "default plugin manager" that acts for the first screen,
|
||||
* but also can be used before we open any screens, and additional
|
||||
* plugin managers for each screen. (This is ugly. Probably we should
|
||||
* have one plugin manager and only make the plugins per-screen.)
|
||||
*/
|
||||
static MetaPluginManager *default_plugin_manager;
|
||||
static GType plugin_type = G_TYPE_NONE;
|
||||
|
||||
struct MetaPluginManager
|
||||
{
|
||||
MetaScreen *screen;
|
||||
|
||||
GList /* MetaPlugin */ *plugins; /* TODO -- maybe use hash table */
|
||||
MetaScreen *screen;
|
||||
MetaPlugin *plugin;
|
||||
};
|
||||
|
||||
void
|
||||
meta_plugin_manager_set_plugin_type (GType gtype)
|
||||
{
|
||||
if (plugin_type != G_TYPE_NONE)
|
||||
meta_fatal ("Mutter plugin already set: %s", g_type_name (plugin_type));
|
||||
|
||||
plugin_type = gtype;
|
||||
}
|
||||
|
||||
/*
|
||||
* Loads the given plugin.
|
||||
*/
|
||||
void
|
||||
meta_plugin_manager_load (MetaPluginManager *plugin_mgr,
|
||||
const gchar *plugin_name)
|
||||
meta_plugin_manager_load (const gchar *plugin_name)
|
||||
{
|
||||
const gchar *dpath = MUTTER_PLUGIN_DIR "/";
|
||||
gchar *path;
|
||||
MetaModule *module;
|
||||
GType plugin_type;
|
||||
|
||||
if (g_path_is_absolute (plugin_name))
|
||||
path = g_strdup (plugin_name);
|
||||
@@ -81,162 +79,57 @@ meta_plugin_manager_load (MetaPluginManager *plugin_mgr,
|
||||
exit (1);
|
||||
}
|
||||
|
||||
plugin_type = meta_module_get_plugin_type (module);
|
||||
meta_plugin_manager_register (plugin_mgr, plugin_type);
|
||||
meta_plugin_manager_set_plugin_type (meta_module_get_plugin_type (module));
|
||||
|
||||
g_type_module_unuse (G_TYPE_MODULE (module));
|
||||
g_free (path);
|
||||
}
|
||||
|
||||
/*
|
||||
* Registers the given plugin type
|
||||
*/
|
||||
void
|
||||
meta_plugin_manager_register (MetaPluginManager *plugin_mgr,
|
||||
GType plugin_type)
|
||||
{
|
||||
MetaPlugin *plugin;
|
||||
|
||||
plugin_types = g_slist_prepend (plugin_types, GSIZE_TO_POINTER (plugin_type));
|
||||
|
||||
plugin = g_object_new (plugin_type, NULL);
|
||||
plugin_mgr->plugins = g_list_prepend (plugin_mgr->plugins, plugin);
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_manager_initialize (MetaPluginManager *plugin_mgr)
|
||||
{
|
||||
GList *iter;
|
||||
|
||||
if (!plugin_mgr->plugins)
|
||||
{
|
||||
/*
|
||||
* If no plugins are specified, load the default plugin.
|
||||
*/
|
||||
meta_plugin_manager_load (plugin_mgr, "default");
|
||||
}
|
||||
|
||||
for (iter = plugin_mgr->plugins; iter; iter = iter->next)
|
||||
{
|
||||
MetaPlugin *plugin = (MetaPlugin*) iter->data;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
g_object_set (plugin,
|
||||
"screen", plugin_mgr->screen,
|
||||
NULL);
|
||||
|
||||
if (klass->start)
|
||||
klass->start (plugin);
|
||||
}
|
||||
}
|
||||
|
||||
static MetaPluginManager *
|
||||
MetaPluginManager *
|
||||
meta_plugin_manager_new (MetaScreen *screen)
|
||||
{
|
||||
MetaPluginManager *plugin_mgr;
|
||||
MetaPluginClass *klass;
|
||||
MetaPlugin *plugin;
|
||||
|
||||
plugin_mgr = g_new0 (MetaPluginManager, 1);
|
||||
plugin_mgr->screen = screen;
|
||||
plugin_mgr->plugin = plugin = g_object_new (plugin_type, "screen", screen, NULL);
|
||||
|
||||
if (screen)
|
||||
g_object_set_data (G_OBJECT (screen), "meta-plugin-manager", plugin_mgr);
|
||||
klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (klass->start)
|
||||
klass->start (plugin);
|
||||
|
||||
return plugin_mgr;
|
||||
}
|
||||
|
||||
MetaPluginManager *
|
||||
meta_plugin_manager_get_default (void)
|
||||
{
|
||||
if (!default_plugin_manager)
|
||||
{
|
||||
default_plugin_manager = meta_plugin_manager_new (NULL);
|
||||
}
|
||||
|
||||
return default_plugin_manager;
|
||||
}
|
||||
|
||||
MetaPluginManager *
|
||||
meta_plugin_manager_get (MetaScreen *screen)
|
||||
{
|
||||
MetaPluginManager *plugin_mgr;
|
||||
|
||||
plugin_mgr = g_object_get_data (G_OBJECT (screen), "meta-plugin-manager");
|
||||
if (plugin_mgr)
|
||||
return plugin_mgr;
|
||||
|
||||
if (!default_plugin_manager)
|
||||
meta_plugin_manager_get_default ();
|
||||
|
||||
if (!default_plugin_manager->screen)
|
||||
{
|
||||
/* The default plugin manager is so far unused, we can recycle it */
|
||||
default_plugin_manager->screen = screen;
|
||||
g_object_set_data (G_OBJECT (screen), "meta-plugin-manager", default_plugin_manager);
|
||||
|
||||
return default_plugin_manager;
|
||||
}
|
||||
else
|
||||
{
|
||||
GSList *iter;
|
||||
GType plugin_type;
|
||||
MetaPlugin *plugin;
|
||||
|
||||
plugin_mgr = meta_plugin_manager_new (screen);
|
||||
|
||||
for (iter = plugin_types; iter; iter = iter->next)
|
||||
{
|
||||
plugin_type = (GType)GPOINTER_TO_SIZE (iter->data);
|
||||
plugin = g_object_new (plugin_type, "screen", screen, NULL);
|
||||
plugin_mgr->plugins = g_list_prepend (plugin_mgr->plugins, plugin);
|
||||
}
|
||||
|
||||
return plugin_mgr;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_plugin_manager_kill_window_effects (MetaPluginManager *plugin_mgr,
|
||||
MetaWindowActor *actor)
|
||||
{
|
||||
GList *l = plugin_mgr->plugins;
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
while (l)
|
||||
{
|
||||
MetaPlugin *plugin = l->data;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!meta_plugin_disabled (plugin)
|
||||
&& klass->kill_window_effects)
|
||||
klass->kill_window_effects (plugin, actor);
|
||||
|
||||
l = l->next;
|
||||
}
|
||||
if (klass->kill_window_effects)
|
||||
klass->kill_window_effects (plugin, actor);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_plugin_manager_kill_switch_workspace (MetaPluginManager *plugin_mgr)
|
||||
{
|
||||
GList *l = plugin_mgr->plugins;
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
while (l)
|
||||
{
|
||||
MetaPlugin *plugin = l->data;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!meta_plugin_disabled (plugin)
|
||||
&& (meta_plugin_features (plugin) & META_PLUGIN_SWITCH_WORKSPACE)
|
||||
&& klass->kill_switch_workspace)
|
||||
klass->kill_switch_workspace (plugin);
|
||||
|
||||
l = l->next;
|
||||
}
|
||||
if (klass->kill_switch_workspace)
|
||||
klass->kill_switch_workspace (plugin);
|
||||
}
|
||||
|
||||
/*
|
||||
* Public method that the compositor hooks into for events that require
|
||||
* no additional parameters.
|
||||
*
|
||||
* Returns TRUE if at least one of the plugins handled the event type (i.e.,
|
||||
* Returns TRUE if the plugin handled the event type (i.e.,
|
||||
* if the return value is FALSE, there will be no subsequent call to the
|
||||
* manager completed() callback, and the compositor must ensure that any
|
||||
* appropriate post-effect cleanup is carried out.
|
||||
@@ -246,60 +139,48 @@ meta_plugin_manager_event_simple (MetaPluginManager *plugin_mgr,
|
||||
MetaWindowActor *actor,
|
||||
unsigned long event)
|
||||
{
|
||||
GList *l = plugin_mgr->plugins;
|
||||
gboolean retval = FALSE;
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
MetaDisplay *display = meta_screen_get_display (plugin_mgr->screen);
|
||||
gboolean retval = FALSE;
|
||||
|
||||
if (display->display_opening)
|
||||
return FALSE;
|
||||
|
||||
while (l)
|
||||
switch (event)
|
||||
{
|
||||
MetaPlugin *plugin = l->data;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!meta_plugin_disabled (plugin) &&
|
||||
(meta_plugin_features (plugin) & event))
|
||||
case META_PLUGIN_MINIMIZE:
|
||||
if (klass->minimize)
|
||||
{
|
||||
retval = TRUE;
|
||||
meta_plugin_manager_kill_window_effects (plugin_mgr,
|
||||
actor);
|
||||
|
||||
switch (event)
|
||||
{
|
||||
case META_PLUGIN_MINIMIZE:
|
||||
if (klass->minimize)
|
||||
{
|
||||
meta_plugin_manager_kill_window_effects (
|
||||
plugin_mgr,
|
||||
actor);
|
||||
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->minimize (plugin, actor);
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_MAP:
|
||||
if (klass->map)
|
||||
{
|
||||
meta_plugin_manager_kill_window_effects (
|
||||
plugin_mgr,
|
||||
actor);
|
||||
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->map (plugin, actor);
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_DESTROY:
|
||||
if (klass->destroy)
|
||||
{
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->destroy (plugin, actor);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_warning ("Incorrect handler called for event %lu", event);
|
||||
}
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->minimize (plugin, actor);
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_MAP:
|
||||
if (klass->map)
|
||||
{
|
||||
retval = TRUE;
|
||||
meta_plugin_manager_kill_window_effects (plugin_mgr,
|
||||
actor);
|
||||
|
||||
l = l->next;
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->map (plugin, actor);
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_DESTROY:
|
||||
if (klass->destroy)
|
||||
{
|
||||
retval = TRUE;
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->destroy (plugin, actor);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_warning ("Incorrect handler called for event %lu", event);
|
||||
}
|
||||
|
||||
return retval;
|
||||
@@ -309,7 +190,7 @@ meta_plugin_manager_event_simple (MetaPluginManager *plugin_mgr,
|
||||
* The public method that the compositor hooks into for maximize and unmaximize
|
||||
* events.
|
||||
*
|
||||
* Returns TRUE if at least one of the plugins handled the event type (i.e.,
|
||||
* Returns TRUE if the plugin handled the event type (i.e.,
|
||||
* if the return value is FALSE, there will be no subsequent call to the
|
||||
* manager completed() callback, and the compositor must ensure that any
|
||||
* appropriate post-effect cleanup is carried out.
|
||||
@@ -323,57 +204,44 @@ meta_plugin_manager_event_maximize (MetaPluginManager *plugin_mgr,
|
||||
gint target_width,
|
||||
gint target_height)
|
||||
{
|
||||
GList *l = plugin_mgr->plugins;
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
MetaDisplay *display = meta_screen_get_display (plugin_mgr->screen);
|
||||
gboolean retval = FALSE;
|
||||
MetaDisplay *display = meta_screen_get_display (plugin_mgr->screen);
|
||||
|
||||
if (display->display_opening)
|
||||
return FALSE;
|
||||
|
||||
while (l)
|
||||
switch (event)
|
||||
{
|
||||
MetaPlugin *plugin = l->data;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!meta_plugin_disabled (plugin) &&
|
||||
(meta_plugin_features (plugin) & event))
|
||||
case META_PLUGIN_MAXIMIZE:
|
||||
if (klass->maximize)
|
||||
{
|
||||
retval = TRUE;
|
||||
meta_plugin_manager_kill_window_effects (plugin_mgr,
|
||||
actor);
|
||||
|
||||
switch (event)
|
||||
{
|
||||
case META_PLUGIN_MAXIMIZE:
|
||||
if (klass->maximize)
|
||||
{
|
||||
meta_plugin_manager_kill_window_effects (
|
||||
plugin_mgr,
|
||||
actor);
|
||||
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->maximize (plugin, actor,
|
||||
target_x, target_y,
|
||||
target_width, target_height);
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_UNMAXIMIZE:
|
||||
if (klass->unmaximize)
|
||||
{
|
||||
meta_plugin_manager_kill_window_effects (
|
||||
plugin_mgr,
|
||||
actor);
|
||||
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->unmaximize (plugin, actor,
|
||||
target_x, target_y,
|
||||
target_width, target_height);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_warning ("Incorrect handler called for event %lu", event);
|
||||
}
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->maximize (plugin, actor,
|
||||
target_x, target_y,
|
||||
target_width, target_height);
|
||||
}
|
||||
break;
|
||||
case META_PLUGIN_UNMAXIMIZE:
|
||||
if (klass->unmaximize)
|
||||
{
|
||||
retval = TRUE;
|
||||
meta_plugin_manager_kill_window_effects (plugin_mgr,
|
||||
actor);
|
||||
|
||||
l = l->next;
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->unmaximize (plugin, actor,
|
||||
target_x, target_y,
|
||||
target_width, target_height);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_warning ("Incorrect handler called for event %lu", event);
|
||||
}
|
||||
|
||||
return retval;
|
||||
@@ -382,7 +250,7 @@ meta_plugin_manager_event_maximize (MetaPluginManager *plugin_mgr,
|
||||
/*
|
||||
* The public method that the compositor hooks into for desktop switching.
|
||||
*
|
||||
* Returns TRUE if at least one of the plugins handled the event type (i.e.,
|
||||
* Returns TRUE if the plugin handled the event type (i.e.,
|
||||
* if the return value is FALSE, there will be no subsequent call to the
|
||||
* manager completed() callback, and the compositor must ensure that any
|
||||
* appropriate post-effect cleanup is carried out.
|
||||
@@ -393,32 +261,21 @@ meta_plugin_manager_switch_workspace (MetaPluginManager *plugin_mgr,
|
||||
gint to,
|
||||
MetaMotionDirection direction)
|
||||
{
|
||||
GList *l = plugin_mgr->plugins;
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
MetaDisplay *display = meta_screen_get_display (plugin_mgr->screen);
|
||||
gboolean retval = FALSE;
|
||||
MetaDisplay *display = meta_screen_get_display (plugin_mgr->screen);
|
||||
|
||||
if (display->display_opening)
|
||||
return FALSE;
|
||||
|
||||
while (l)
|
||||
if (klass->switch_workspace)
|
||||
{
|
||||
MetaPlugin *plugin = l->data;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
retval = TRUE;
|
||||
meta_plugin_manager_kill_switch_workspace (plugin_mgr);
|
||||
|
||||
if (!meta_plugin_disabled (plugin) &&
|
||||
(meta_plugin_features (plugin) & META_PLUGIN_SWITCH_WORKSPACE))
|
||||
{
|
||||
if (klass->switch_workspace)
|
||||
{
|
||||
retval = TRUE;
|
||||
meta_plugin_manager_kill_switch_workspace (plugin_mgr);
|
||||
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->switch_workspace (plugin, from, to, direction);
|
||||
}
|
||||
}
|
||||
|
||||
l = l->next;
|
||||
_meta_plugin_effect_started (plugin);
|
||||
klass->switch_workspace (plugin, from, to, direction);
|
||||
}
|
||||
|
||||
return retval;
|
||||
@@ -427,7 +284,7 @@ meta_plugin_manager_switch_workspace (MetaPluginManager *plugin_mgr,
|
||||
/*
|
||||
* The public method that the compositor hooks into for desktop switching.
|
||||
*
|
||||
* Returns TRUE if at least one of the plugins handled the event type (i.e.,
|
||||
* Returns TRUE if the plugin handled the event type (i.e.,
|
||||
* if the return value is FALSE, there will be no subsequent call to the
|
||||
* manager completed() callback, and the compositor must ensure that any
|
||||
* appropriate post-effect cleanup is carried out.
|
||||
@@ -436,49 +293,20 @@ gboolean
|
||||
meta_plugin_manager_xevent_filter (MetaPluginManager *plugin_mgr,
|
||||
XEvent *xev)
|
||||
{
|
||||
GList *l;
|
||||
gboolean have_plugin_xevent_func;
|
||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (!plugin_mgr)
|
||||
return FALSE;
|
||||
|
||||
l = plugin_mgr->plugins;
|
||||
|
||||
/* We need to make sure that clutter gets certain events, like
|
||||
* ConfigureNotify on the stage window. If there is a plugin that
|
||||
* provides an xevent_filter function, then it's the responsibility
|
||||
* of that plugin to pass events to Clutter. Otherwise, we send the
|
||||
* event directly to Clutter ourselves.
|
||||
*
|
||||
* What happens if there are two plugins with xevent_filter functions
|
||||
* is undefined; in general, multiple competing plugins are something
|
||||
* we don't support well or care much about.
|
||||
*
|
||||
* FIXME: Really, we should just always handle sending the event to
|
||||
* clutter if a plugin doesn't report the event as handled by
|
||||
* returning TRUE, but it doesn't seem worth breaking compatibility
|
||||
* of the plugin interface right now to achieve this; the way it is
|
||||
* now works fine in practice.
|
||||
*/
|
||||
have_plugin_xevent_func = FALSE;
|
||||
|
||||
while (l)
|
||||
{
|
||||
MetaPlugin *plugin = l->data;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (klass->xevent_filter)
|
||||
{
|
||||
have_plugin_xevent_func = TRUE;
|
||||
if (klass->xevent_filter (plugin, xev) == TRUE)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
l = l->next;
|
||||
}
|
||||
|
||||
if (!have_plugin_xevent_func)
|
||||
if (klass->xevent_filter)
|
||||
return klass->xevent_filter (plugin, xev);
|
||||
else
|
||||
return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
@@ -46,14 +46,9 @@
|
||||
*/
|
||||
typedef struct MetaPluginManager MetaPluginManager;
|
||||
|
||||
MetaPluginManager * meta_plugin_manager_get (MetaScreen *screen);
|
||||
MetaPluginManager * meta_plugin_manager_get_default (void);
|
||||
MetaPluginManager * meta_plugin_manager_new (MetaScreen *screen);
|
||||
|
||||
void meta_plugin_manager_load (MetaPluginManager *mgr,
|
||||
const gchar *plugin_name);
|
||||
void meta_plugin_manager_register (MetaPluginManager *mgr,
|
||||
GType plugin_type);
|
||||
void meta_plugin_manager_initialize (MetaPluginManager *mgr);
|
||||
void meta_plugin_manager_load (const gchar *plugin_name);
|
||||
|
||||
gboolean meta_plugin_manager_event_simple (MetaPluginManager *mgr,
|
||||
MetaWindowActor *actor,
|
||||
@@ -66,10 +61,6 @@ gboolean meta_plugin_manager_event_maximize (MetaPluginManager *mgr,
|
||||
gint target_y,
|
||||
gint target_width,
|
||||
gint target_height);
|
||||
void meta_plugin_manager_update_workspaces (MetaPluginManager *mgr);
|
||||
|
||||
void meta_plugin_manager_update_workspace (MetaPluginManager *mgr,
|
||||
MetaWorkspace *w);
|
||||
|
||||
gboolean meta_plugin_manager_switch_workspace (MetaPluginManager *mgr,
|
||||
gint from,
|
||||
|
@@ -44,74 +44,17 @@ enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_SCREEN,
|
||||
PROP_FEATURES,
|
||||
PROP_DISABLED,
|
||||
PROP_DEBUG_MODE,
|
||||
};
|
||||
|
||||
struct _MetaPluginPrivate
|
||||
{
|
||||
MetaScreen *screen;
|
||||
gulong features;
|
||||
|
||||
gint running;
|
||||
|
||||
gboolean disabled : 1;
|
||||
gboolean debug : 1;
|
||||
};
|
||||
|
||||
static void
|
||||
meta_plugin_set_features (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = plugin->priv;
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
priv->features = 0;
|
||||
|
||||
/*
|
||||
* Feature flags: identify events that the plugin can handle; a plugin can
|
||||
* handle one or more events.
|
||||
*/
|
||||
if (klass->minimize)
|
||||
priv->features |= META_PLUGIN_MINIMIZE;
|
||||
|
||||
if (klass->maximize)
|
||||
priv->features |= META_PLUGIN_MAXIMIZE;
|
||||
|
||||
if (klass->unmaximize)
|
||||
priv->features |= META_PLUGIN_UNMAXIMIZE;
|
||||
|
||||
if (klass->map)
|
||||
priv->features |= META_PLUGIN_MAP;
|
||||
|
||||
if (klass->destroy)
|
||||
priv->features |= META_PLUGIN_DESTROY;
|
||||
|
||||
if (klass->switch_workspace)
|
||||
priv->features |= META_PLUGIN_SWITCH_WORKSPACE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_plugin_constructed (GObject *object)
|
||||
{
|
||||
meta_plugin_set_features (META_PLUGIN (object));
|
||||
|
||||
if (G_OBJECT_CLASS (meta_plugin_parent_class)->constructed)
|
||||
G_OBJECT_CLASS (meta_plugin_parent_class)->constructed (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_plugin_dispose (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (meta_plugin_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_plugin_finalize (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (meta_plugin_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_plugin_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
@@ -125,9 +68,6 @@ meta_plugin_set_property (GObject *object,
|
||||
case PROP_SCREEN:
|
||||
priv->screen = g_value_get_object (value);
|
||||
break;
|
||||
case PROP_DISABLED:
|
||||
priv->disabled = g_value_get_boolean (value);
|
||||
break;
|
||||
case PROP_DEBUG_MODE:
|
||||
priv->debug = g_value_get_boolean (value);
|
||||
break;
|
||||
@@ -150,15 +90,9 @@ meta_plugin_get_property (GObject *object,
|
||||
case PROP_SCREEN:
|
||||
g_value_set_object (value, priv->screen);
|
||||
break;
|
||||
case PROP_DISABLED:
|
||||
g_value_set_boolean (value, priv->disabled);
|
||||
break;
|
||||
case PROP_DEBUG_MODE:
|
||||
g_value_set_boolean (value, priv->debug);
|
||||
break;
|
||||
case PROP_FEATURES:
|
||||
g_value_set_ulong (value, priv->features);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@@ -171,9 +105,6 @@ meta_plugin_class_init (MetaPluginClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
gobject_class->constructed = meta_plugin_constructed;
|
||||
gobject_class->finalize = meta_plugin_finalize;
|
||||
gobject_class->dispose = meta_plugin_dispose;
|
||||
gobject_class->set_property = meta_plugin_set_property;
|
||||
gobject_class->get_property = meta_plugin_get_property;
|
||||
|
||||
@@ -185,22 +116,6 @@ meta_plugin_class_init (MetaPluginClass *klass)
|
||||
META_TYPE_SCREEN,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_FEATURES,
|
||||
g_param_spec_ulong ("features",
|
||||
"Features",
|
||||
"Plugin Features",
|
||||
0 , G_MAXULONG, 0,
|
||||
G_PARAM_READABLE));
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_DISABLED,
|
||||
g_param_spec_boolean ("disabled",
|
||||
"Plugin disabled",
|
||||
"Plugin disabled",
|
||||
FALSE,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_DEBUG_MODE,
|
||||
g_param_spec_boolean ("debug-mode",
|
||||
@@ -220,22 +135,6 @@ meta_plugin_init (MetaPlugin *self)
|
||||
self->priv = priv = META_PLUGIN_GET_PRIVATE (self);
|
||||
}
|
||||
|
||||
gulong
|
||||
meta_plugin_features (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return priv->features;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_plugin_disabled (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return priv->disabled;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_plugin_running (MetaPlugin *plugin)
|
||||
{
|
||||
@@ -263,38 +162,6 @@ meta_plugin_get_info (MetaPlugin *plugin)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
meta_plugin_get_overlay_group (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return meta_get_overlay_group_for_screen (priv->screen);
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
meta_plugin_get_stage (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return meta_get_stage_for_screen (priv->screen);
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
meta_plugin_get_window_group (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return meta_get_window_group_for_screen (priv->screen);
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
meta_plugin_get_background_actor (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return meta_get_background_actor_for_screen (priv->screen);
|
||||
}
|
||||
|
||||
/**
|
||||
* _meta_plugin_effect_started:
|
||||
* @plugin: the plugin
|
||||
@@ -315,7 +182,7 @@ meta_plugin_switch_workspace_completed (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
MetaScreen *screen = meta_plugin_get_screen (plugin);
|
||||
MetaScreen *screen = priv->screen;
|
||||
|
||||
if (priv->running-- < 0)
|
||||
{
|
||||
@@ -389,80 +256,6 @@ meta_plugin_destroy_completed (MetaPlugin *plugin,
|
||||
meta_plugin_window_effect_completed (plugin, actor, META_PLUGIN_DESTROY);
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_query_screen_size (MetaPlugin *plugin,
|
||||
int *width,
|
||||
int *height)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
meta_screen_get_size (priv->screen, width, height);
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_set_stage_reactive (MetaPlugin *plugin,
|
||||
gboolean reactive)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
MetaScreen *screen = priv->screen;
|
||||
|
||||
if (reactive)
|
||||
meta_set_stage_input_region (screen, None);
|
||||
else
|
||||
meta_empty_stage_input_region (screen);
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_set_stage_input_area (MetaPlugin *plugin,
|
||||
gint x, gint y, gint width, gint height)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
MetaScreen *screen = priv->screen;
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
Display *xdpy = meta_display_get_xdisplay (display);
|
||||
XRectangle rect;
|
||||
XserverRegion region;
|
||||
|
||||
rect.x = x;
|
||||
rect.y = y;
|
||||
rect.width = width;
|
||||
rect.height = height;
|
||||
|
||||
region = XFixesCreateRegion (xdpy, &rect, 1);
|
||||
meta_set_stage_input_region (screen, region);
|
||||
XFixesDestroyRegion (xdpy, region);
|
||||
}
|
||||
|
||||
void
|
||||
meta_plugin_set_stage_input_region (MetaPlugin *plugin,
|
||||
XserverRegion region)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
MetaScreen *screen = priv->screen;
|
||||
|
||||
meta_set_stage_input_region (screen, region);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_plugin_get_window_actors:
|
||||
* @plugin: A #MetaPlugin
|
||||
*
|
||||
* This function returns all of the #MetaWindowActor objects referenced by Mutter, including
|
||||
* override-redirect windows. The returned list is a snapshot of Mutter's current
|
||||
* stacking order, with the topmost window last.
|
||||
*
|
||||
* The 'restacked' signal of #MetaScreen signals when this value has changed.
|
||||
*
|
||||
* Returns: (transfer none) (element-type MetaWindowActor): Windows in stacking order, topmost last
|
||||
*/
|
||||
GList *
|
||||
meta_plugin_get_window_actors (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
|
||||
return meta_get_window_actors (priv->screen);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_plugin_begin_modal:
|
||||
* @plugin: a #MetaPlugin
|
||||
@@ -502,7 +295,7 @@ meta_plugin_begin_modal (MetaPlugin *plugin,
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_plugin_end_modal
|
||||
* meta_plugin_end_modal:
|
||||
* @plugin: a #MetaPlugin
|
||||
* @timestamp: the time used for releasing grabs
|
||||
*
|
||||
@@ -521,16 +314,6 @@ meta_plugin_end_modal (MetaPlugin *plugin,
|
||||
meta_end_modal_for_plugin (priv->screen, plugin, timestamp);
|
||||
}
|
||||
|
||||
Display *
|
||||
meta_plugin_get_xdisplay (MetaPlugin *plugin)
|
||||
{
|
||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||
MetaDisplay *display = meta_screen_get_display (priv->screen);
|
||||
Display *xdpy = meta_display_get_xdisplay (display);
|
||||
|
||||
return xdpy;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_plugin_get_screen:
|
||||
* @plugin: a #MetaPlugin
|
||||
@@ -548,19 +331,3 @@ meta_plugin_get_screen (MetaPlugin *plugin)
|
||||
|
||||
return priv->screen;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_plugin_type_register:
|
||||
* @plugin_type: a #MetaPlugin type
|
||||
*
|
||||
* Register @plugin_type as a compositor plugin type to be used.
|
||||
* You must call this before calling meta_init().
|
||||
*/
|
||||
void
|
||||
meta_plugin_type_register (GType plugin_type)
|
||||
{
|
||||
MetaPluginManager *plugin_manager;
|
||||
|
||||
plugin_manager = meta_plugin_manager_get_default ();
|
||||
meta_plugin_manager_register (plugin_manager, plugin_type);
|
||||
}
|
||||
|
@@ -130,7 +130,7 @@ MetaShadowClassInfo default_shadow_classes[] = {
|
||||
{ "popup-menu", { 1, -1, 0, 1, 128 }, { 1, -1, 0, 1, 128 } },
|
||||
|
||||
{ "dropdown-menu", { 1, 10, 0, 1, 128 }, { 1, 10, 0, 1, 128 } },
|
||||
{ "attached", { 2, 50, 0, 1, 255 }, { 1, 50, 0, 1, 128 } }
|
||||
{ "attached", { 1, -1, 0, 1, 128 }, { 1, -1, 0, 1, 128 } }
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (MetaShadowFactory, meta_shadow_factory, G_TYPE_OBJECT);
|
||||
|
@@ -1,11 +1,13 @@
|
||||
/*
|
||||
* shaped texture
|
||||
*
|
||||
* An actor to draw a texture clipped to a list of rectangles
|
||||
* An actor to draw a masked texture.
|
||||
*
|
||||
* Authored By Neil Roberts <neil@linux.intel.com>
|
||||
* and Jasper St. Pierre <jstpierre@mecheye.net>
|
||||
*
|
||||
* Copyright (C) 2008 Intel Corporation
|
||||
* Copyright (C) 2012 Red Hat, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@@ -25,32 +27,37 @@
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "meta-shaped-texture.h"
|
||||
#define CLUTTER_ENABLE_EXPERIMENTAL_API
|
||||
#define COGL_ENABLE_EXPERIMENTAL_API
|
||||
|
||||
#include <meta/meta-shaped-texture.h>
|
||||
#include "meta-texture-tower.h"
|
||||
#include "meta-texture-rectangle.h"
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
#include <cogl/cogl.h>
|
||||
#include <string.h>
|
||||
#include <cogl/cogl-texture-pixmap-x11.h>
|
||||
#include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
|
||||
|
||||
static void meta_shaped_texture_dispose (GObject *object);
|
||||
static void meta_shaped_texture_notify (GObject *object,
|
||||
GParamSpec *pspec);
|
||||
|
||||
static void meta_shaped_texture_paint (ClutterActor *actor);
|
||||
static void meta_shaped_texture_pick (ClutterActor *actor,
|
||||
const ClutterColor *color);
|
||||
|
||||
static void meta_shaped_texture_update_area (ClutterX11TexturePixmap *texture,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height);
|
||||
static void meta_shaped_texture_get_preferred_width (ClutterActor *self,
|
||||
gfloat for_height,
|
||||
gfloat *min_width_p,
|
||||
gfloat *natural_width_p);
|
||||
|
||||
static void meta_shaped_texture_dirty_mask (MetaShapedTexture *stex);
|
||||
static void meta_shaped_texture_get_preferred_height (ClutterActor *self,
|
||||
gfloat for_width,
|
||||
gfloat *min_height_p,
|
||||
gfloat *natural_height_p);
|
||||
|
||||
static gboolean meta_shaped_texture_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume);
|
||||
|
||||
G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture,
|
||||
CLUTTER_X11_TYPE_TEXTURE_PIXMAP);
|
||||
CLUTTER_TYPE_ACTOR);
|
||||
|
||||
#define META_SHAPED_TEXTURE_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_SHAPED_TEXTURE, \
|
||||
@@ -59,19 +66,15 @@ G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture,
|
||||
struct _MetaShapedTexturePrivate
|
||||
{
|
||||
MetaTextureTower *paint_tower;
|
||||
Pixmap pixmap;
|
||||
CoglHandle texture;
|
||||
CoglHandle mask_texture;
|
||||
CoglHandle material;
|
||||
CoglHandle material_unshaped;
|
||||
|
||||
cairo_region_t *clip_region;
|
||||
cairo_region_t *shape_region;
|
||||
|
||||
cairo_region_t *overlay_region;
|
||||
cairo_path_t *overlay_path;
|
||||
|
||||
cairo_region_t *visible_pixels_region;
|
||||
|
||||
guint mask_width, mask_height;
|
||||
guint tex_width, tex_height;
|
||||
|
||||
guint create_mipmaps : 1;
|
||||
};
|
||||
@@ -81,15 +84,14 @@ meta_shaped_texture_class_init (MetaShapedTextureClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = (GObjectClass *) klass;
|
||||
ClutterActorClass *actor_class = (ClutterActorClass *) klass;
|
||||
ClutterX11TexturePixmapClass *x11_texture_class = (ClutterX11TexturePixmapClass *) klass;
|
||||
|
||||
gobject_class->dispose = meta_shaped_texture_dispose;
|
||||
gobject_class->notify = meta_shaped_texture_notify;
|
||||
|
||||
actor_class->get_preferred_width = meta_shaped_texture_get_preferred_width;
|
||||
actor_class->get_preferred_height = meta_shaped_texture_get_preferred_height;
|
||||
actor_class->paint = meta_shaped_texture_paint;
|
||||
actor_class->pick = meta_shaped_texture_pick;
|
||||
|
||||
x11_texture_class->update_area = meta_shaped_texture_update_area;
|
||||
actor_class->get_paint_volume = meta_shaped_texture_get_paint_volume;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (MetaShapedTexturePrivate));
|
||||
}
|
||||
@@ -101,11 +103,8 @@ meta_shaped_texture_init (MetaShapedTexture *self)
|
||||
|
||||
priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self);
|
||||
|
||||
priv->shape_region = NULL;
|
||||
priv->overlay_path = NULL;
|
||||
priv->overlay_region = NULL;
|
||||
priv->visible_pixels_region = NULL;
|
||||
priv->paint_tower = meta_texture_tower_new ();
|
||||
priv->texture = COGL_INVALID_HANDLE;
|
||||
priv->mask_texture = COGL_INVALID_HANDLE;
|
||||
priv->create_mipmaps = TRUE;
|
||||
}
|
||||
@@ -120,8 +119,6 @@ meta_shaped_texture_dispose (GObject *object)
|
||||
meta_texture_tower_free (priv->paint_tower);
|
||||
priv->paint_tower = NULL;
|
||||
|
||||
meta_shaped_texture_dirty_mask (self);
|
||||
|
||||
if (priv->material != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (priv->material);
|
||||
@@ -132,287 +129,18 @@ meta_shaped_texture_dispose (GObject *object)
|
||||
cogl_handle_unref (priv->material_unshaped);
|
||||
priv->material_unshaped = COGL_INVALID_HANDLE;
|
||||
}
|
||||
if (priv->texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (priv->texture);
|
||||
priv->texture = COGL_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
meta_shaped_texture_set_shape_region (self, NULL);
|
||||
meta_shaped_texture_set_mask_texture (self, COGL_INVALID_HANDLE);
|
||||
meta_shaped_texture_set_clip_region (self, NULL);
|
||||
meta_shaped_texture_set_overlay_path (self, NULL, NULL);
|
||||
|
||||
G_OBJECT_CLASS (meta_shaped_texture_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_shaped_texture_notify (GObject *object,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
if (G_OBJECT_CLASS (meta_shaped_texture_parent_class)->notify)
|
||||
G_OBJECT_CLASS (meta_shaped_texture_parent_class)->notify (object, pspec);
|
||||
|
||||
/* It seems like we could just do this out of update_area(), but unfortunately,
|
||||
* clutter_glx_texture_pixmap() doesn't call through the vtable on the
|
||||
* initial update_area, so we need to look for changes to the texture
|
||||
* explicitly.
|
||||
*/
|
||||
if (strcmp (pspec->name, "cogl-texture") == 0)
|
||||
{
|
||||
MetaShapedTexture *stex = (MetaShapedTexture *) object;
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
|
||||
meta_shaped_texture_clear (stex);
|
||||
|
||||
if (priv->create_mipmaps)
|
||||
meta_texture_tower_set_base_texture (priv->paint_tower,
|
||||
clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex)));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_shaped_texture_dirty_mask (MetaShapedTexture *stex)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
|
||||
if (priv->visible_pixels_region != NULL)
|
||||
{
|
||||
cairo_region_destroy (priv->visible_pixels_region);
|
||||
priv->visible_pixels_region = NULL;
|
||||
|
||||
if (priv->mask_texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (priv->mask_texture);
|
||||
priv->mask_texture = COGL_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
if (priv->material != COGL_INVALID_HANDLE)
|
||||
cogl_material_set_layer (priv->material, 1, COGL_INVALID_HANDLE);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
scan_visible_region (MetaShapedTexture *stex,
|
||||
guchar *mask_data,
|
||||
int stride)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
cairo_region_t *visible_pixels_region;
|
||||
cairo_region_t *overlay_region;
|
||||
int i, n_rects;
|
||||
|
||||
/* The visible pixels region contains all pixel values above 0.
|
||||
* This is somewhat complicated when there's an overlay: we
|
||||
* need to scan all regions potentially modified by it.
|
||||
*/
|
||||
|
||||
if (priv->visible_pixels_region)
|
||||
cairo_region_destroy (priv->visible_pixels_region);
|
||||
|
||||
priv->visible_pixels_region = cairo_region_copy (priv->shape_region);
|
||||
|
||||
visible_pixels_region = priv->visible_pixels_region;
|
||||
overlay_region = priv->overlay_region;
|
||||
|
||||
/* With no overlay region, the visible region is defined
|
||||
* by the mask region, so we don't need to scan anything. */
|
||||
if (overlay_region == NULL)
|
||||
return;
|
||||
|
||||
/* Subtract all the rectangles in the overlay region so that we can
|
||||
* scan all the pixels potentially added by the overlay path. */
|
||||
cairo_region_subtract (visible_pixels_region, overlay_region);
|
||||
|
||||
n_rects = cairo_region_num_rectangles (overlay_region);
|
||||
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
int x, y;
|
||||
cairo_rectangle_int_t rect;
|
||||
|
||||
cairo_region_get_rectangle (overlay_region, i, &rect);
|
||||
|
||||
for (y = rect.y; y < (rect.y + rect.height); y++)
|
||||
{
|
||||
for (x = rect.x; x < (rect.x + rect.width); x++)
|
||||
{
|
||||
int w = x;
|
||||
while (mask_data[y * stride + w] > 0 && w < (rect.x + rect.width))
|
||||
w++;
|
||||
|
||||
if (w > 0)
|
||||
{
|
||||
cairo_rectangle_int_t tmp;
|
||||
tmp.x = x;
|
||||
tmp.y = y;
|
||||
tmp.width = w - x;
|
||||
tmp.height = 1;
|
||||
cairo_region_union_rectangle (visible_pixels_region, &tmp);
|
||||
x = w;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
install_overlay_path (MetaShapedTexture *stex,
|
||||
guchar *mask_data,
|
||||
int tex_width,
|
||||
int tex_height,
|
||||
int stride)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
int i, n_rects;
|
||||
cairo_t *cr;
|
||||
cairo_rectangle_int_t rect;
|
||||
cairo_surface_t *surface;
|
||||
|
||||
if (priv->overlay_region == NULL)
|
||||
return;
|
||||
|
||||
surface = cairo_image_surface_create_for_data (mask_data,
|
||||
CAIRO_FORMAT_A8,
|
||||
tex_width,
|
||||
tex_height,
|
||||
stride);
|
||||
|
||||
cr = cairo_create (surface);
|
||||
cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
|
||||
|
||||
n_rects = cairo_region_num_rectangles (priv->overlay_region);
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
cairo_region_get_rectangle (priv->overlay_region, i, &rect);
|
||||
cairo_rectangle (cr, rect.x, rect.y, rect.width, rect.height);
|
||||
}
|
||||
|
||||
cairo_fill_preserve (cr);
|
||||
if (priv->overlay_path == NULL)
|
||||
{
|
||||
/* If we have an overlay region but not an overlay path, then we
|
||||
* just need to clear the rectangles in the overlay region. */
|
||||
goto out;
|
||||
}
|
||||
|
||||
cairo_clip (cr);
|
||||
|
||||
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, 1);
|
||||
|
||||
cairo_append_path (cr, priv->overlay_path);
|
||||
cairo_fill (cr);
|
||||
|
||||
out:
|
||||
cairo_destroy (cr);
|
||||
cairo_surface_destroy (surface);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_shaped_texture_ensure_mask (MetaShapedTexture *stex)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
CoglHandle paint_tex;
|
||||
guint tex_width, tex_height;
|
||||
|
||||
paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
|
||||
|
||||
if (paint_tex == COGL_INVALID_HANDLE)
|
||||
return;
|
||||
|
||||
tex_width = cogl_texture_get_width (paint_tex);
|
||||
tex_height = cogl_texture_get_height (paint_tex);
|
||||
|
||||
/* If the mask texture we have was created for a different size then
|
||||
recreate it */
|
||||
if (priv->mask_texture != COGL_INVALID_HANDLE
|
||||
&& (priv->mask_width != tex_width || priv->mask_height != tex_height))
|
||||
meta_shaped_texture_dirty_mask (stex);
|
||||
|
||||
/* If we don't have a mask texture yet then create one */
|
||||
if (priv->visible_pixels_region == NULL)
|
||||
{
|
||||
guchar *mask_data;
|
||||
int i;
|
||||
int n_rects;
|
||||
int stride;
|
||||
GLenum paint_gl_target;
|
||||
|
||||
/* If we have no shape region and no (or an empty) overlay region, we
|
||||
* don't need to create a full mask texture, so quit early. */
|
||||
if (priv->shape_region == NULL &&
|
||||
(priv->overlay_region == NULL ||
|
||||
cairo_region_num_rectangles (priv->overlay_region) == 0))
|
||||
{
|
||||
/* With no mask, the visible region is just
|
||||
* {0, 0, tex_width, tex_height}. */
|
||||
cairo_rectangle_int_t rect = { 0, 0, tex_width, tex_height };
|
||||
priv->visible_pixels_region = cairo_region_create_rectangle (&rect);
|
||||
return;
|
||||
}
|
||||
|
||||
stride = cairo_format_stride_for_width (CAIRO_FORMAT_A8, tex_width);
|
||||
|
||||
/* Create data for an empty image */
|
||||
mask_data = g_malloc0 (stride * tex_height);
|
||||
|
||||
n_rects = cairo_region_num_rectangles (priv->shape_region);
|
||||
|
||||
/* Fill in each rectangle. */
|
||||
for (i = 0; i < n_rects; i ++)
|
||||
{
|
||||
cairo_rectangle_int_t rect;
|
||||
cairo_region_get_rectangle (priv->shape_region, i, &rect);
|
||||
|
||||
gint x1 = rect.x, x2 = x1 + rect.width;
|
||||
gint y1 = rect.y, y2 = y1 + rect.height;
|
||||
guchar *p;
|
||||
|
||||
/* Clip the rectangle to the size of the texture */
|
||||
x1 = CLAMP (x1, 0, (gint) tex_width - 1);
|
||||
x2 = CLAMP (x2, x1, (gint) tex_width);
|
||||
y1 = CLAMP (y1, 0, (gint) tex_height - 1);
|
||||
y2 = CLAMP (y2, y1, (gint) tex_height);
|
||||
|
||||
/* Fill the rectangle */
|
||||
for (p = mask_data + y1 * stride + x1;
|
||||
y1 < y2;
|
||||
y1++, p += stride)
|
||||
memset (p, 255, x2 - x1);
|
||||
}
|
||||
|
||||
install_overlay_path (stex, mask_data, tex_width, tex_height, stride);
|
||||
scan_visible_region (stex, mask_data, stride);
|
||||
|
||||
cogl_texture_get_gl_texture (paint_tex, NULL, &paint_gl_target);
|
||||
|
||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
|
||||
if (paint_gl_target == GL_TEXTURE_RECTANGLE_ARB)
|
||||
{
|
||||
priv->mask_texture
|
||||
= meta_texture_rectangle_new (tex_width, tex_height,
|
||||
0, /* flags */
|
||||
/* data format */
|
||||
COGL_PIXEL_FORMAT_A_8,
|
||||
/* internal GL format */
|
||||
GL_ALPHA,
|
||||
/* internal cogl format */
|
||||
COGL_PIXEL_FORMAT_A_8,
|
||||
/* rowstride */
|
||||
stride,
|
||||
mask_data);
|
||||
}
|
||||
else
|
||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
|
||||
priv->mask_texture = cogl_texture_new_from_data (tex_width, tex_height,
|
||||
COGL_TEXTURE_NONE,
|
||||
COGL_PIXEL_FORMAT_A_8,
|
||||
COGL_PIXEL_FORMAT_ANY,
|
||||
stride,
|
||||
mask_data);
|
||||
|
||||
g_free (mask_data);
|
||||
|
||||
priv->mask_width = tex_width;
|
||||
priv->mask_height = tex_height;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_shaped_texture_paint (ClutterActor *actor)
|
||||
{
|
||||
@@ -451,20 +179,20 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
||||
if (priv->create_mipmaps)
|
||||
paint_tex = meta_texture_tower_get_paint_texture (priv->paint_tower);
|
||||
else
|
||||
paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
|
||||
paint_tex = priv->texture;
|
||||
|
||||
if (paint_tex == COGL_INVALID_HANDLE)
|
||||
return;
|
||||
|
||||
tex_width = cogl_texture_get_width (paint_tex);
|
||||
tex_height = cogl_texture_get_height (paint_tex);
|
||||
tex_width = priv->tex_width;
|
||||
tex_height = priv->tex_height;
|
||||
|
||||
if (tex_width == 0 || tex_height == 0) /* no contents yet */
|
||||
return;
|
||||
|
||||
if (priv->shape_region == NULL)
|
||||
if (priv->mask_texture == COGL_INVALID_HANDLE)
|
||||
{
|
||||
/* No region means an unclipped shape. Use a single-layer texture. */
|
||||
/* Use a single-layer texture if we don't have a mask. */
|
||||
|
||||
if (priv->material_unshaped == COGL_INVALID_HANDLE)
|
||||
{
|
||||
@@ -477,8 +205,6 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
||||
}
|
||||
else
|
||||
{
|
||||
meta_shaped_texture_ensure_mask (stex);
|
||||
|
||||
if (priv->material == COGL_INVALID_HANDLE)
|
||||
{
|
||||
if (G_UNLIKELY (material_template == COGL_INVALID_HANDLE))
|
||||
@@ -512,6 +238,7 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
||||
{
|
||||
int n_rects;
|
||||
int i;
|
||||
cairo_rectangle_int_t tex_rect = { 0, 0, tex_width, tex_height };
|
||||
|
||||
/* Limit to how many separate rectangles we'll draw; beyond this just
|
||||
* fall back and draw the whole thing */
|
||||
@@ -529,6 +256,9 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
||||
|
||||
cairo_region_get_rectangle (priv->clip_region, i, &rect);
|
||||
|
||||
if (!gdk_rectangle_intersect (&tex_rect, &rect, &rect))
|
||||
continue;
|
||||
|
||||
x1 = rect.x;
|
||||
y1 = rect.y;
|
||||
x2 = rect.x + rect.width;
|
||||
@@ -565,7 +295,7 @@ meta_shaped_texture_pick (ClutterActor *actor,
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
|
||||
/* If there is no region then use the regular pick */
|
||||
if (priv->shape_region == NULL)
|
||||
if (priv->mask_texture == COGL_INVALID_HANDLE)
|
||||
CLUTTER_ACTOR_CLASS (meta_shaped_texture_parent_class)
|
||||
->pick (actor, color);
|
||||
else if (clutter_actor_should_pick_paint (actor))
|
||||
@@ -574,7 +304,7 @@ meta_shaped_texture_pick (ClutterActor *actor,
|
||||
ClutterActorBox alloc;
|
||||
guint tex_width, tex_height;
|
||||
|
||||
paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
|
||||
paint_tex = priv->texture;
|
||||
|
||||
if (paint_tex == COGL_INVALID_HANDLE)
|
||||
return;
|
||||
@@ -585,8 +315,6 @@ meta_shaped_texture_pick (ClutterActor *actor,
|
||||
if (tex_width == 0 || tex_height == 0) /* no contents yet */
|
||||
return;
|
||||
|
||||
meta_shaped_texture_ensure_mask (stex);
|
||||
|
||||
cogl_set_source_color4ub (color->red, color->green, color->blue,
|
||||
color->alpha);
|
||||
|
||||
@@ -602,19 +330,48 @@ meta_shaped_texture_pick (ClutterActor *actor,
|
||||
}
|
||||
|
||||
static void
|
||||
meta_shaped_texture_update_area (ClutterX11TexturePixmap *texture,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height)
|
||||
meta_shaped_texture_get_preferred_width (ClutterActor *self,
|
||||
gfloat for_height,
|
||||
gfloat *min_width_p,
|
||||
gfloat *natural_width_p)
|
||||
{
|
||||
MetaShapedTexture *stex = (MetaShapedTexture *) texture;
|
||||
MetaShapedTexturePrivate *priv = stex->priv;
|
||||
MetaShapedTexturePrivate *priv;
|
||||
|
||||
CLUTTER_X11_TEXTURE_PIXMAP_CLASS (meta_shaped_texture_parent_class)->update_area (texture,
|
||||
x, y, width, height);
|
||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (self));
|
||||
|
||||
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
|
||||
priv = META_SHAPED_TEXTURE (self)->priv;
|
||||
|
||||
if (min_width_p)
|
||||
*min_width_p = 0;
|
||||
|
||||
if (natural_width_p)
|
||||
*natural_width_p = priv->tex_width;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_shaped_texture_get_preferred_height (ClutterActor *self,
|
||||
gfloat for_width,
|
||||
gfloat *min_height_p,
|
||||
gfloat *natural_height_p)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
|
||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (self));
|
||||
|
||||
priv = META_SHAPED_TEXTURE (self)->priv;
|
||||
|
||||
if (min_height_p)
|
||||
*min_height_p = 0;
|
||||
|
||||
if (natural_height_p)
|
||||
*natural_height_p = priv->tex_height;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_shaped_texture_get_paint_volume (ClutterActor *self,
|
||||
ClutterPaintVolume *volume)
|
||||
{
|
||||
return clutter_paint_volume_set_from_allocation (volume, self);
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
@@ -640,34 +397,16 @@ meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
|
||||
if (create_mipmaps != priv->create_mipmaps)
|
||||
{
|
||||
CoglHandle base_texture;
|
||||
|
||||
priv->create_mipmaps = create_mipmaps;
|
||||
|
||||
base_texture = create_mipmaps ?
|
||||
clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex)) : COGL_INVALID_HANDLE;
|
||||
|
||||
priv->texture : COGL_INVALID_HANDLE;
|
||||
meta_texture_tower_set_base_texture (priv->paint_tower, base_texture);
|
||||
}
|
||||
}
|
||||
|
||||
/* This is a workaround for deficiencies in the hack tower:
|
||||
*
|
||||
* When we call clutter_x11_texture_pixmap_set_pixmap(tp, None),
|
||||
* ClutterX11TexturePixmap knows that it has to get rid of the old texture, but
|
||||
* clutter_texture_set_cogl_texture(texture, COGL_INVALID_HANDLE) isn't allowed, so
|
||||
* it grabs the material for the texture and manually sets the texture in it. This means
|
||||
* that the "cogl-texture" property isn't notified, so we don't find out about it.
|
||||
*
|
||||
* And if we keep the CoglX11TexturePixmap around after the X pixmap is freed, then
|
||||
* we'll trigger X errors when we actually try to free it.
|
||||
*
|
||||
* The only correct thing to do here is to change our code to derive
|
||||
* from ClutterActor and get rid of the inheritance hack tower. Once
|
||||
* we want to depend on Clutter-1.4 (which has CoglTexturePixmapX11),
|
||||
* that will be very easy to do.
|
||||
*/
|
||||
void
|
||||
meta_shaped_texture_clear (MetaShapedTexture *stex)
|
||||
meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
|
||||
CoglHandle mask_texture)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
|
||||
@@ -675,73 +414,98 @@ meta_shaped_texture_clear (MetaShapedTexture *stex)
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
meta_texture_tower_set_base_texture (priv->paint_tower, COGL_INVALID_HANDLE);
|
||||
if (priv->mask_texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cogl_handle_unref (priv->mask_texture);
|
||||
priv->mask_texture = COGL_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
if (priv->material != COGL_INVALID_HANDLE)
|
||||
cogl_material_set_layer (priv->material, 0, COGL_INVALID_HANDLE);
|
||||
if (mask_texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
priv->mask_texture = mask_texture;
|
||||
cogl_handle_ref (priv->mask_texture);
|
||||
}
|
||||
|
||||
if (priv->material_unshaped != COGL_INVALID_HANDLE)
|
||||
cogl_material_set_layer (priv->material_unshaped, 0, COGL_INVALID_HANDLE);
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
||||
}
|
||||
|
||||
void
|
||||
meta_shaped_texture_set_shape_region (MetaShapedTexture *stex,
|
||||
cairo_region_t *region)
|
||||
meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
const cairo_rectangle_int_t clip = { x, y, width, height };
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
if (priv->texture == COGL_INVALID_HANDLE)
|
||||
return;
|
||||
|
||||
cogl_texture_pixmap_x11_update_area (priv->texture, x, y, width, height);
|
||||
|
||||
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
|
||||
|
||||
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &clip);
|
||||
}
|
||||
|
||||
static void
|
||||
set_cogl_texture (MetaShapedTexture *stex,
|
||||
CoglHandle cogl_tex)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
guint width, height;
|
||||
|
||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
if (priv->shape_region != NULL)
|
||||
if (priv->texture != COGL_INVALID_HANDLE)
|
||||
cogl_handle_unref (priv->texture);
|
||||
|
||||
priv->texture = cogl_tex;
|
||||
|
||||
if (priv->material != COGL_INVALID_HANDLE)
|
||||
cogl_material_set_layer (priv->material, 0, cogl_tex);
|
||||
|
||||
if (priv->material_unshaped != COGL_INVALID_HANDLE)
|
||||
cogl_material_set_layer (priv->material_unshaped, 0, cogl_tex);
|
||||
|
||||
if (cogl_tex != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cairo_region_destroy (priv->shape_region);
|
||||
priv->shape_region = NULL;
|
||||
width = cogl_texture_get_width (cogl_tex);
|
||||
height = cogl_texture_get_height (cogl_tex);
|
||||
|
||||
if (width != priv->tex_width ||
|
||||
height != priv->tex_height)
|
||||
{
|
||||
priv->tex_width = width;
|
||||
priv->tex_height = height;
|
||||
|
||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (stex));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* size changed to 0 going to an invalid handle */
|
||||
priv->tex_width = 0;
|
||||
priv->tex_height = 0;
|
||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (stex));
|
||||
}
|
||||
|
||||
if (region != NULL)
|
||||
{
|
||||
cairo_region_reference (region);
|
||||
priv->shape_region = region;
|
||||
}
|
||||
|
||||
meta_shaped_texture_dirty_mask (stex);
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_shaped_texture_get_visible_pixels_region:
|
||||
* @stex: a #MetaShapedTexture
|
||||
*
|
||||
* Return a region enclosing only visible pixels: those with
|
||||
* alpha values above 0.
|
||||
*
|
||||
* Returns: a #cairo_region_t
|
||||
*/
|
||||
cairo_region_t *
|
||||
meta_shaped_texture_get_visible_pixels_region (MetaShapedTexture *stex)
|
||||
{
|
||||
g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), NULL);
|
||||
|
||||
meta_shaped_texture_ensure_mask (stex);
|
||||
return stex->priv->visible_pixels_region;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_shaped_texture_set_overlay_path:
|
||||
* @stex: a #MetaShapedTexture
|
||||
* @overlay_region: A region containing the parts of the mask to overlay.
|
||||
* All rectangles in this region are wiped clear to full transparency,
|
||||
* and the overlay path is clipped to this region.
|
||||
* @overlay_path (transfer full): This path will be painted onto the mask
|
||||
* texture with a fully opaque source. Due to the lack of refcounting
|
||||
* in #cairo_path_t, ownership of the path is assumed.
|
||||
* meta_shaped_texture_set_pixmap:
|
||||
* @stex: The #MetaShapedTexture
|
||||
* @pixmap: The pixmap you want the stex to assume
|
||||
*/
|
||||
void
|
||||
meta_shaped_texture_set_overlay_path (MetaShapedTexture *stex,
|
||||
cairo_region_t *overlay_region,
|
||||
cairo_path_t *overlay_path)
|
||||
meta_shaped_texture_set_pixmap (MetaShapedTexture *stex,
|
||||
Pixmap pixmap)
|
||||
{
|
||||
MetaShapedTexturePrivate *priv;
|
||||
|
||||
@@ -749,33 +513,42 @@ meta_shaped_texture_set_overlay_path (MetaShapedTexture *stex,
|
||||
|
||||
priv = stex->priv;
|
||||
|
||||
if (priv->overlay_region != NULL)
|
||||
if (priv->pixmap == pixmap)
|
||||
return;
|
||||
|
||||
priv->pixmap = pixmap;
|
||||
|
||||
if (pixmap != None)
|
||||
{
|
||||
cairo_region_destroy (priv->overlay_region);
|
||||
priv->overlay_region = NULL;
|
||||
CoglContext *ctx =
|
||||
clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||
set_cogl_texture (stex, cogl_texture_pixmap_x11_new (ctx, pixmap, FALSE, NULL));
|
||||
}
|
||||
else
|
||||
set_cogl_texture (stex, COGL_INVALID_HANDLE);
|
||||
|
||||
if (priv->overlay_path != NULL)
|
||||
{
|
||||
cairo_path_destroy (priv->overlay_path);
|
||||
priv->overlay_path = NULL;
|
||||
}
|
||||
if (priv->create_mipmaps)
|
||||
meta_texture_tower_set_base_texture (priv->paint_tower, priv->texture);
|
||||
}
|
||||
|
||||
cairo_region_reference (overlay_region);
|
||||
priv->overlay_region = overlay_region;
|
||||
|
||||
/* cairo_path_t does not have refcounting. */
|
||||
priv->overlay_path = overlay_path;
|
||||
|
||||
meta_shaped_texture_dirty_mask (stex);
|
||||
/**
|
||||
* meta_shaped_texture_get_texture:
|
||||
* @stex: The #MetaShapedTexture
|
||||
*
|
||||
* Returns: (transfer none): the unshaped texture
|
||||
*/
|
||||
CoglHandle
|
||||
meta_shaped_texture_get_texture (MetaShapedTexture *stex)
|
||||
{
|
||||
g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), COGL_INVALID_HANDLE);
|
||||
return stex->priv->texture;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_shaped_texture_set_clip_region:
|
||||
* @frame: a #MetaShapedTexture
|
||||
* @stex: a #MetaShapedTexture
|
||||
* @clip_region: (transfer full): the region of the texture that
|
||||
* is visible and should be painted. OWNERSHIP IS ASSUMED BY
|
||||
* THE FUNCTION (for efficiency to avoid a copy.)
|
||||
* is visible and should be painted.
|
||||
*
|
||||
* Provides a hint to the texture about what areas of the texture
|
||||
* are not completely obscured and thus need to be painted. This
|
||||
@@ -801,5 +574,106 @@ meta_shaped_texture_set_clip_region (MetaShapedTexture *stex,
|
||||
priv->clip_region = NULL;
|
||||
}
|
||||
|
||||
priv->clip_region = clip_region;
|
||||
if (clip_region)
|
||||
priv->clip_region = cairo_region_copy (clip_region);
|
||||
else
|
||||
priv->clip_region = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_shaped_texture_get_image:
|
||||
* @stex: A #MetaShapedTexture
|
||||
* @clip: A clipping rectangle, to help prevent extra processing.
|
||||
* In the case that the clipping rectangle is partially or fully
|
||||
* outside the bounds of the texture, the rectangle will be clipped.
|
||||
*
|
||||
* Flattens the two layers of the shaped texture into one ARGB32
|
||||
* image by alpha blending the two images, and returns the flattened
|
||||
* image.
|
||||
*
|
||||
* Returns: (transfer full): a new cairo surface to be freed with
|
||||
* cairo_surface_destroy().
|
||||
*/
|
||||
cairo_surface_t *
|
||||
meta_shaped_texture_get_image (MetaShapedTexture *stex,
|
||||
cairo_rectangle_int_t *clip)
|
||||
{
|
||||
CoglHandle texture, mask_texture;
|
||||
cairo_rectangle_int_t texture_rect = { 0, 0, 0, 0 };
|
||||
cairo_surface_t *surface;
|
||||
|
||||
g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), NULL);
|
||||
|
||||
texture = stex->priv->texture;
|
||||
|
||||
if (texture == NULL)
|
||||
return NULL;
|
||||
|
||||
texture_rect.width = cogl_texture_get_width (texture);
|
||||
texture_rect.height = cogl_texture_get_height (texture);
|
||||
|
||||
if (clip != NULL)
|
||||
{
|
||||
/* GdkRectangle is just a typedef of cairo_rectangle_int_t,
|
||||
* so we can use the gdk_rectangle_* APIs on these. */
|
||||
if (!gdk_rectangle_intersect (&texture_rect, clip, clip))
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (clip != NULL)
|
||||
texture = cogl_texture_new_from_sub_texture (texture,
|
||||
clip->x,
|
||||
clip->y,
|
||||
clip->width,
|
||||
clip->height);
|
||||
|
||||
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
|
||||
cogl_texture_get_width (texture),
|
||||
cogl_texture_get_height (texture));
|
||||
|
||||
cogl_texture_get_data (texture, CLUTTER_CAIRO_FORMAT_ARGB32,
|
||||
cairo_image_surface_get_stride (surface),
|
||||
cairo_image_surface_get_data (surface));
|
||||
|
||||
cairo_surface_mark_dirty (surface);
|
||||
|
||||
if (clip != NULL)
|
||||
cogl_object_unref (texture);
|
||||
|
||||
mask_texture = stex->priv->mask_texture;
|
||||
if (mask_texture != COGL_INVALID_HANDLE)
|
||||
{
|
||||
cairo_t *cr;
|
||||
cairo_surface_t *mask_surface;
|
||||
|
||||
if (clip != NULL)
|
||||
mask_texture = cogl_texture_new_from_sub_texture (mask_texture,
|
||||
clip->x,
|
||||
clip->y,
|
||||
clip->width,
|
||||
clip->height);
|
||||
|
||||
mask_surface = cairo_image_surface_create (CAIRO_FORMAT_A8,
|
||||
cogl_texture_get_width (mask_texture),
|
||||
cogl_texture_get_height (mask_texture));
|
||||
|
||||
cogl_texture_get_data (mask_texture, COGL_PIXEL_FORMAT_A_8,
|
||||
cairo_image_surface_get_stride (mask_surface),
|
||||
cairo_image_surface_get_data (mask_surface));
|
||||
|
||||
cairo_surface_mark_dirty (mask_surface);
|
||||
|
||||
cr = cairo_create (surface);
|
||||
cairo_set_source_surface (cr, mask_surface, 0, 0);
|
||||
cairo_set_operator (cr, CAIRO_OPERATOR_DEST_IN);
|
||||
cairo_paint (cr);
|
||||
cairo_destroy (cr);
|
||||
|
||||
cairo_surface_destroy (mask_surface);
|
||||
|
||||
if (clip != NULL)
|
||||
cogl_object_unref (mask_texture);
|
||||
}
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* Authored By Neil Roberts <neil@linux.intel.com>
|
||||
*
|
||||
* Copyright (C) 2011 Intel Corporation
|
||||
* Copyright (C) 2011, 2012 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@@ -25,94 +25,77 @@
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#define CLUTTER_ENABLE_EXPERIMENTAL_API
|
||||
#define COGL_ENABLE_EXPERIMENTAL_API
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
#include "meta-texture-rectangle.h"
|
||||
|
||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
|
||||
|
||||
static void (* pf_glGetIntegerv) (GLenum pname, GLint *params);
|
||||
static void (* pf_glTexImage2D) (GLenum target, GLint level,
|
||||
GLint internalFormat,
|
||||
GLsizei width, GLsizei height,
|
||||
GLint border, GLenum format, GLenum type,
|
||||
const GLvoid *pixels);
|
||||
static void (* pf_glGenTextures) (GLsizei n, GLuint *textures);
|
||||
static void (* pf_glDeleteTextures) (GLsizei n, const GLuint *texture);
|
||||
static void (* pf_glBindTexture) (GLenum target, GLuint texture);
|
||||
|
||||
static void
|
||||
rectangle_texture_destroy_cb (void *user_data)
|
||||
{
|
||||
GLuint tex = GPOINTER_TO_UINT (user_data);
|
||||
|
||||
pf_glDeleteTextures (1, &tex);
|
||||
}
|
||||
|
||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
|
||||
|
||||
CoglHandle
|
||||
CoglTexture *
|
||||
meta_texture_rectangle_new (unsigned int width,
|
||||
unsigned int height,
|
||||
CoglTextureFlags flags,
|
||||
CoglPixelFormat format,
|
||||
GLenum internal_gl_format,
|
||||
GLenum internal_format,
|
||||
CoglPixelFormat internal_format,
|
||||
unsigned int rowstride,
|
||||
const guint8 *data)
|
||||
const guint8 *data,
|
||||
GError **error)
|
||||
{
|
||||
CoglHandle cogl_tex = COGL_INVALID_HANDLE;
|
||||
ClutterBackend *backend =
|
||||
clutter_get_default_backend ();
|
||||
CoglContext *context =
|
||||
clutter_backend_get_cogl_context (backend);
|
||||
CoglTextureRectangle *tex_rect;
|
||||
|
||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
|
||||
tex_rect = cogl_texture_rectangle_new_with_size (context,
|
||||
width, height,
|
||||
internal_format,
|
||||
error);
|
||||
if (tex_rect == NULL)
|
||||
return NULL;
|
||||
|
||||
static CoglUserDataKey user_data_key;
|
||||
GLint old_binding;
|
||||
GLuint tex;
|
||||
|
||||
if (pf_glGenTextures == NULL)
|
||||
{
|
||||
pf_glGetIntegerv = (void *) cogl_get_proc_address ("glGetIntegerv");
|
||||
pf_glTexImage2D = (void *) cogl_get_proc_address ("glTexImage2D");
|
||||
pf_glGenTextures = (void *) cogl_get_proc_address ("glGenTextures");
|
||||
pf_glDeleteTextures = (void *) cogl_get_proc_address ("glDeleteTextures");
|
||||
pf_glBindTexture = (void *) cogl_get_proc_address ("glBindTexture");
|
||||
}
|
||||
|
||||
pf_glGenTextures (1, &tex);
|
||||
pf_glGetIntegerv (GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
|
||||
pf_glBindTexture (GL_TEXTURE_RECTANGLE_ARB, tex);
|
||||
pf_glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0,
|
||||
internal_gl_format, width, height,
|
||||
0, internal_gl_format,
|
||||
GL_UNSIGNED_BYTE, NULL);
|
||||
pf_glBindTexture (GL_TEXTURE_RECTANGLE_ARB, old_binding);
|
||||
|
||||
cogl_tex = cogl_texture_new_from_foreign (tex,
|
||||
GL_TEXTURE_RECTANGLE_ARB,
|
||||
width, height,
|
||||
0, 0, /* no waste */
|
||||
internal_format);
|
||||
|
||||
/* Cogl won't destroy the GL texture when a foreign texture is used
|
||||
so we need to destroy it manually. We can set a destroy
|
||||
notification callback to do this transparently */
|
||||
cogl_object_set_user_data (cogl_tex,
|
||||
&user_data_key,
|
||||
GUINT_TO_POINTER (tex),
|
||||
rectangle_texture_destroy_cb);
|
||||
|
||||
/* Use cogl_texture_set_region instead of uploading the data
|
||||
directly with GL calls so that we can let Cogl deal with setting
|
||||
the pixel store parameters and handling format conversion */
|
||||
if (data)
|
||||
cogl_texture_set_region (cogl_tex,
|
||||
0, 0, /* src x/y */
|
||||
0, 0, /* dst x/y */
|
||||
width, height, /* dst width/height */
|
||||
width, height, /* src width/height */
|
||||
cogl_texture_set_region (COGL_TEXTURE (tex_rect),
|
||||
0, 0, /* src_x/y */
|
||||
0, 0, /* dst_x/y */
|
||||
width, height, /* dst_width/height */
|
||||
width, height, /* width/height */
|
||||
format,
|
||||
rowstride,
|
||||
data);
|
||||
|
||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
|
||||
|
||||
return cogl_tex;
|
||||
return COGL_TEXTURE (tex_rect);
|
||||
}
|
||||
|
||||
static void
|
||||
texture_rectangle_check_cb (CoglTexture *sub_texture,
|
||||
const float *sub_texture_coords,
|
||||
const float *meta_coords,
|
||||
void *user_data)
|
||||
{
|
||||
gboolean *result = user_data;
|
||||
|
||||
if (cogl_is_texture_rectangle (sub_texture))
|
||||
*result = TRUE;
|
||||
}
|
||||
|
||||
/* Determines if the given texture is using a rectangle texture as its
|
||||
* primitive texture type. Eventually this function could be replaced
|
||||
* with cogl_texture_get_type if Cogl makes that public.
|
||||
*
|
||||
* http://git.gnome.org/browse/cogl/commit/?h=8012eee31
|
||||
*/
|
||||
gboolean
|
||||
meta_texture_rectangle_check (CoglTexture *texture)
|
||||
{
|
||||
gboolean result = FALSE;
|
||||
|
||||
cogl_meta_texture_foreach_in_region (COGL_META_TEXTURE (texture),
|
||||
0.0f, 0.0f, /* tx_1 / ty_1 */
|
||||
1.0f, 1.0f, /* tx_2 / ty_2 */
|
||||
COGL_PIPELINE_WRAP_MODE_REPEAT,
|
||||
COGL_PIPELINE_WRAP_MODE_REPEAT,
|
||||
texture_rectangle_check_cb,
|
||||
&result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@@ -30,15 +30,17 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
CoglHandle
|
||||
CoglTexture *
|
||||
meta_texture_rectangle_new (unsigned int width,
|
||||
unsigned int height,
|
||||
CoglTextureFlags flags,
|
||||
CoglPixelFormat format,
|
||||
GLenum internal_gl_format,
|
||||
GLenum internal_format,
|
||||
CoglPixelFormat internal_format,
|
||||
unsigned int rowstride,
|
||||
const guint8 *data);
|
||||
const guint8 *data,
|
||||
GError **error);
|
||||
|
||||
gboolean
|
||||
meta_texture_rectangle_check (CoglTexture *texture);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@@ -98,18 +98,6 @@ meta_texture_tower_free (MetaTextureTower *tower)
|
||||
g_slice_free (MetaTextureTower, tower);
|
||||
}
|
||||
|
||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
|
||||
static gboolean
|
||||
texture_is_rectangle (CoglHandle texture)
|
||||
{
|
||||
GLuint gl_tex;
|
||||
GLenum gl_target;
|
||||
|
||||
cogl_texture_get_gl_texture (texture, &gl_tex, &gl_target);
|
||||
return gl_target == GL_TEXTURE_RECTANGLE_ARB;
|
||||
}
|
||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
|
||||
|
||||
/**
|
||||
* meta_texture_tower_set_base_texture:
|
||||
* @tower: a #MetaTextureTower
|
||||
@@ -354,13 +342,11 @@ get_paint_level (int width, int height)
|
||||
return (int)(0.5 + lambda);
|
||||
}
|
||||
|
||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
|
||||
static gboolean
|
||||
is_power_of_two (int x)
|
||||
{
|
||||
return (x & (x - 1)) == 0;
|
||||
}
|
||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
|
||||
|
||||
static void
|
||||
texture_tower_create_texture (MetaTextureTower *tower,
|
||||
@@ -368,25 +354,23 @@ texture_tower_create_texture (MetaTextureTower *tower,
|
||||
int width,
|
||||
int height)
|
||||
{
|
||||
#ifdef GL_TEXTURE_RECTANGLE_ARB
|
||||
if ((!is_power_of_two (width) || !is_power_of_two (height)) &&
|
||||
texture_is_rectangle (tower->textures[level - 1]))
|
||||
meta_texture_rectangle_check (tower->textures[level - 1]))
|
||||
{
|
||||
tower->textures[level] =
|
||||
meta_texture_rectangle_new (width, height,
|
||||
0, /* flags */
|
||||
/* data format */
|
||||
TEXTURE_FORMAT,
|
||||
/* internal GL format */
|
||||
GL_RGBA,
|
||||
/* internal cogl format */
|
||||
TEXTURE_FORMAT,
|
||||
/* rowstride */
|
||||
width * 4,
|
||||
/* data */
|
||||
NULL,
|
||||
/* error */
|
||||
NULL);
|
||||
}
|
||||
else
|
||||
#endif /* GL_TEXTURE_RECTANGLE_ARB */
|
||||
{
|
||||
tower->textures[level] = cogl_texture_new_with_size (width, height,
|
||||
COGL_TEXTURE_NO_AUTO_MIPMAP,
|
||||
@@ -562,7 +546,7 @@ texture_tower_revalidate_client (MetaTextureTower *tower,
|
||||
4 * dest_width,
|
||||
dest_data);
|
||||
|
||||
if (dest_height < source_texture_height)
|
||||
if (dest_texture_height < source_texture_height)
|
||||
{
|
||||
g_free (source_tmp1);
|
||||
g_free (source_tmp2);
|
||||
|
@@ -13,17 +13,20 @@
|
||||
#define COGL_ENABLE_EXPERIMENTAL_API
|
||||
#include <cogl/cogl-texture-pixmap-x11.h>
|
||||
#include <gdk/gdk.h> /* for gdk_rectangle_union() */
|
||||
#include <string.h>
|
||||
|
||||
#include <meta/display.h>
|
||||
#include <meta/errors.h>
|
||||
#include "frame.h"
|
||||
#include <meta/window.h>
|
||||
#include <meta/meta-shaped-texture.h>
|
||||
#include "xprops.h"
|
||||
|
||||
#include "compositor-private.h"
|
||||
#include "meta-shadow-factory-private.h"
|
||||
#include "meta-shaped-texture.h"
|
||||
#include "meta-window-actor-private.h"
|
||||
#include "meta-texture-rectangle.h"
|
||||
#include "region-utils.h"
|
||||
|
||||
enum {
|
||||
POSITION_CHANGED,
|
||||
@@ -123,15 +126,10 @@ enum
|
||||
PROP_META_WINDOW = 1,
|
||||
PROP_META_SCREEN,
|
||||
PROP_X_WINDOW,
|
||||
PROP_X_WINDOW_ATTRIBUTES,
|
||||
PROP_NO_SHADOW,
|
||||
PROP_SHADOW_CLASS
|
||||
};
|
||||
|
||||
#define DEFAULT_SHADOW_RADIUS 12
|
||||
#define DEFAULT_SHADOW_X_OFFSET 0
|
||||
#define DEFAULT_SHADOW_Y_OFFSET 8
|
||||
|
||||
static void meta_window_actor_dispose (GObject *object);
|
||||
static void meta_window_actor_finalize (GObject *object);
|
||||
static void meta_window_actor_constructed (GObject *object);
|
||||
@@ -739,74 +737,52 @@ meta_window_actor_has_shadow (MetaWindowActor *self)
|
||||
meta_window_is_fullscreen (priv->window))
|
||||
return FALSE;
|
||||
|
||||
/*
|
||||
* If we have two snap-tiled windows, we don't want the shadow to obstruct
|
||||
* the other window.
|
||||
*/
|
||||
if (meta_window_get_tile_match (priv->window))
|
||||
return FALSE;
|
||||
|
||||
/*
|
||||
* Always put a shadow around windows with a frame - This should override
|
||||
* the restriction about not putting a shadow around ARGB windows.
|
||||
*/
|
||||
if (priv->window)
|
||||
{
|
||||
if (meta_window_get_frame (priv->window))
|
||||
{
|
||||
meta_verbose ("Window 0x%x has shadow because it has a frame\n",
|
||||
(guint)priv->xwindow);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
if (meta_window_get_frame (priv->window))
|
||||
return TRUE;
|
||||
|
||||
/*
|
||||
* Do not add shadows to ARGB windows; eventually we should generate a
|
||||
* shadow from the input shape for such windows.
|
||||
*/
|
||||
if (priv->argb32 || priv->opacity != 0xff)
|
||||
{
|
||||
meta_verbose ("Window 0x%x has no shadow as it is ARGB\n",
|
||||
(guint)priv->xwindow);
|
||||
return FALSE;
|
||||
}
|
||||
return FALSE;
|
||||
|
||||
/*
|
||||
* Add shadows to override redirect windows (e.g., Gtk menus).
|
||||
*/
|
||||
if (priv->window->override_redirect)
|
||||
{
|
||||
meta_verbose ("Window 0x%x has shadow because it is override redirect.\n",
|
||||
(guint)priv->xwindow);
|
||||
return TRUE;
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
/*
|
||||
* Don't put shadow around DND icon windows
|
||||
*/
|
||||
if (window_type == META_WINDOW_DND ||
|
||||
window_type == META_WINDOW_DESKTOP)
|
||||
{
|
||||
meta_verbose ("Window 0x%x has no shadow as it is DND or Desktop\n",
|
||||
(guint)priv->xwindow);
|
||||
return FALSE;
|
||||
}
|
||||
return FALSE;
|
||||
|
||||
if (window_type == META_WINDOW_MENU
|
||||
#if 0
|
||||
|| window_type == META_WINDOW_DROPDOWN_MENU
|
||||
#endif
|
||||
)
|
||||
{
|
||||
meta_verbose ("Window 0x%x has shadow as it is a menu\n",
|
||||
(guint)priv->xwindow);
|
||||
return TRUE;
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
#if 0
|
||||
if (window_type == META_WINDOW_TOOLTIP)
|
||||
{
|
||||
meta_verbose ("Window 0x%x has shadow as it is a tooltip\n",
|
||||
(guint)priv->xwindow);
|
||||
return TRUE;
|
||||
}
|
||||
return TRUE;
|
||||
#endif
|
||||
|
||||
meta_verbose ("Window 0x%x has no shadow as it fell through\n",
|
||||
(guint)priv->xwindow);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -944,26 +920,20 @@ static void
|
||||
meta_window_actor_damage_all (MetaWindowActor *self)
|
||||
{
|
||||
MetaWindowActorPrivate *priv = self->priv;
|
||||
ClutterX11TexturePixmap *texture_x11 = CLUTTER_X11_TEXTURE_PIXMAP (priv->actor);
|
||||
guint pixmap_width = 0;
|
||||
guint pixmap_height = 0;
|
||||
CoglHandle texture;
|
||||
|
||||
if (!priv->needs_damage_all)
|
||||
return;
|
||||
|
||||
g_object_get (texture_x11,
|
||||
"pixmap-width", &pixmap_width,
|
||||
"pixmap-height", &pixmap_height,
|
||||
NULL);
|
||||
texture = meta_shaped_texture_get_texture (META_SHAPED_TEXTURE (priv->actor));
|
||||
|
||||
if (!priv->mapped || priv->needs_pixmap)
|
||||
return;
|
||||
|
||||
clutter_x11_texture_pixmap_update_area (texture_x11,
|
||||
0,
|
||||
0,
|
||||
pixmap_width,
|
||||
pixmap_height);
|
||||
meta_shaped_texture_update_area (META_SHAPED_TEXTURE (priv->actor),
|
||||
0, 0,
|
||||
cogl_texture_get_width (texture),
|
||||
cogl_texture_get_height (texture));
|
||||
|
||||
priv->needs_damage_all = FALSE;
|
||||
}
|
||||
@@ -1202,9 +1172,8 @@ meta_window_actor_detach (MetaWindowActor *self)
|
||||
* you are supposed to be able to free a GLXPixmap after freeing the underlying
|
||||
* pixmap, but it certainly doesn't work with current DRI/Mesa
|
||||
*/
|
||||
clutter_x11_texture_pixmap_set_pixmap (CLUTTER_X11_TEXTURE_PIXMAP (priv->actor),
|
||||
None);
|
||||
meta_shaped_texture_clear (META_SHAPED_TEXTURE (priv->actor));
|
||||
meta_shaped_texture_set_pixmap (META_SHAPED_TEXTURE (priv->actor),
|
||||
None);
|
||||
cogl_flush();
|
||||
|
||||
XFreePixmap (xdisplay, priv->back_pixmap);
|
||||
@@ -1219,31 +1188,36 @@ meta_window_actor_should_unredirect (MetaWindowActor *self)
|
||||
MetaWindow *metaWindow = meta_window_actor_get_meta_window (self);
|
||||
MetaScreen *screen = meta_window_get_screen (metaWindow);
|
||||
MetaWindowActorPrivate *priv = self->priv;
|
||||
int screen_width, screen_height;
|
||||
MetaRectangle window_rect, monitor_rect;
|
||||
int num_monitors = meta_screen_get_n_monitors (screen);
|
||||
int i;
|
||||
|
||||
if (meta_window_is_override_redirect (metaWindow) && priv->opacity == 0xff && !priv->argb32)
|
||||
if (!meta_window_is_override_redirect (metaWindow))
|
||||
return FALSE;
|
||||
|
||||
if (priv->opacity != 0xff)
|
||||
return FALSE;
|
||||
|
||||
if (priv->argb32)
|
||||
return FALSE;
|
||||
|
||||
if (metaWindow->has_shape)
|
||||
return FALSE;
|
||||
|
||||
meta_screen_get_size (screen, &screen_width, &screen_height);
|
||||
meta_window_get_outer_rect (metaWindow, &window_rect);
|
||||
|
||||
if (window_rect.x == 0 && window_rect.y == 0 &&
|
||||
window_rect.width == screen_width && window_rect.height == screen_height)
|
||||
return TRUE;
|
||||
|
||||
for (i = 0; i < num_monitors; i++)
|
||||
{
|
||||
int screen_width, screen_height;
|
||||
MetaRectangle window_rect;
|
||||
meta_screen_get_size (screen, &screen_width, &screen_height);
|
||||
meta_window_get_outer_rect (metaWindow, &window_rect);
|
||||
|
||||
if (window_rect.x == 0 && window_rect.y == 0 &&
|
||||
window_rect.width == screen_width && window_rect.height == screen_height)
|
||||
return TRUE;
|
||||
else
|
||||
{
|
||||
int num_monitors = meta_screen_get_n_monitors (screen);
|
||||
int i;
|
||||
MetaRectangle monitor_rect;
|
||||
|
||||
for (i = 0; i < num_monitors; i++)
|
||||
{
|
||||
meta_screen_get_monitor_geometry (screen , i, &monitor_rect);
|
||||
if (monitor_rect.x == window_rect.x && monitor_rect.y == window_rect.y &&
|
||||
monitor_rect.width == window_rect.width && monitor_rect.height == window_rect.height)
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
meta_screen_get_monitor_geometry (screen , i, &monitor_rect);
|
||||
if (monitor_rect.x == window_rect.x && monitor_rect.y == window_rect.y &&
|
||||
monitor_rect.width == window_rect.width && monitor_rect.height == window_rect.height)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
@@ -1616,24 +1590,16 @@ meta_window_actor_update_bounding_region_and_borders (MetaWindowActor *self,
|
||||
int height)
|
||||
{
|
||||
MetaWindowActorPrivate *priv = self->priv;
|
||||
MetaFrame *frame;
|
||||
MetaFrameBorders borders;
|
||||
cairo_rectangle_int_t bounding_rectangle;
|
||||
|
||||
bounding_rectangle.x = 0;
|
||||
bounding_rectangle.y = 0;
|
||||
meta_frame_calc_borders (priv->window->frame, &borders);
|
||||
|
||||
frame = priv->window->frame;
|
||||
if (frame != NULL)
|
||||
{
|
||||
meta_frame_calc_borders (frame, &borders);
|
||||
bounding_rectangle.x = borders.invisible.left;
|
||||
bounding_rectangle.y = borders.invisible.top;
|
||||
|
||||
bounding_rectangle.x = borders.invisible.left;
|
||||
bounding_rectangle.y = borders.invisible.top;
|
||||
|
||||
width -= borders.invisible.left + borders.invisible.right;
|
||||
height -= borders.invisible.top + borders.invisible.bottom;
|
||||
}
|
||||
width -= borders.invisible.left + borders.invisible.right;
|
||||
height -= borders.invisible.top + borders.invisible.bottom;
|
||||
|
||||
bounding_rectangle.width = width;
|
||||
bounding_rectangle.height = height;
|
||||
@@ -1723,7 +1689,7 @@ meta_window_actor_get_obscured_region (MetaWindowActor *self)
|
||||
#if 0
|
||||
/* Print out a region; useful for debugging */
|
||||
static void
|
||||
dump_region (cairo_region_t *region)
|
||||
print_region (cairo_region_t *region)
|
||||
{
|
||||
int n_rects;
|
||||
int i;
|
||||
@@ -1741,6 +1707,26 @@ dump_region (cairo_region_t *region)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
/* Dump a region to a PNG file; useful for debugging */
|
||||
static void
|
||||
see_region (cairo_region_t *region,
|
||||
int width,
|
||||
int height,
|
||||
char *filename)
|
||||
{
|
||||
cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height);
|
||||
cairo_t *cr = cairo_create (surface);
|
||||
|
||||
gdk_cairo_region (cr, region);
|
||||
cairo_fill (cr);
|
||||
|
||||
cairo_surface_write_to_png (surface, filename);
|
||||
cairo_destroy (cr);
|
||||
cairo_surface_destroy (surface);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* meta_window_actor_set_visible_region:
|
||||
* @self: a #MetaWindowActor
|
||||
@@ -1756,22 +1742,9 @@ meta_window_actor_set_visible_region (MetaWindowActor *self,
|
||||
cairo_region_t *visible_region)
|
||||
{
|
||||
MetaWindowActorPrivate *priv = self->priv;
|
||||
cairo_region_t *texture_clip_region = NULL;
|
||||
|
||||
/* Get the area of the window texture that would be drawn if
|
||||
* we weren't obscured at all
|
||||
*/
|
||||
texture_clip_region = meta_shaped_texture_get_visible_pixels_region (META_SHAPED_TEXTURE (priv->actor));
|
||||
texture_clip_region = cairo_region_copy (texture_clip_region);
|
||||
|
||||
/* Then intersect that with the visible region to get the region
|
||||
* that we actually need to redraw.
|
||||
*/
|
||||
cairo_region_intersect (texture_clip_region, visible_region);
|
||||
|
||||
/* Assumes ownership */
|
||||
meta_shaped_texture_set_clip_region (META_SHAPED_TEXTURE (priv->actor),
|
||||
texture_clip_region);
|
||||
visible_region);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1823,19 +1796,6 @@ meta_window_actor_reset_visible_regions (MetaWindowActor *self)
|
||||
meta_window_actor_clear_shadow_clip (self);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
texture_pixmap_using_extension (ClutterX11TexturePixmap *texture)
|
||||
{
|
||||
ClutterTexture *self = CLUTTER_TEXTURE (texture);
|
||||
CoglHandle handle;
|
||||
|
||||
handle = clutter_texture_get_cogl_texture (self);
|
||||
|
||||
return handle != NULL &&
|
||||
cogl_is_texture_pixmap_x11 (handle) &&
|
||||
cogl_texture_pixmap_x11_is_using_tfp_extension (handle);
|
||||
}
|
||||
|
||||
static void
|
||||
check_needs_pixmap (MetaWindowActor *self)
|
||||
{
|
||||
@@ -1869,7 +1829,7 @@ check_needs_pixmap (MetaWindowActor *self)
|
||||
|
||||
if (priv->back_pixmap == None)
|
||||
{
|
||||
gint pxm_width, pxm_height;
|
||||
CoglHandle texture;
|
||||
|
||||
meta_error_trap_push (display);
|
||||
|
||||
@@ -1898,23 +1858,22 @@ check_needs_pixmap (MetaWindowActor *self)
|
||||
meta_shaped_texture_set_create_mipmaps (META_SHAPED_TEXTURE (priv->actor),
|
||||
FALSE);
|
||||
|
||||
clutter_x11_texture_pixmap_set_pixmap
|
||||
(CLUTTER_X11_TEXTURE_PIXMAP (priv->actor),
|
||||
priv->back_pixmap);
|
||||
meta_shaped_texture_set_pixmap (META_SHAPED_TEXTURE (priv->actor),
|
||||
priv->back_pixmap);
|
||||
|
||||
texture = meta_shaped_texture_get_texture (META_SHAPED_TEXTURE (priv->actor));
|
||||
|
||||
/*
|
||||
* This only works *after* actually setting the pixmap, so we have to
|
||||
* do it here.
|
||||
* See: http://bugzilla.clutter-project.org/show_bug.cgi?id=2236
|
||||
*/
|
||||
if (G_UNLIKELY (!texture_pixmap_using_extension (CLUTTER_X11_TEXTURE_PIXMAP (priv->actor))))
|
||||
if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (texture)))
|
||||
g_warning ("NOTE: Not using GLX TFP!\n");
|
||||
|
||||
g_object_get (priv->actor,
|
||||
"pixmap-width", &pxm_width,
|
||||
"pixmap-height", &pxm_height,
|
||||
NULL);
|
||||
|
||||
meta_window_actor_update_bounding_region_and_borders (self, pxm_width, pxm_height);
|
||||
meta_window_actor_update_bounding_region_and_borders (self,
|
||||
cogl_texture_get_width (texture),
|
||||
cogl_texture_get_height (texture));
|
||||
}
|
||||
|
||||
priv->needs_pixmap = FALSE;
|
||||
@@ -2007,7 +1966,6 @@ meta_window_actor_process_damage (MetaWindowActor *self,
|
||||
XDamageNotifyEvent *event)
|
||||
{
|
||||
MetaWindowActorPrivate *priv = self->priv;
|
||||
ClutterX11TexturePixmap *texture_x11 = CLUTTER_X11_TEXTURE_PIXMAP (priv->actor);
|
||||
|
||||
priv->received_damage = TRUE;
|
||||
|
||||
@@ -2038,11 +1996,11 @@ meta_window_actor_process_damage (MetaWindowActor *self,
|
||||
if (!priv->mapped || priv->needs_pixmap)
|
||||
return;
|
||||
|
||||
clutter_x11_texture_pixmap_update_area (texture_x11,
|
||||
event->area.x,
|
||||
event->area.y,
|
||||
event->area.width,
|
||||
event->area.height);
|
||||
meta_shaped_texture_update_area (META_SHAPED_TEXTURE (priv->actor),
|
||||
event->area.x,
|
||||
event->area.y,
|
||||
event->area.width,
|
||||
event->area.height);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -2059,121 +2017,197 @@ meta_window_actor_sync_visibility (MetaWindowActor *self)
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
set_integral_bounding_rect (cairo_rectangle_int_t *rect,
|
||||
double x, double y,
|
||||
double width, double height)
|
||||
{
|
||||
rect->x = floor(x);
|
||||
rect->y = floor(y);
|
||||
rect->width = ceil(x + width) - rect->x;
|
||||
rect->height = ceil(y + height) - rect->y;
|
||||
}
|
||||
#define TAU (2*M_PI)
|
||||
|
||||
static void
|
||||
update_corners (MetaWindowActor *self,
|
||||
MetaFrameBorders *borders)
|
||||
install_corners (MetaWindow *window,
|
||||
MetaFrameBorders *borders,
|
||||
cairo_t *cr)
|
||||
{
|
||||
MetaWindowActorPrivate *priv = self->priv;
|
||||
MetaRectangle outer;
|
||||
cairo_rectangle_int_t corner_rects[4];
|
||||
cairo_region_t *corner_region;
|
||||
cairo_path_t *corner_path;
|
||||
float top_left, top_right, bottom_left, bottom_right;
|
||||
float x, y;
|
||||
int x, y;
|
||||
MetaRectangle outer;
|
||||
|
||||
/* need these to build a path */
|
||||
cairo_t *cr;
|
||||
cairo_surface_t *surface;
|
||||
|
||||
if (!priv->window->frame)
|
||||
{
|
||||
meta_shaped_texture_set_overlay_path (META_SHAPED_TEXTURE (priv->actor),
|
||||
NULL, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
meta_window_get_outer_rect (priv->window, &outer);
|
||||
|
||||
meta_frame_get_corner_radiuses (priv->window->frame,
|
||||
meta_frame_get_corner_radiuses (window->frame,
|
||||
&top_left,
|
||||
&top_right,
|
||||
&bottom_left,
|
||||
&bottom_right);
|
||||
|
||||
/* Unfortunately, cairo does not allow us to create a context
|
||||
* without a surface. Create a 0x0 image surface to "paint to"
|
||||
* so we can get the path. */
|
||||
surface = cairo_image_surface_create (CAIRO_FORMAT_A8,
|
||||
0, 0);
|
||||
|
||||
cr = cairo_create (surface);
|
||||
meta_window_get_outer_rect (window, &outer);
|
||||
|
||||
/* top left */
|
||||
x = borders->invisible.left;
|
||||
y = borders->invisible.top;
|
||||
|
||||
set_integral_bounding_rect (&corner_rects[0],
|
||||
x, y, top_left, top_left);
|
||||
|
||||
cairo_arc (cr,
|
||||
x + top_left,
|
||||
y + top_left,
|
||||
top_left,
|
||||
0, M_PI*2);
|
||||
|
||||
2 * TAU / 4,
|
||||
3 * TAU / 4);
|
||||
|
||||
/* top right */
|
||||
x = borders->invisible.left + outer.width - top_right;
|
||||
y = borders->invisible.top;
|
||||
|
||||
set_integral_bounding_rect (&corner_rects[1],
|
||||
x, y, top_right, top_right);
|
||||
|
||||
cairo_arc (cr,
|
||||
x,
|
||||
y + top_right,
|
||||
top_right,
|
||||
0, M_PI*2);
|
||||
3 * TAU / 4,
|
||||
4 * TAU / 4);
|
||||
|
||||
/* bottom right */
|
||||
x = borders->invisible.left + outer.width - bottom_right;
|
||||
y = borders->invisible.top + outer.height - bottom_right;
|
||||
|
||||
set_integral_bounding_rect (&corner_rects[2],
|
||||
x, y, bottom_right, bottom_right);
|
||||
|
||||
cairo_arc (cr,
|
||||
x,
|
||||
y,
|
||||
bottom_right,
|
||||
0, M_PI*2);
|
||||
0 * TAU / 4,
|
||||
1 * TAU / 4);
|
||||
|
||||
/* bottom left */
|
||||
x = borders->invisible.left;
|
||||
y = borders->invisible.top + outer.height - bottom_left;
|
||||
|
||||
set_integral_bounding_rect (&corner_rects[3],
|
||||
x, y, bottom_left, bottom_left);
|
||||
|
||||
cairo_arc (cr,
|
||||
x + bottom_left,
|
||||
y,
|
||||
bottom_left,
|
||||
0, M_PI*2);
|
||||
1 * TAU / 4,
|
||||
2 * TAU / 4);
|
||||
|
||||
corner_path = cairo_copy_path (cr);
|
||||
cairo_set_source_rgba (cr, 1, 1, 1, 1);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
|
||||
static cairo_region_t *
|
||||
scan_visible_region (guchar *mask_data,
|
||||
int stride,
|
||||
cairo_region_t *scan_area)
|
||||
{
|
||||
int i, n_rects = cairo_region_num_rectangles (scan_area);
|
||||
MetaRegionBuilder builder;
|
||||
|
||||
meta_region_builder_init (&builder);
|
||||
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
int x, y;
|
||||
cairo_rectangle_int_t rect;
|
||||
|
||||
cairo_region_get_rectangle (scan_area, i, &rect);
|
||||
|
||||
for (y = rect.y; y < (rect.y + rect.height); y++)
|
||||
{
|
||||
for (x = rect.x; x < (rect.x + rect.width); x++)
|
||||
{
|
||||
int w = x;
|
||||
while (mask_data[y * stride + w] == 255 && w < (rect.x + rect.width))
|
||||
w++;
|
||||
|
||||
if (w > 0)
|
||||
{
|
||||
meta_region_builder_add_rectangle (&builder, x, y, w - x, 1);
|
||||
x = w;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return meta_region_builder_finish (&builder);
|
||||
}
|
||||
|
||||
static void
|
||||
build_and_scan_frame_mask (MetaWindowActor *self,
|
||||
MetaFrameBorders *borders,
|
||||
cairo_rectangle_int_t *client_area,
|
||||
cairo_region_t *shape_region)
|
||||
{
|
||||
MetaWindowActorPrivate *priv = self->priv;
|
||||
guchar *mask_data;
|
||||
guint tex_width, tex_height;
|
||||
CoglHandle paint_tex, mask_texture;
|
||||
int stride;
|
||||
cairo_t *cr;
|
||||
cairo_surface_t *surface;
|
||||
|
||||
paint_tex = meta_shaped_texture_get_texture (META_SHAPED_TEXTURE (priv->actor));
|
||||
if (paint_tex == COGL_INVALID_HANDLE)
|
||||
return;
|
||||
|
||||
tex_width = cogl_texture_get_width (paint_tex);
|
||||
tex_height = cogl_texture_get_height (paint_tex);
|
||||
|
||||
stride = cairo_format_stride_for_width (CAIRO_FORMAT_A8, tex_width);
|
||||
|
||||
/* Create data for an empty image */
|
||||
mask_data = g_malloc0 (stride * tex_height);
|
||||
|
||||
surface = cairo_image_surface_create_for_data (mask_data,
|
||||
CAIRO_FORMAT_A8,
|
||||
tex_width,
|
||||
tex_height,
|
||||
stride);
|
||||
cr = cairo_create (surface);
|
||||
|
||||
gdk_cairo_region (cr, shape_region);
|
||||
cairo_fill (cr);
|
||||
|
||||
if (priv->window->frame != NULL)
|
||||
{
|
||||
cairo_region_t *frame_paint_region, *scanned_region;
|
||||
cairo_rectangle_int_t rect = { 0, 0, tex_width, tex_height };
|
||||
|
||||
/* Make sure we don't paint the frame over the client window. */
|
||||
frame_paint_region = cairo_region_create_rectangle (&rect);
|
||||
cairo_region_subtract_rectangle (frame_paint_region, client_area);
|
||||
|
||||
gdk_cairo_region (cr, frame_paint_region);
|
||||
cairo_clip (cr);
|
||||
|
||||
install_corners (priv->window, borders, cr);
|
||||
|
||||
cairo_surface_flush (surface);
|
||||
scanned_region = scan_visible_region (mask_data, stride, frame_paint_region);
|
||||
cairo_region_union (shape_region, scanned_region);
|
||||
cairo_region_destroy (scanned_region);
|
||||
cairo_region_destroy (frame_paint_region);
|
||||
}
|
||||
|
||||
cairo_surface_destroy (surface);
|
||||
cairo_destroy (cr);
|
||||
cairo_surface_destroy (surface);
|
||||
|
||||
corner_region = cairo_region_create_rectangles (corner_rects, 4);
|
||||
if (meta_texture_rectangle_check (paint_tex))
|
||||
{
|
||||
mask_texture = meta_texture_rectangle_new (tex_width, tex_height,
|
||||
COGL_PIXEL_FORMAT_A_8,
|
||||
COGL_PIXEL_FORMAT_A_8,
|
||||
stride,
|
||||
mask_data,
|
||||
NULL /* error */);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Note: we don't allow slicing for this texture because we
|
||||
* need to use it with multi-texturing which doesn't support
|
||||
* sliced textures */
|
||||
mask_texture = cogl_texture_new_from_data (tex_width, tex_height,
|
||||
COGL_TEXTURE_NO_SLICING,
|
||||
COGL_PIXEL_FORMAT_A_8,
|
||||
COGL_PIXEL_FORMAT_ANY,
|
||||
stride,
|
||||
mask_data);
|
||||
}
|
||||
|
||||
meta_shaped_texture_set_overlay_path (META_SHAPED_TEXTURE (priv->actor),
|
||||
corner_region, corner_path);
|
||||
|
||||
cairo_region_destroy (corner_region);
|
||||
meta_shaped_texture_set_mask_texture (META_SHAPED_TEXTURE (priv->actor),
|
||||
mask_texture);
|
||||
cogl_handle_unref (mask_texture);
|
||||
|
||||
g_free (mask_data);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2183,57 +2217,31 @@ check_needs_reshape (MetaWindowActor *self)
|
||||
MetaScreen *screen = priv->screen;
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
MetaFrameBorders borders;
|
||||
cairo_region_t *region;
|
||||
cairo_region_t *region = NULL;
|
||||
cairo_rectangle_int_t client_area;
|
||||
gboolean needs_mask;
|
||||
|
||||
if (!priv->needs_reshape)
|
||||
return;
|
||||
|
||||
meta_shaped_texture_set_shape_region (META_SHAPED_TEXTURE (priv->actor), NULL);
|
||||
meta_frame_calc_borders (priv->window->frame, &borders);
|
||||
|
||||
client_area.x = borders.total.left;
|
||||
client_area.y = borders.total.top;
|
||||
client_area.width = priv->window->rect.width;
|
||||
client_area.height = priv->window->rect.height;
|
||||
|
||||
meta_shaped_texture_set_mask_texture (META_SHAPED_TEXTURE (priv->actor), COGL_INVALID_HANDLE);
|
||||
meta_window_actor_clear_shape_region (self);
|
||||
|
||||
if (priv->window->frame)
|
||||
meta_frame_calc_borders (priv->window->frame, &borders);
|
||||
else
|
||||
meta_frame_borders_clear (&borders);
|
||||
|
||||
region = meta_window_get_frame_bounds (priv->window);
|
||||
if (region != NULL)
|
||||
{
|
||||
/* This returns the window's internal frame bounds region,
|
||||
* so we need to copy it because we modify it below. */
|
||||
region = cairo_region_copy (region);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* If we have no region, we have no frame. We have no frame,
|
||||
* so just use the bounding region instead */
|
||||
region = cairo_region_copy (priv->bounding_region);
|
||||
}
|
||||
|
||||
#ifdef HAVE_SHAPE
|
||||
if (priv->window->has_shape)
|
||||
{
|
||||
/* Translate the set of XShape rectangles that we
|
||||
* get from the X server to a cairo_region. */
|
||||
Display *xdisplay = meta_display_get_xdisplay (display);
|
||||
XRectangle *rects;
|
||||
int n_rects, ordering;
|
||||
cairo_rectangle_int_t client_area;
|
||||
|
||||
client_area.width = priv->window->rect.width;
|
||||
client_area.height = priv->window->rect.height;
|
||||
|
||||
if (priv->window->frame)
|
||||
{
|
||||
client_area.x = borders.total.left;
|
||||
client_area.y = borders.total.top;
|
||||
}
|
||||
else
|
||||
{
|
||||
client_area.x = 0;
|
||||
client_area.y = 0;
|
||||
}
|
||||
|
||||
/* Punch out client area. */
|
||||
cairo_region_subtract_rectangle (region, &client_area);
|
||||
|
||||
meta_error_trap_push (display);
|
||||
rects = XShapeGetRectangles (xdisplay,
|
||||
@@ -2246,28 +2254,45 @@ check_needs_reshape (MetaWindowActor *self)
|
||||
if (rects)
|
||||
{
|
||||
int i;
|
||||
cairo_rectangle_int_t *cairo_rects = g_new (cairo_rectangle_int_t, n_rects);
|
||||
|
||||
for (i = 0; i < n_rects; i ++)
|
||||
{
|
||||
cairo_rectangle_int_t rect = { rects[i].x + client_area.x,
|
||||
rects[i].y + client_area.y,
|
||||
rects[i].width,
|
||||
rects[i].height };
|
||||
cairo_region_union_rectangle (region, &rect);
|
||||
cairo_rects[i].x = rects[i].x + client_area.x;
|
||||
cairo_rects[i].y = rects[i].y + client_area.y;
|
||||
cairo_rects[i].width = rects[i].width;
|
||||
cairo_rects[i].height = rects[i].height;
|
||||
}
|
||||
|
||||
XFree (rects);
|
||||
region = cairo_region_create_rectangles (cairo_rects, n_rects);
|
||||
g_free (cairo_rects);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
meta_shaped_texture_set_shape_region (META_SHAPED_TEXTURE (priv->actor),
|
||||
region);
|
||||
needs_mask = (region != NULL) || (priv->window->frame != NULL);
|
||||
|
||||
if (region == NULL)
|
||||
{
|
||||
/* If we don't have a shape on the server, that means that
|
||||
* we have an implicit shape of one rectangle covering the
|
||||
* entire window. */
|
||||
region = cairo_region_create_rectangle (&client_area);
|
||||
}
|
||||
|
||||
if (needs_mask)
|
||||
{
|
||||
/* This takes the region, generates a mask using GTK+
|
||||
* and scans the mask looking for all opaque pixels,
|
||||
* adding it to region.
|
||||
*/
|
||||
build_and_scan_frame_mask (self, &borders, &client_area, region);
|
||||
}
|
||||
|
||||
meta_window_actor_update_shape_region (self, region);
|
||||
|
||||
cairo_region_destroy (region);
|
||||
|
||||
update_corners (self, &borders);
|
||||
|
||||
priv->needs_reshape = FALSE;
|
||||
meta_window_actor_invalidate_shadow (self);
|
||||
}
|
||||
|
@@ -26,9 +26,28 @@ struct _MetaWindowGroup
|
||||
|
||||
G_DEFINE_TYPE (MetaWindowGroup, meta_window_group, CLUTTER_TYPE_GROUP);
|
||||
|
||||
/* We want to find out if the window is "close enough" to
|
||||
* 1:1 transform. We do that by converting the transformed coordinates
|
||||
* to 24.8 fixed-point before checking if they look right.
|
||||
/* This file uses pixel-aligned region computation to determine what
|
||||
* can be clipped out. This only really works if everything is aligned
|
||||
* to the pixel grid - not scaled or rotated and at integer offsets.
|
||||
*
|
||||
* (This could be relaxed - if we turned off filtering for unscaled
|
||||
* windows then windows would be, by definition aligned to the pixel
|
||||
* grid. And for rectangular windows without a shape, the outline that
|
||||
* we draw for an unrotated window is always a rectangle because we
|
||||
* don't use antialasing for the window boundary - with or without
|
||||
* filtering, with or without a scale. But figuring out exactly
|
||||
* what pixels will be drawn by the graphics system in these cases
|
||||
* gets tricky, so we just go for the easiest part - no scale,
|
||||
* and at integer offsets.)
|
||||
*
|
||||
* The way we check for pixel-aligned is by looking at the
|
||||
* transformation into screen space of the allocation box of an actor
|
||||
* and and checking if the corners are "close enough" to integral
|
||||
* pixel values.
|
||||
*/
|
||||
|
||||
/* The definition of "close enough" to integral pixel values is
|
||||
* equality when we convert to 24.8 fixed-point.
|
||||
*/
|
||||
static inline int
|
||||
round_to_fixed (float x)
|
||||
@@ -36,41 +55,24 @@ round_to_fixed (float x)
|
||||
return roundf (x * 256);
|
||||
}
|
||||
|
||||
/* We can only (easily) apply our logic for figuring out what a window
|
||||
* obscures if is not transformed. This function does that check and
|
||||
* as a side effect gets the position of the upper-left corner of the
|
||||
* actors.
|
||||
*
|
||||
* (We actually could handle scaled and non-integrally positioned actors
|
||||
* too as long as they weren't shaped - no filtering is done at the
|
||||
* edges so a rectangle stays a rectangle. But the gain from that is
|
||||
* small, especally since most of our windows are shaped. The simple
|
||||
* case we handle here is the case that matters when the user is just
|
||||
* using the desktop normally.)
|
||||
*
|
||||
* If we assume that the window group is untransformed (it better not
|
||||
* be!) then we could also make this determination by checking directly
|
||||
* if the actor itself is rotated, scaled, or at a non-integral position.
|
||||
* However, the criterion for "close enough" in that case get trickier,
|
||||
* since, for example, the allowed rotation depends on the size of
|
||||
* actor. The approach we take here is to just require everything
|
||||
* to be within 1/256th of a pixel.
|
||||
/* This helper function checks if (according to our fixed point precision)
|
||||
* the vertices @verts form a box of width @widthf and height @heightf
|
||||
* located at integral coordinates. These coordinates are returned
|
||||
* in @x_origin and @y_origin.
|
||||
*/
|
||||
static gboolean
|
||||
actor_is_untransformed (ClutterActor *actor,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
vertices_are_untransformed (ClutterVertex *verts,
|
||||
float widthf,
|
||||
float heightf,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
{
|
||||
gfloat widthf, heightf;
|
||||
int width, height;
|
||||
ClutterVertex verts[4];
|
||||
int v0x, v0y, v1x, v1y, v2x, v2y, v3x, v3y;
|
||||
int x, y;
|
||||
|
||||
clutter_actor_get_size (actor, &widthf, &heightf);
|
||||
width = round_to_fixed (widthf); height = round_to_fixed (heightf);
|
||||
|
||||
clutter_actor_get_abs_allocation_vertices (actor, verts);
|
||||
v0x = round_to_fixed (verts[0].x); v0y = round_to_fixed (verts[0].y);
|
||||
v1x = round_to_fixed (verts[1].x); v1y = round_to_fixed (verts[1].y);
|
||||
v2x = round_to_fixed (verts[2].x); v2y = round_to_fixed (verts[2].y);
|
||||
@@ -101,42 +103,118 @@ actor_is_untransformed (ClutterActor *actor,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#if CLUTTER_CHECK_VERSION(1, 9, 0)
|
||||
#define has_effects clutter_actor_has_effects
|
||||
#else
|
||||
|
||||
/* Check if an actor is "untransformed" - which actually means transformed by
|
||||
* at most a integer-translation. The integer translation, if any, is returned.
|
||||
*/
|
||||
static gboolean
|
||||
has_effects(ClutterActor *actor)
|
||||
actor_is_untransformed (ClutterActor *actor,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
{
|
||||
GList *list;
|
||||
gboolean ret;
|
||||
gfloat widthf, heightf;
|
||||
ClutterVertex verts[4];
|
||||
|
||||
list = clutter_actor_get_effects (actor);
|
||||
ret = list != NULL;
|
||||
g_list_free (list);
|
||||
clutter_actor_get_size (actor, &widthf, &heightf);
|
||||
clutter_actor_get_abs_allocation_vertices (actor, verts);
|
||||
|
||||
return ret;
|
||||
return vertices_are_untransformed (verts, widthf, heightf, x_origin, y_origin);
|
||||
}
|
||||
|
||||
#endif
|
||||
/* Help macros to scale from OpenGL <-1,1> coordinates system to
|
||||
* window coordinates ranging [0,window-size]. Borrowed from clutter-utils.c
|
||||
*/
|
||||
#define MTX_GL_SCALE_X(x,w,v1,v2) ((((((x) / (w)) + 1.0f) / 2.0f) * (v1)) + (v2))
|
||||
#define MTX_GL_SCALE_Y(y,w,v1,v2) ((v1) - (((((y) / (w)) + 1.0f) / 2.0f) * (v1)) + (v2))
|
||||
|
||||
/* Check if we're painting the MetaWindowGroup "untransformed". This can
|
||||
* differ from the result of actor_is_untransformed(window_group) if we're
|
||||
* inside a clone paint. The integer translation, if any, is returned.
|
||||
*/
|
||||
static gboolean
|
||||
painting_untransformed (MetaWindowGroup *window_group,
|
||||
int *x_origin,
|
||||
int *y_origin)
|
||||
{
|
||||
CoglMatrix modelview, projection, modelview_projection;
|
||||
ClutterVertex vertices[4];
|
||||
int width, height;
|
||||
float viewport[4];
|
||||
int i;
|
||||
|
||||
cogl_get_modelview_matrix (&modelview);
|
||||
cogl_get_projection_matrix (&projection);
|
||||
|
||||
cogl_matrix_multiply (&modelview_projection,
|
||||
&projection,
|
||||
&modelview);
|
||||
|
||||
meta_screen_get_size (window_group->screen, &width, &height);
|
||||
|
||||
vertices[0].x = 0;
|
||||
vertices[0].y = 0;
|
||||
vertices[0].z = 0;
|
||||
vertices[1].x = width;
|
||||
vertices[1].y = 0;
|
||||
vertices[1].z = 0;
|
||||
vertices[2].x = 0;
|
||||
vertices[2].y = height;
|
||||
vertices[2].z = 0;
|
||||
vertices[3].x = width;
|
||||
vertices[3].y = height;
|
||||
vertices[3].z = 0;
|
||||
|
||||
cogl_get_viewport (viewport);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
float w = 1;
|
||||
cogl_matrix_transform_point (&modelview_projection, &vertices[i].x, &vertices[i].y, &vertices[i].z, &w);
|
||||
vertices[i].x = MTX_GL_SCALE_X (vertices[i].x, w,
|
||||
viewport[2], viewport[0]);
|
||||
vertices[i].y = MTX_GL_SCALE_Y (vertices[i].y, w,
|
||||
viewport[3], viewport[1]);
|
||||
}
|
||||
|
||||
return vertices_are_untransformed (vertices, width, height, x_origin, y_origin);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_window_group_paint (ClutterActor *actor)
|
||||
{
|
||||
cairo_region_t *visible_region;
|
||||
cairo_region_t *unredirected_window_region = NULL;
|
||||
ClutterActor *stage;
|
||||
cairo_rectangle_int_t visible_rect, unredirected_rect;
|
||||
cairo_rectangle_int_t visible_rect;
|
||||
GList *children, *l;
|
||||
int paint_x_origin, paint_y_origin;
|
||||
int actor_x_origin, actor_y_origin;
|
||||
int paint_x_offset, paint_y_offset;
|
||||
|
||||
MetaWindowGroup *window_group = META_WINDOW_GROUP (actor);
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (window_group->screen);
|
||||
if (info->unredirected_window != NULL)
|
||||
|
||||
/* Normally we expect an actor to be drawn at it's position on the screen.
|
||||
* However, if we're inside the paint of a ClutterClone, that won't be the
|
||||
* case and we need to compensate. We look at the position of the window
|
||||
* group under the current model-view matrix and the position of the actor.
|
||||
* If they are both simply integer translations, then we can compensate
|
||||
* easily, otherwise we give up.
|
||||
*
|
||||
* Possible cleanup: work entirely in paint space - we can compute the
|
||||
* combination of the model-view matrix with the local matrix for each child
|
||||
* actor and get a total transformation for that actor for how we are
|
||||
* painting currently, and never worry about how actors are positioned
|
||||
* on the stage.
|
||||
*/
|
||||
if (!painting_untransformed (window_group, &paint_x_origin, &paint_y_origin) ||
|
||||
!actor_is_untransformed (actor, &actor_x_origin, &actor_y_origin))
|
||||
{
|
||||
meta_window_actor_get_shape_bounds (META_WINDOW_ACTOR (info->unredirected_window), &unredirected_rect);
|
||||
unredirected_window_region = cairo_region_create_rectangle (&unredirected_rect);
|
||||
CLUTTER_ACTOR_CLASS (meta_window_group_parent_class)->paint (actor);
|
||||
return;
|
||||
}
|
||||
|
||||
paint_x_offset = paint_x_origin - actor_x_origin;
|
||||
paint_y_offset = paint_y_origin - actor_y_origin;
|
||||
|
||||
/* We walk the list from top to bottom (opposite of painting order),
|
||||
* and subtract the opaque area of each window out of the visible
|
||||
* region that we pass to the windows below.
|
||||
@@ -156,14 +234,23 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
|
||||
visible_region = cairo_region_create_rectangle (&visible_rect);
|
||||
|
||||
if (unredirected_window_region)
|
||||
cairo_region_subtract (visible_region, unredirected_window_region);
|
||||
if (info->unredirected_window != NULL)
|
||||
{
|
||||
cairo_rectangle_int_t unredirected_rect;
|
||||
MetaWindow *window = meta_window_actor_get_meta_window (info->unredirected_window);
|
||||
|
||||
meta_window_get_outer_rect (window, (MetaRectangle *)&unredirected_rect);
|
||||
cairo_region_subtract_rectangle (visible_region, &unredirected_rect);
|
||||
}
|
||||
|
||||
for (l = children; l; l = l->next)
|
||||
{
|
||||
if (!CLUTTER_ACTOR_IS_VISIBLE (l->data))
|
||||
continue;
|
||||
|
||||
if (l->data == info->unredirected_window)
|
||||
continue;
|
||||
|
||||
/* If an actor has effects applied, then that can change the area
|
||||
* it paints and the opacity, so we no longer can figure out what
|
||||
* portion of the actor is obscured and what portion of the screen
|
||||
@@ -180,7 +267,7 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
* as well for the same reason, but omitted for simplicity in the
|
||||
* hopes that no-one will do that.
|
||||
*/
|
||||
if (has_effects (l->data))
|
||||
if (clutter_actor_has_effects (l->data))
|
||||
continue;
|
||||
|
||||
if (META_IS_WINDOW_ACTOR (l->data))
|
||||
@@ -191,6 +278,9 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
if (!actor_is_untransformed (CLUTTER_ACTOR (window_actor), &x, &y))
|
||||
continue;
|
||||
|
||||
x += paint_x_offset;
|
||||
y += paint_y_offset;
|
||||
|
||||
/* Temporarily move to the coordinate system of the actor */
|
||||
cairo_region_translate (visible_region, - x, - y);
|
||||
|
||||
@@ -209,15 +299,22 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
else if (META_IS_BACKGROUND_ACTOR (l->data))
|
||||
{
|
||||
MetaBackgroundActor *background_actor = l->data;
|
||||
int x, y;
|
||||
|
||||
if (!actor_is_untransformed (CLUTTER_ACTOR (background_actor), &x, &y))
|
||||
continue;
|
||||
|
||||
x += paint_x_offset;
|
||||
y += paint_y_offset;
|
||||
|
||||
cairo_region_translate (visible_region, - x, - y);
|
||||
meta_background_actor_set_visible_region (background_actor, visible_region);
|
||||
cairo_region_translate (visible_region, x, y);
|
||||
}
|
||||
}
|
||||
|
||||
cairo_region_destroy (visible_region);
|
||||
|
||||
if (unredirected_window_region)
|
||||
cairo_region_destroy (unredirected_window_region);
|
||||
|
||||
CLUTTER_ACTOR_CLASS (meta_window_group_parent_class)->paint (actor);
|
||||
|
||||
/* Now that we are done painting, unset the visible regions (they will
|
||||
@@ -228,7 +325,6 @@ meta_window_group_paint (ClutterActor *actor)
|
||||
if (META_IS_WINDOW_ACTOR (l->data))
|
||||
{
|
||||
MetaWindowActor *window_actor = l->data;
|
||||
window_actor = l->data;
|
||||
meta_window_actor_reset_visible_regions (window_actor);
|
||||
}
|
||||
else if (META_IS_BACKGROUND_ACTOR (l->data))
|
||||
|
@@ -16,3 +16,9 @@ pkglib_LTLIBRARIES = default.la
|
||||
install-exec-hook:
|
||||
-rm $(DESTDIR)$(pkglibdir)/*.a
|
||||
-rm $(DESTDIR)$(pkglibdir)/*.la
|
||||
|
||||
# Since we removed the .la file, 'make uninstall' doesn't work properly,
|
||||
# since it counts on libtool to remove the .la files, so just kill the
|
||||
# .so file manually.
|
||||
uninstall-local:
|
||||
-rm -f $(DESTDIR)$(pkglibdir)/default.so
|
||||
|
@@ -112,8 +112,6 @@ struct _MetaDefaultPluginPrivate
|
||||
ClutterActor *desktop2;
|
||||
|
||||
MetaPluginInfo info;
|
||||
|
||||
gboolean debug_mode : 1;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -182,34 +180,6 @@ meta_default_plugin_get_property (GObject *object,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
start (MetaPlugin *plugin)
|
||||
{
|
||||
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
|
||||
|
||||
guint destroy_timeout = DESTROY_TIMEOUT;
|
||||
guint minimize_timeout = MINIMIZE_TIMEOUT;
|
||||
guint maximize_timeout = MAXIMIZE_TIMEOUT;
|
||||
guint map_timeout = MAP_TIMEOUT;
|
||||
guint switch_timeout = SWITCH_TIMEOUT;
|
||||
|
||||
if (meta_plugin_debug_mode (plugin))
|
||||
{
|
||||
g_debug ("Plugin %s: Entering debug mode.", priv->info.name);
|
||||
|
||||
priv->debug_mode = TRUE;
|
||||
|
||||
/*
|
||||
* Double the effect duration to make them easier to observe.
|
||||
*/
|
||||
destroy_timeout *= 2;
|
||||
minimize_timeout *= 2;
|
||||
maximize_timeout *= 2;
|
||||
map_timeout *= 2;
|
||||
switch_timeout *= 2;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_default_plugin_class_init (MetaDefaultPluginClass *klass)
|
||||
{
|
||||
@@ -221,7 +191,6 @@ meta_default_plugin_class_init (MetaDefaultPluginClass *klass)
|
||||
gobject_class->set_property = meta_default_plugin_set_property;
|
||||
gobject_class->get_property = meta_default_plugin_get_property;
|
||||
|
||||
plugin_class->start = start;
|
||||
plugin_class->map = map;
|
||||
plugin_class->minimize = minimize;
|
||||
plugin_class->maximize = maximize;
|
||||
@@ -284,7 +253,8 @@ on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data)
|
||||
{
|
||||
MetaPlugin *plugin = META_PLUGIN (data);
|
||||
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
|
||||
GList *l = meta_plugin_get_window_actors (plugin);
|
||||
MetaScreen *screen = meta_plugin_get_screen (plugin);
|
||||
GList *l = meta_get_window_actors (screen);
|
||||
|
||||
while (l)
|
||||
{
|
||||
@@ -317,6 +287,7 @@ switch_workspace (MetaPlugin *plugin,
|
||||
gint from, gint to,
|
||||
MetaMotionDirection direction)
|
||||
{
|
||||
MetaScreen *screen;
|
||||
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
|
||||
GList *l;
|
||||
ClutterActor *workspace0 = clutter_group_new ();
|
||||
@@ -325,11 +296,13 @@ switch_workspace (MetaPlugin *plugin,
|
||||
int screen_width, screen_height;
|
||||
ClutterAnimation *animation;
|
||||
|
||||
stage = meta_plugin_get_stage (plugin);
|
||||
screen = meta_plugin_get_screen (plugin);
|
||||
stage = meta_get_stage_for_screen (screen);
|
||||
|
||||
meta_screen_get_size (screen,
|
||||
&screen_width,
|
||||
&screen_height);
|
||||
|
||||
meta_plugin_query_screen_size (plugin,
|
||||
&screen_width,
|
||||
&screen_height);
|
||||
clutter_actor_set_anchor_point (workspace1,
|
||||
screen_width,
|
||||
screen_height);
|
||||
@@ -348,7 +321,7 @@ switch_workspace (MetaPlugin *plugin,
|
||||
return;
|
||||
}
|
||||
|
||||
l = g_list_last (meta_plugin_get_window_actors (plugin));
|
||||
l = g_list_last (meta_get_window_actors (screen));
|
||||
|
||||
while (l)
|
||||
{
|
||||
@@ -446,12 +419,19 @@ static void
|
||||
minimize (MetaPlugin *plugin, MetaWindowActor *window_actor)
|
||||
{
|
||||
MetaWindowType type;
|
||||
MetaRectangle icon_geometry;
|
||||
MetaWindow *meta_window = meta_window_actor_get_meta_window (window_actor);
|
||||
ClutterActor *actor = CLUTTER_ACTOR (window_actor);
|
||||
|
||||
|
||||
type = meta_window_get_window_type (meta_window);
|
||||
|
||||
if (!meta_window_get_icon_geometry(meta_window, &icon_geometry))
|
||||
{
|
||||
icon_geometry.x = 0;
|
||||
icon_geometry.y = 0;
|
||||
}
|
||||
|
||||
if (type == META_WINDOW_NORMAL)
|
||||
{
|
||||
ClutterAnimation *animation;
|
||||
@@ -468,6 +448,8 @@ minimize (MetaPlugin *plugin, MetaWindowActor *window_actor)
|
||||
MINIMIZE_TIMEOUT,
|
||||
"scale-x", 0.0,
|
||||
"scale-y", 0.0,
|
||||
"x", (double)icon_geometry.x,
|
||||
"y", (double)icon_geometry.y,
|
||||
NULL);
|
||||
apriv->tml_minimize = clutter_animation_get_timeline (animation);
|
||||
data->plugin = plugin;
|
||||
|
@@ -43,34 +43,17 @@
|
||||
/* Optimium performance seems to be with MAX_CHUNK_RECTANGLES=4; 8 is about 10% slower.
|
||||
* But using 8 may be more robust to systems with slow malloc(). */
|
||||
#define MAX_CHUNK_RECTANGLES 8
|
||||
#define MAX_LEVELS 16
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* To merge regions in binary tree order, we need to keep track of
|
||||
* the regions that we've already merged together at different
|
||||
* levels of the tree. We fill in an array in the pattern:
|
||||
*
|
||||
* |a |
|
||||
* |b |a |
|
||||
* |c | |ab |
|
||||
* |d |c |ab |
|
||||
* |e | | |abcd|
|
||||
*/
|
||||
cairo_region_t *levels[MAX_LEVELS];
|
||||
int n_levels;
|
||||
} MetaRegionBuilder;
|
||||
|
||||
static void
|
||||
void
|
||||
meta_region_builder_init (MetaRegionBuilder *builder)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < MAX_LEVELS; i++)
|
||||
for (i = 0; i < META_REGION_BUILDER_MAX_LEVELS; i++)
|
||||
builder->levels[i] = NULL;
|
||||
builder->n_levels = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
meta_region_builder_add_rectangle (MetaRegionBuilder *builder,
|
||||
int x,
|
||||
int y,
|
||||
@@ -95,7 +78,7 @@ meta_region_builder_add_rectangle (MetaRegionBuilder *builder,
|
||||
{
|
||||
if (builder->levels[i] == NULL)
|
||||
{
|
||||
if (i < MAX_LEVELS)
|
||||
if (i < META_REGION_BUILDER_MAX_LEVELS)
|
||||
{
|
||||
builder->levels[i] = builder->levels[i - 1];
|
||||
builder->levels[i - 1] = NULL;
|
||||
@@ -115,7 +98,7 @@ meta_region_builder_add_rectangle (MetaRegionBuilder *builder,
|
||||
}
|
||||
}
|
||||
|
||||
static cairo_region_t *
|
||||
cairo_region_t *
|
||||
meta_region_builder_finish (MetaRegionBuilder *builder)
|
||||
{
|
||||
cairo_region_t *result = NULL;
|
||||
|
@@ -63,6 +63,32 @@ struct _MetaRegionIterator {
|
||||
cairo_rectangle_int_t next_rectangle;
|
||||
};
|
||||
|
||||
typedef struct _MetaRegionBuilder MetaRegionBuilder;
|
||||
|
||||
#define META_REGION_BUILDER_MAX_LEVELS 16
|
||||
struct _MetaRegionBuilder {
|
||||
/* To merge regions in binary tree order, we need to keep track of
|
||||
* the regions that we've already merged together at different
|
||||
* levels of the tree. We fill in an array in the pattern:
|
||||
*
|
||||
* |a |
|
||||
* |b |a |
|
||||
* |c | |ab |
|
||||
* |d |c |ab |
|
||||
* |e | | |abcd|
|
||||
*/
|
||||
cairo_region_t *levels[META_REGION_BUILDER_MAX_LEVELS];
|
||||
int n_levels;
|
||||
};
|
||||
|
||||
void meta_region_builder_init (MetaRegionBuilder *builder);
|
||||
void meta_region_builder_add_rectangle (MetaRegionBuilder *builder,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height);
|
||||
cairo_region_t * meta_region_builder_finish (MetaRegionBuilder *builder);
|
||||
|
||||
void meta_region_iterator_init (MetaRegionIterator *iter,
|
||||
cairo_region_t *region);
|
||||
gboolean meta_region_iterator_at_end (MetaRegionIterator *iter);
|
||||
|
109
src/core/bell.c
109
src/core/bell.c
@@ -23,7 +23,8 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file bell.c Ring the bell or flash the screen
|
||||
* SECTION:Bell
|
||||
* @short_description: Ring the bell or flash the screen
|
||||
*
|
||||
* Sometimes, X programs "ring the bell", whatever that means. Mutter lets
|
||||
* the user configure the bell to be audible or visible (aka visual), and
|
||||
@@ -57,6 +58,10 @@
|
||||
#endif
|
||||
|
||||
/**
|
||||
* bell_flash_screen:
|
||||
* @display: The display which owns the screen (rather redundant)
|
||||
* @screen: The screen to flash
|
||||
*
|
||||
* Flashes one entire screen. This is done by making a window the size of the
|
||||
* whole screen (or reusing the old one, if it's still around), mapping it,
|
||||
* painting it white and then black, and then unmapping it. We set saveunder so
|
||||
@@ -65,14 +70,12 @@
|
||||
* Unlike frame flashes, we don't do fullscreen flashes with a timeout; rather,
|
||||
* we do them in one go, because we don't have to rely on the theme code
|
||||
* redrawing the frame for us in order to do the flash.
|
||||
*
|
||||
* \param display The display which owns the screen (rather redundant)
|
||||
* \param screen The screen to flash
|
||||
*
|
||||
* \bug The way I read it, this appears not to do the flash
|
||||
*/
|
||||
/*
|
||||
* Bug: The way I read it, this appears not to do the flash
|
||||
* the first time we flash a particular display. Am I wrong?
|
||||
*
|
||||
* \bug This appears to destroy our current XSync status.
|
||||
* Bug: This appears to destroy our current XSync status.
|
||||
*/
|
||||
static void
|
||||
bell_flash_screen (MetaDisplay *display,
|
||||
@@ -137,14 +140,15 @@ bell_flash_screen (MetaDisplay *display,
|
||||
}
|
||||
|
||||
/**
|
||||
* bell_flash_fullscreen:
|
||||
* @display: The display the event came in on
|
||||
* @xkb_ev: The bell event
|
||||
*
|
||||
* Flashes one screen, or all screens, in response to a bell event.
|
||||
* If the event is on a particular window, flash the screen that
|
||||
* window is on. Otherwise, flash every screen on this display.
|
||||
*
|
||||
* If the configure script found we had no XKB, this does not exist.
|
||||
*
|
||||
* \param display The display the event came in on
|
||||
* \param xkb_ev The bell event
|
||||
*/
|
||||
#ifdef HAVE_XKB
|
||||
static void
|
||||
@@ -182,17 +186,21 @@ bell_flash_fullscreen (MetaDisplay *display,
|
||||
}
|
||||
|
||||
/**
|
||||
* bell_unflash_frame:
|
||||
* @data: The frame to unflash, cast to a gpointer so it can go into
|
||||
* a callback function.
|
||||
*
|
||||
* Makes a frame be not flashed; this is the timeout half of
|
||||
* bell_flash_window_frame(). This is done simply by clearing the
|
||||
* flash flag and queuing a redraw of the frame.
|
||||
*
|
||||
* If the configure script found we had no XKB, this does not exist.
|
||||
*
|
||||
* \param data The frame to unflash, cast to a gpointer so it can go into
|
||||
* a callback function.
|
||||
* \return Always FALSE, so we don't get called again.
|
||||
*
|
||||
* \bug This is the parallel to bell_flash_window_frame(), so it should
|
||||
* Returns: Always FALSE, so we don't get called again.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Bug: This is the parallel to bell_flash_window_frame(), so it should
|
||||
* really be called meta_bell_unflash_window_frame().
|
||||
*/
|
||||
static gboolean
|
||||
@@ -205,6 +213,9 @@ bell_unflash_frame (gpointer data)
|
||||
}
|
||||
|
||||
/**
|
||||
* bell_flash_window_frame:
|
||||
* @window: The window to flash
|
||||
*
|
||||
* Makes a frame flash and then return to normal shortly afterwards.
|
||||
* This is done by setting a flag so that the theme
|
||||
* code will temporarily draw the frame as focussed if it's unfocussed and
|
||||
@@ -212,8 +223,6 @@ bell_unflash_frame (gpointer data)
|
||||
* that the flag can be unset and the frame re-redrawn.
|
||||
*
|
||||
* If the configure script found we had no XKB, this does not exist.
|
||||
*
|
||||
* \param window The window to flash
|
||||
*/
|
||||
static void
|
||||
bell_flash_window_frame (MetaWindow *window)
|
||||
@@ -230,26 +239,52 @@ bell_flash_window_frame (MetaWindow *window)
|
||||
bell_unflash_frame, window->frame, NULL);
|
||||
}
|
||||
|
||||
static MetaWindow *
|
||||
get_flash_window (MetaDisplay *display,
|
||||
XkbAnyEvent *xkb_ev)
|
||||
{
|
||||
XkbBellNotifyEvent *xkb_bell_event;
|
||||
MetaWindow *window;
|
||||
|
||||
g_assert (xkb_ev->xkb_type == XkbBellNotify);
|
||||
|
||||
xkb_bell_event = (XkbBellNotifyEvent *) xkb_ev;
|
||||
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
|
||||
|
||||
if (!window &&
|
||||
g_hash_table_size (display->focus_info) == 1)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
MetaFocusInfo *info;
|
||||
|
||||
/* If there is only one focused window, use it */
|
||||
g_hash_table_iter_init (&iter, display->focus_info);
|
||||
|
||||
if (g_hash_table_iter_next (&iter, NULL, (gpointer *) &info) &&
|
||||
info->focus_window && info->focus_window->frame)
|
||||
window = info->focus_window;
|
||||
}
|
||||
|
||||
return window;
|
||||
}
|
||||
|
||||
/**
|
||||
* bell_flash_frame:
|
||||
* @display: The display the bell event came in on
|
||||
* @xkb_ev: The bell event we just received
|
||||
*
|
||||
* Flashes the frame of the focussed window. If there is no focussed window,
|
||||
* flashes the screen.
|
||||
*
|
||||
* \param display The display the bell event came in on
|
||||
* \param xkb_ev The bell event we just received
|
||||
*/
|
||||
static void
|
||||
bell_flash_frame (MetaDisplay *display,
|
||||
XkbAnyEvent *xkb_ev)
|
||||
{
|
||||
XkbBellNotifyEvent *xkb_bell_event = (XkbBellNotifyEvent *) xkb_ev;
|
||||
MetaWindow *window;
|
||||
|
||||
g_assert (xkb_ev->xkb_type == XkbBellNotify);
|
||||
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
|
||||
if (!window && (display->focus_window))
|
||||
{
|
||||
window = display->focus_window;
|
||||
}
|
||||
window = get_flash_window (display, xkb_ev);
|
||||
|
||||
if (window && window->frame)
|
||||
{
|
||||
bell_flash_window_frame (window);
|
||||
@@ -261,15 +296,18 @@ bell_flash_frame (MetaDisplay *display,
|
||||
}
|
||||
|
||||
/**
|
||||
* bell_visual_notify:
|
||||
* @display: The display the bell event came in on
|
||||
* @xkb_ev: The bell event we just received
|
||||
*
|
||||
* Gives the user some kind of visual bell substitute, in response to a
|
||||
* bell event. What this is depends on the "visual bell type" pref.
|
||||
*
|
||||
* If the configure script found we had no XKB, this does not exist.
|
||||
*
|
||||
* \param display The display the bell event came in on
|
||||
* \param xkb_ev The bell event we just received
|
||||
*
|
||||
* \bug This should be merged with meta_bell_notify().
|
||||
*/
|
||||
|
||||
/*
|
||||
* Bug: This should be merged with meta_bell_notify().
|
||||
*/
|
||||
static void
|
||||
bell_visual_notify (MetaDisplay *display,
|
||||
@@ -307,9 +345,7 @@ meta_bell_notify (MetaDisplay *display,
|
||||
ca_proplist_sets (p, CA_PROP_EVENT_DESCRIPTION, _("Bell event"));
|
||||
ca_proplist_sets (p, CA_PROP_CANBERRA_CACHE_CONTROL, "permanent");
|
||||
|
||||
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
|
||||
if (!window && (display->focus_window) && (display->focus_window->frame))
|
||||
window = display->focus_window;
|
||||
window = get_flash_window (display, xkb_ev);
|
||||
|
||||
if (window)
|
||||
{
|
||||
@@ -407,12 +443,13 @@ meta_bell_shutdown (MetaDisplay *display)
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_bell_notify_frame_destroy:
|
||||
* @frame: The frame which is being destroyed
|
||||
*
|
||||
* Deals with a frame being destroyed. This is important because if we're
|
||||
* using a visual bell, we might be flashing the edges of the frame, and
|
||||
* so we'd have a timeout function waiting ready to un-flash them. If the
|
||||
* frame's going away, we can tell the timeout not to bother.
|
||||
*
|
||||
* \param frame The frame which is being destroyed
|
||||
*/
|
||||
void
|
||||
meta_bell_notify_frame_destroy (MetaFrame *frame)
|
||||
|
@@ -1,17 +1,5 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file bell.h Ring the bell or flash the screen
|
||||
*
|
||||
* Sometimes, X programs "ring the bell", whatever that means. Mutter lets
|
||||
* the user configure the bell to be audible or visible (aka visual), and
|
||||
* if it's visual it can be configured to be frame-flash or fullscreen-flash.
|
||||
* We never get told about audible bells; X handles them just fine by itself.
|
||||
*
|
||||
* The visual bell was the result of a discussion in Bugzilla here:
|
||||
* <http://bugzilla.gnome.org/show_bug.cgi?id=99886>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2002 Sun Microsystems Inc.
|
||||
*
|
||||
|
@@ -625,7 +625,6 @@ meta_rectangle_get_minimal_spanning_set_for_region (
|
||||
*temp_rect = *basic_rect;
|
||||
ret = g_list_prepend (NULL, temp_rect);
|
||||
|
||||
strut_iter = all_struts;
|
||||
for (strut_iter = all_struts; strut_iter; strut_iter = strut_iter->next)
|
||||
{
|
||||
GList *rect_iter;
|
||||
|
@@ -119,6 +119,7 @@ typedef struct
|
||||
MetaRectangle orig;
|
||||
MetaRectangle current;
|
||||
MetaFrameBorders *borders;
|
||||
gboolean must_free_borders;
|
||||
ActionType action_type;
|
||||
gboolean is_user_action;
|
||||
|
||||
@@ -337,7 +338,7 @@ meta_window_constrain (MetaWindow *window,
|
||||
* not gobject-style--gobject would be more pain than it's worth) or
|
||||
* smart pointers would be so much nicer here. *shrug*
|
||||
*/
|
||||
if (!orig_borders)
|
||||
if (info.must_free_borders)
|
||||
g_free (info.borders);
|
||||
}
|
||||
|
||||
@@ -358,9 +359,15 @@ setup_constraint_info (ConstraintInfo *info,
|
||||
|
||||
/* Create a fake frame geometry if none really exists */
|
||||
if (orig_borders && !window->fullscreen)
|
||||
info->borders = orig_borders;
|
||||
{
|
||||
info->borders = orig_borders;
|
||||
info->must_free_borders = FALSE;
|
||||
}
|
||||
else
|
||||
info->borders = g_new0 (MetaFrameBorders, 1);
|
||||
{
|
||||
info->borders = g_new0 (MetaFrameBorders, 1);
|
||||
info->must_free_borders = TRUE;
|
||||
}
|
||||
|
||||
if (flags & META_IS_MOVE_ACTION && flags & META_IS_RESIZE_ACTION)
|
||||
info->action_type = ACTION_MOVE_AND_RESIZE;
|
||||
@@ -573,7 +580,7 @@ place_window_if_needed(MetaWindow *window,
|
||||
META_MAXIMIZE_VERTICAL : 0), &info->current);
|
||||
|
||||
/* maximization may have changed frame geometry */
|
||||
if (window->frame && !window->fullscreen)
|
||||
if (!window->fullscreen)
|
||||
meta_frame_calc_borders (window->frame, info->borders);
|
||||
|
||||
if (window->fullscreen_after_placement)
|
||||
@@ -757,21 +764,12 @@ constrain_modal_dialog (MetaWindow *window,
|
||||
return TRUE;
|
||||
|
||||
x = parent->rect.x + (parent->rect.width / 2 - info->current.width / 2);
|
||||
y = 0;
|
||||
y = parent->rect.y + (parent->rect.height / 2 - info->current.height / 2);
|
||||
if (parent->frame)
|
||||
{
|
||||
MetaFrameBorders borders;
|
||||
|
||||
x += parent->frame->rect.x;
|
||||
y += parent->frame->rect.y;
|
||||
|
||||
meta_frame_calc_borders (parent->frame, &borders);
|
||||
y += borders.total.top;
|
||||
|
||||
y += info->borders->visible.top;
|
||||
}
|
||||
else
|
||||
y = parent->rect.y + info->borders->visible.top;
|
||||
|
||||
constraint_already_satisfied = (x == info->current.x) && (y == info->current.y);
|
||||
|
||||
@@ -1367,15 +1365,18 @@ constrain_titlebar_visible (MetaWindow *window,
|
||||
int bottom_amount;
|
||||
int horiz_amount_offscreen, vert_amount_offscreen;
|
||||
int horiz_amount_onscreen, vert_amount_onscreen;
|
||||
MetaGrabInfo *grab_info;
|
||||
|
||||
if (priority > PRIORITY_TITLEBAR_VISIBLE)
|
||||
return TRUE;
|
||||
|
||||
grab_info = window->cur_grab;
|
||||
|
||||
/* Allow the titlebar beyond the top of the screen only if the user wasn't
|
||||
* clicking on the frame to start the move.
|
||||
*/
|
||||
unconstrained_user_action =
|
||||
info->is_user_action && !window->display->grab_frame_action;
|
||||
info->is_user_action && (!grab_info || !grab_info->grab_frame_action);
|
||||
|
||||
/* Exit early if we know the constraint won't apply--note that this constraint
|
||||
* is only meant for normal windows (e.g. we don't want docks to be shoved
|
||||
|
200
src/core/core.c
200
src/core/core.c
@@ -30,6 +30,11 @@
|
||||
#include <meta/prefs.h>
|
||||
#include <meta/errors.h>
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
#include <X11/extensions/XInput2.h>
|
||||
#include "devices-xi2.h"
|
||||
#endif
|
||||
|
||||
/* Looks up the MetaWindow representing the frame of the given X window.
|
||||
* Used as a helper function by a bunch of the functions below.
|
||||
*
|
||||
@@ -245,9 +250,19 @@ lower_window_and_transients (MetaWindow *window,
|
||||
void
|
||||
meta_core_user_lower_and_unfocus (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
int device_id,
|
||||
guint32 timestamp)
|
||||
{
|
||||
MetaWindow *window = get_window (xdisplay, frame_xwindow);
|
||||
MetaDevice *pointer;
|
||||
|
||||
pointer = meta_device_map_lookup (window->display->device_map, device_id);
|
||||
|
||||
if (pointer == NULL)
|
||||
return;
|
||||
|
||||
if (!META_IS_DEVICE_POINTER (pointer))
|
||||
pointer = meta_device_get_paired_device (pointer);
|
||||
|
||||
lower_window_and_transients (window, NULL);
|
||||
|
||||
@@ -256,6 +271,7 @@ meta_core_user_lower_and_unfocus (Display *xdisplay,
|
||||
* this will be invoked via keyboard action or by a mouse action;
|
||||
* in either case the window or a modal child will have been focused.) */
|
||||
meta_workspace_focus_default_window (window->screen->active_workspace,
|
||||
pointer,
|
||||
NULL,
|
||||
timestamp);
|
||||
}
|
||||
@@ -263,16 +279,21 @@ meta_core_user_lower_and_unfocus (Display *xdisplay,
|
||||
void
|
||||
meta_core_lower_beneath_grab_window (Display *xdisplay,
|
||||
Window xwindow,
|
||||
int device_id,
|
||||
guint32 timestamp)
|
||||
{
|
||||
XWindowChanges changes;
|
||||
MetaDisplay *display;
|
||||
MetaScreen *screen;
|
||||
MetaWindow *grab_window;
|
||||
MetaDevice *pointer;
|
||||
MetaGrabInfo *grab_info;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
screen = meta_display_screen_for_xwindow (display, xwindow);
|
||||
grab_window = display->grab_window;
|
||||
pointer = meta_device_map_lookup (display->device_map, device_id);
|
||||
grab_info = meta_display_get_grab_info (display, pointer);
|
||||
grab_window = grab_info->grab_window;
|
||||
|
||||
if (grab_window == NULL)
|
||||
return;
|
||||
@@ -491,18 +512,27 @@ meta_core_get_active_workspace (Screen *xscreen)
|
||||
void
|
||||
meta_core_show_window_menu (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
int device_id,
|
||||
int root_x,
|
||||
int root_y,
|
||||
int button,
|
||||
guint32 timestamp)
|
||||
{
|
||||
MetaWindow *window = get_window (xdisplay, frame_xwindow);
|
||||
|
||||
MetaDevice *device;
|
||||
|
||||
/* There is already a menu popped up,
|
||||
* most likely from another device
|
||||
*/
|
||||
if (window->menu)
|
||||
return;
|
||||
|
||||
if (meta_prefs_get_raise_on_click ())
|
||||
meta_window_raise (window);
|
||||
meta_window_focus (window, timestamp);
|
||||
|
||||
meta_window_show_menu (window, root_x, root_y, button, timestamp);
|
||||
device = meta_device_map_lookup (window->display->device_map, device_id);
|
||||
meta_window_show_menu (window, device, root_x, root_y, button, timestamp);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -638,6 +668,7 @@ meta_core_get_workspace_name_with_index (Display *xdisplay,
|
||||
gboolean
|
||||
meta_core_begin_grab_op (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
int device_id,
|
||||
MetaGrabOp op,
|
||||
gboolean pointer_already_grabbed,
|
||||
gboolean frame_action,
|
||||
@@ -650,13 +681,16 @@ meta_core_begin_grab_op (Display *xdisplay,
|
||||
MetaWindow *window = get_window (xdisplay, frame_xwindow);
|
||||
MetaDisplay *display;
|
||||
MetaScreen *screen;
|
||||
|
||||
MetaDevice *device;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
screen = meta_display_screen_for_xwindow (display, frame_xwindow);
|
||||
|
||||
g_assert (screen != NULL);
|
||||
|
||||
return meta_display_begin_grab_op (display, screen, window,
|
||||
|
||||
device = meta_device_map_lookup (display->device_map, device_id);
|
||||
|
||||
return meta_display_begin_grab_op (display, screen, window, device,
|
||||
op, pointer_already_grabbed,
|
||||
frame_action,
|
||||
button, modmask,
|
||||
@@ -665,57 +699,58 @@ meta_core_begin_grab_op (Display *xdisplay,
|
||||
|
||||
void
|
||||
meta_core_end_grab_op (Display *xdisplay,
|
||||
int device_id,
|
||||
guint32 timestamp)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
MetaDevice *device;
|
||||
|
||||
meta_display_end_grab_op (display, timestamp);
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
device = meta_device_map_lookup (display->device_map, device_id);
|
||||
|
||||
meta_display_end_grab_op (display, device, timestamp);
|
||||
}
|
||||
|
||||
MetaGrabOp
|
||||
meta_core_get_grab_op (Display *xdisplay)
|
||||
meta_core_frame_has_grab (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
gint *device_id,
|
||||
gint *button_ret)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
MetaWindow *window;
|
||||
|
||||
return display->grab_op;
|
||||
window = get_window (xdisplay, frame_xwindow);
|
||||
|
||||
if (window != NULL &&
|
||||
window->cur_grab != NULL)
|
||||
{
|
||||
if (button_ret)
|
||||
*button_ret = window->cur_grab->grab_button;
|
||||
|
||||
if (device_id)
|
||||
*device_id = meta_device_get_id (window->cur_grab->grab_pointer);
|
||||
|
||||
return window->cur_grab->grab_op;
|
||||
}
|
||||
|
||||
return META_GRAB_OP_NONE;
|
||||
}
|
||||
|
||||
Window
|
||||
meta_core_get_grab_frame (Display *xdisplay)
|
||||
meta_core_get_frame (Display *xdisplay,
|
||||
Window client_xwindow)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
MetaWindow *window;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
window = meta_display_lookup_x_window (display, client_xwindow);
|
||||
|
||||
g_assert (display != NULL);
|
||||
g_assert (display->grab_op == META_GRAB_OP_NONE ||
|
||||
display->grab_screen != NULL);
|
||||
g_assert (display->grab_op == META_GRAB_OP_NONE ||
|
||||
display->grab_screen->display->xdisplay == xdisplay);
|
||||
|
||||
if (display->grab_op != META_GRAB_OP_NONE &&
|
||||
display->grab_window &&
|
||||
display->grab_window->frame)
|
||||
return display->grab_window->frame->xwindow;
|
||||
else
|
||||
return None;
|
||||
}
|
||||
if (window &&
|
||||
window->frame)
|
||||
return window->frame->xwindow;
|
||||
|
||||
int
|
||||
meta_core_get_grab_button (Display *xdisplay)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
|
||||
if (display->grab_op == META_GRAB_OP_NONE)
|
||||
return -1;
|
||||
|
||||
return display->grab_button;
|
||||
return None;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -731,13 +766,24 @@ meta_core_grab_buttons (Display *xdisplay,
|
||||
}
|
||||
|
||||
void
|
||||
meta_core_set_screen_cursor (Display *xdisplay,
|
||||
Window frame_on_screen,
|
||||
MetaCursor cursor)
|
||||
meta_core_set_screen_cursor (Display *xdisplay,
|
||||
Window frame_on_screen,
|
||||
gint device_id,
|
||||
MetaCursor cursor)
|
||||
{
|
||||
MetaWindow *window = get_window (xdisplay, frame_on_screen);
|
||||
MetaDevice *pointer;
|
||||
|
||||
meta_frame_set_screen_cursor (window->frame, cursor);
|
||||
pointer = meta_device_map_lookup (window->display->device_map,
|
||||
device_id);
|
||||
|
||||
if (pointer == NULL)
|
||||
return;
|
||||
|
||||
if (!META_IS_DEVICE_POINTER (pointer))
|
||||
pointer = meta_device_get_paired_device (pointer);
|
||||
|
||||
meta_frame_set_screen_cursor (window->frame, pointer, cursor);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -775,3 +821,69 @@ meta_invalidate_default_icons (void)
|
||||
g_slist_free (windows);
|
||||
}
|
||||
|
||||
/* Selects events on an xwindow, using XInput2 if available/in use,
|
||||
* this function doesn't require the xwindow to have a backing
|
||||
* MetaWindow.
|
||||
*/
|
||||
void
|
||||
meta_core_select_events (Display *xdisplay,
|
||||
Window xwindow,
|
||||
gint evmask,
|
||||
gboolean preserve_old_mask)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (display->have_xinput2)
|
||||
{
|
||||
XIEventMask mask;
|
||||
|
||||
mask.deviceid = XIAllMasterDevices;
|
||||
mask.mask = meta_device_xi2_translate_event_mask (evmask,
|
||||
&mask.mask_len);
|
||||
|
||||
if (preserve_old_mask)
|
||||
{
|
||||
XIEventMask *prev;
|
||||
gint n_masks, i, j;
|
||||
|
||||
prev = XIGetSelectedEvents (xdisplay, xwindow, &n_masks);
|
||||
|
||||
for (i = 0; i < n_masks; i++)
|
||||
{
|
||||
if (prev[i].deviceid != XIAllMasterDevices)
|
||||
continue;
|
||||
|
||||
for (j = 0; j < MIN (mask.mask_len, prev[i].mask_len); j++)
|
||||
mask.mask[j] |= prev[i].mask[j];
|
||||
}
|
||||
|
||||
XFree (prev);
|
||||
}
|
||||
|
||||
XISelectEvents (xdisplay, xwindow, &mask, 1);
|
||||
|
||||
/* Unset any input event so they are only handled via XInput2 */
|
||||
evmask &= ~(KeyPressMask | KeyReleaseMask |
|
||||
ButtonPressMask | ButtonReleaseMask |
|
||||
EnterWindowMask | LeaveWindowMask |
|
||||
PointerMotionMask | PointerMotionHintMask |
|
||||
Button1MotionMask | Button2MotionMask |
|
||||
Button3MotionMask | Button4MotionMask |
|
||||
Button5MotionMask | ButtonMotionMask |
|
||||
FocusChangeMask);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (preserve_old_mask)
|
||||
{
|
||||
XWindowAttributes attr;
|
||||
|
||||
if (XGetWindowAttributes (xdisplay, xwindow, &attr))
|
||||
evmask |= attr.your_event_mask;
|
||||
}
|
||||
|
||||
XSelectInput (xdisplay, xwindow, evmask);
|
||||
}
|
||||
|
@@ -110,6 +110,7 @@ void meta_core_user_raise (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
void meta_core_user_lower_and_unfocus (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
int device_id,
|
||||
guint32 timestamp);
|
||||
|
||||
void meta_core_user_focus (Display *xdisplay,
|
||||
@@ -118,6 +119,7 @@ void meta_core_user_focus (Display *xdisplay,
|
||||
|
||||
void meta_core_lower_beneath_grab_window (Display *xdisplay,
|
||||
Window xwindow,
|
||||
int device_id,
|
||||
guint32 timestamp);
|
||||
|
||||
void meta_core_minimize (Display *xdisplay,
|
||||
@@ -163,6 +165,7 @@ const char* meta_core_get_workspace_name_with_index (Display *xdisplay,
|
||||
|
||||
void meta_core_show_window_menu (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
int device_id,
|
||||
int root_x,
|
||||
int root_y,
|
||||
int button,
|
||||
@@ -175,6 +178,7 @@ void meta_core_get_menu_accelerator (MetaMenuOp menu_op,
|
||||
|
||||
gboolean meta_core_begin_grab_op (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
int device_id,
|
||||
MetaGrabOp op,
|
||||
gboolean pointer_already_grabbed,
|
||||
gboolean frame_action,
|
||||
@@ -184,18 +188,29 @@ gboolean meta_core_begin_grab_op (Display *xdisplay,
|
||||
int root_x,
|
||||
int root_y);
|
||||
void meta_core_end_grab_op (Display *xdisplay,
|
||||
int device_id,
|
||||
guint32 timestamp);
|
||||
MetaGrabOp meta_core_get_grab_op (Display *xdisplay);
|
||||
Window meta_core_get_grab_frame (Display *xdisplay);
|
||||
int meta_core_get_grab_button (Display *xdisplay);
|
||||
|
||||
MetaGrabOp meta_core_frame_has_grab (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
gint *device_id,
|
||||
gint *button_ret);
|
||||
Window meta_core_get_frame (Display *xdisplay,
|
||||
Window client_xwindow);
|
||||
|
||||
void meta_core_grab_buttons (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
|
||||
void meta_core_set_screen_cursor (Display *xdisplay,
|
||||
Window frame_on_screen,
|
||||
MetaCursor cursor);
|
||||
void meta_core_set_screen_cursor (Display *xdisplay,
|
||||
Window frame_on_screen,
|
||||
int device_id,
|
||||
MetaCursor cursor);
|
||||
|
||||
void meta_core_select_events (Display *xdisplay,
|
||||
Window xwindow,
|
||||
gint evmask,
|
||||
gboolean preserve_old_mask);
|
||||
|
||||
|
||||
/* Used because we ignore EnterNotify when a window is unmapped that
|
||||
* really shouldn't cause focus changes, by comparing the event serial
|
||||
|
@@ -108,13 +108,12 @@ delete_ping_timeout_func (MetaDisplay *display,
|
||||
|
||||
/* Translators: %s is a window title */
|
||||
if (window_title)
|
||||
tmp = g_markup_printf_escaped (_("<tt>%s</tt> is not responding."),
|
||||
window_title);
|
||||
tmp = g_strdup_printf (_("“%s” is not responding."), window_title);
|
||||
else
|
||||
tmp = g_strdup (_("Application is not responding."));
|
||||
|
||||
window_content = g_strdup_printf (
|
||||
"<big><b>%s</b></big>\n\n<i>%s</i>",
|
||||
"<big><b>%s</b></big>\n\n%s",
|
||||
tmp,
|
||||
_("You may choose to wait a short while for it to "
|
||||
"continue or force the application to quit entirely."));
|
||||
@@ -123,7 +122,8 @@ delete_ping_timeout_func (MetaDisplay *display,
|
||||
meta_show_dialog ("--question",
|
||||
window_content, NULL,
|
||||
window->screen->screen_name,
|
||||
_("_Wait"), _("_Force Quit"), window->xwindow,
|
||||
_("_Wait"), _("_Force Quit"),
|
||||
"face-sad-symbolic", window->xwindow,
|
||||
NULL, NULL);
|
||||
|
||||
g_free (window_content);
|
||||
|
69
src/core/device-keyboard.c
Normal file
69
src/core/device-keyboard.c
Normal file
@@ -0,0 +1,69 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Keyboard device abstraction */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include "device-keyboard.h"
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (MetaDeviceKeyboard,
|
||||
meta_device_keyboard,
|
||||
META_TYPE_DEVICE)
|
||||
|
||||
static void
|
||||
meta_device_keyboard_class_init (MetaDeviceKeyboardClass *klass)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_init (MetaDeviceKeyboard *keyboard)
|
||||
{
|
||||
}
|
||||
|
||||
Window
|
||||
meta_device_keyboard_get_focus_window (MetaDeviceKeyboard *keyboard)
|
||||
{
|
||||
MetaDeviceKeyboardClass *klass;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE_KEYBOARD (keyboard), None);
|
||||
|
||||
klass = META_DEVICE_KEYBOARD_GET_CLASS (keyboard);
|
||||
|
||||
if (!klass->get_focus_window)
|
||||
return None;
|
||||
|
||||
return (klass->get_focus_window) (keyboard);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_keyboard_set_focus_window (MetaDeviceKeyboard *keyboard,
|
||||
Window xwindow,
|
||||
Time timestamp)
|
||||
{
|
||||
MetaDeviceKeyboardClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE_KEYBOARD (keyboard));
|
||||
|
||||
klass = META_DEVICE_KEYBOARD_GET_CLASS (keyboard);
|
||||
|
||||
if (klass->set_focus_window)
|
||||
(klass->set_focus_window) (keyboard, xwindow, timestamp);
|
||||
}
|
69
src/core/device-keyboard.h
Normal file
69
src/core/device-keyboard.h
Normal file
@@ -0,0 +1,69 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file device-keyboard.h Keyboard device abstraction
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the internal abstraction of keyboard devices so
|
||||
* XInput2/core events can be handled similarly.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef META_DEVICE_KEYBOARD_H
|
||||
#define META_DEVICE_KEYBOARD_H
|
||||
|
||||
#include "display-private.h"
|
||||
#include "device-private.h"
|
||||
|
||||
#define META_TYPE_DEVICE_KEYBOARD (meta_device_keyboard_get_type ())
|
||||
#define META_DEVICE_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_KEYBOARD, MetaDeviceKeyboard))
|
||||
#define META_DEVICE_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_KEYBOARD, MetaDeviceKeyboardClass))
|
||||
#define META_IS_DEVICE_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_KEYBOARD))
|
||||
#define META_IS_DEVICE_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_KEYBOARD))
|
||||
#define META_DEVICE_KEYBOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_KEYBOARD, MetaDeviceKeyboardClass))
|
||||
|
||||
typedef struct _MetaDeviceKeyboard MetaDeviceKeyboard;
|
||||
typedef struct _MetaDeviceKeyboardClass MetaDeviceKeyboardClass;
|
||||
|
||||
struct _MetaDeviceKeyboard
|
||||
{
|
||||
MetaDevice parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDeviceKeyboardClass
|
||||
{
|
||||
MetaDeviceClass parent_instance;
|
||||
|
||||
Window (* get_focus_window) (MetaDeviceKeyboard *keyboard);
|
||||
void (* set_focus_window) (MetaDeviceKeyboard *keyboard,
|
||||
Window xwindow,
|
||||
Time timestamp);
|
||||
};
|
||||
|
||||
GType meta_device_keyboard_get_type (void) G_GNUC_CONST;
|
||||
|
||||
Window meta_device_keyboard_get_focus_window (MetaDeviceKeyboard *keyboard);
|
||||
void meta_device_keyboard_set_focus_window (MetaDeviceKeyboard *keyboard,
|
||||
Window xwindow,
|
||||
Time timestamp);
|
||||
|
||||
|
||||
#endif /* META_DEVICE_KEYBOARD_H */
|
134
src/core/device-map-core.c
Normal file
134
src/core/device-map-core.c
Normal file
@@ -0,0 +1,134 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Input device map, core protocol implementation */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "device-map-core.h"
|
||||
#include "devices-core.h"
|
||||
|
||||
G_DEFINE_TYPE (MetaDeviceMapCore, meta_device_map_core, META_TYPE_DEVICE_MAP)
|
||||
|
||||
static gboolean
|
||||
meta_device_map_core_grab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers,
|
||||
gboolean sync)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
gint retval;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
retval = XGrabKey (display->xdisplay, keycode, modifiers,
|
||||
xwindow, True,
|
||||
GrabModeAsync, /* Never care about the other device */
|
||||
(sync) ? GrabModeSync : GrabModeAsync);
|
||||
|
||||
return (retval == Success);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_core_ungrab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
XUngrabKey (display->xdisplay, keycode, modifiers, xwindow);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_device_map_core_grab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers,
|
||||
guint evmask,
|
||||
gboolean sync)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
gint retval;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
retval = XGrabButton (display->xdisplay, n_button,
|
||||
modifiers, xwindow, False,
|
||||
evmask,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
GrabModeAsync, /* Never care about the other device */
|
||||
None, None);
|
||||
|
||||
return (retval == Success);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_core_ungrab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
XUngrabButton (display->xdisplay, n_button, modifiers, xwindow);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_core_constructed (GObject *object)
|
||||
{
|
||||
MetaDeviceMap *device_map = META_DEVICE_MAP (object);
|
||||
MetaDevice *pointer, *keyboard;
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
|
||||
/* Insert core devices */
|
||||
pointer = meta_device_pointer_core_new (display);
|
||||
meta_device_map_add_device (device_map, pointer);
|
||||
|
||||
keyboard = meta_device_keyboard_core_new (display);
|
||||
meta_device_map_add_device (device_map, keyboard);
|
||||
|
||||
meta_device_pair_devices (pointer, keyboard);
|
||||
|
||||
g_object_unref (pointer);
|
||||
g_object_unref (keyboard);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_core_class_init (MetaDeviceMapCoreClass *klass)
|
||||
{
|
||||
MetaDeviceMapClass *device_map_class = META_DEVICE_MAP_CLASS (klass);
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->constructed = meta_device_map_core_constructed;
|
||||
|
||||
device_map_class->grab_key = meta_device_map_core_grab_key;
|
||||
device_map_class->ungrab_key = meta_device_map_core_ungrab_key;
|
||||
device_map_class->grab_button = meta_device_map_core_grab_button;
|
||||
device_map_class->ungrab_button = meta_device_map_core_ungrab_button;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_core_init (MetaDeviceMapCore *device_map)
|
||||
{
|
||||
}
|
56
src/core/device-map-core.h
Normal file
56
src/core/device-map-core.h
Normal file
@@ -0,0 +1,56 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file device-map-core.h device map for core devices
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the core protocol implementation of the device map
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef META_DEVICE_MAP_CORE_H
|
||||
#define META_DEVICE_MAP_CORE_H
|
||||
|
||||
typedef struct _MetaDeviceMapCore MetaDeviceMapCore;
|
||||
typedef struct _MetaDeviceMapCoreClass MetaDeviceMapCoreClass;
|
||||
|
||||
#include "device-map-private.h"
|
||||
|
||||
#define META_TYPE_DEVICE_MAP_CORE (meta_device_map_core_get_type ())
|
||||
#define META_DEVICE_MAP_CORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_MAP_CORE, MetaDeviceMapCore))
|
||||
#define META_DEVICE_MAP_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_MAP_CORE, MetaDeviceMapCoreClass))
|
||||
#define META_IS_DEVICE_MAP_CORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_MAP_CORE))
|
||||
#define META_IS_DEVICE_MAP_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_MAP_CORE))
|
||||
#define META_DEVICE_MAP_CORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_MAP_CORE, MetaDeviceMapCoreClass))
|
||||
|
||||
struct _MetaDeviceMapCore
|
||||
{
|
||||
MetaDeviceMap parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDeviceMapCoreClass
|
||||
{
|
||||
MetaDeviceMapClass parent_class;
|
||||
};
|
||||
|
||||
GType meta_device_map_core_get_type (void) G_GNUC_CONST;
|
||||
|
||||
#endif /* META_DEVICE_MAP_CORE_H */
|
111
src/core/device-map-private.h
Normal file
111
src/core/device-map-private.h
Normal file
@@ -0,0 +1,111 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file device-map.h object containing input devices
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the device map, used to find out the device behind
|
||||
* XInput2/core events.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef META_DEVICE_MAP_PRIVATE_H
|
||||
#define META_DEVICE_MAP_PRIVATE_H
|
||||
|
||||
#include <meta/device-map.h>
|
||||
#include <meta/device.h>
|
||||
#include "display-private.h"
|
||||
#include "device-private.h"
|
||||
|
||||
/* Device IDs for Virtual Core Pointer/Keyboard,
|
||||
* use only in case of emergency.
|
||||
*/
|
||||
#define META_CORE_POINTER_ID 2
|
||||
#define META_CORE_KEYBOARD_ID 3
|
||||
|
||||
struct _MetaDeviceMap
|
||||
{
|
||||
GObject parent_instance;
|
||||
gpointer priv;
|
||||
};
|
||||
|
||||
struct _MetaDeviceMapClass
|
||||
{
|
||||
GObjectClass parent_instance;
|
||||
|
||||
void (* device_added) (MetaDeviceMap *device_map,
|
||||
MetaDevice *device);
|
||||
void (* device_removed) (MetaDeviceMap *device_map,
|
||||
MetaDevice *device);
|
||||
|
||||
gboolean (* grab_key) (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers,
|
||||
gboolean sync);
|
||||
void (* ungrab_key) (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers);
|
||||
|
||||
gboolean (* grab_button) (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers,
|
||||
guint evmask,
|
||||
gboolean sync);
|
||||
void (* ungrab_button) (MetaDeviceMap *pointer,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers);
|
||||
};
|
||||
|
||||
GType meta_device_map_get_type (void) G_GNUC_CONST;
|
||||
|
||||
MetaDeviceMap * meta_device_map_new (MetaDisplay *display,
|
||||
gboolean force_core);
|
||||
|
||||
void meta_device_map_add_device (MetaDeviceMap *device_map,
|
||||
MetaDevice *device);
|
||||
void meta_device_map_remove_device (MetaDeviceMap *device_map,
|
||||
MetaDevice *device);
|
||||
|
||||
gboolean meta_device_map_grab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers,
|
||||
gboolean sync);
|
||||
void meta_device_map_ungrab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers);
|
||||
gboolean meta_device_map_grab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers,
|
||||
guint evmask,
|
||||
gboolean sync);
|
||||
void meta_device_map_ungrab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers);
|
||||
|
||||
#endif /* META_DEVICE_MAP_PRIVATE_H */
|
269
src/core/device-map-xi2.c
Normal file
269
src/core/device-map-xi2.c
Normal file
@@ -0,0 +1,269 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Input device map, XInput2 implementation */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "device-map-xi2.h"
|
||||
#include <X11/extensions/XInput2.h>
|
||||
#include "devices-xi2.h"
|
||||
|
||||
#define XINPUT2_VERSION_MAJOR 2
|
||||
#define XINPUT2_VERSION_MINOR 2
|
||||
|
||||
G_DEFINE_TYPE (MetaDeviceMapXI2, meta_device_map_xi2, META_TYPE_DEVICE_MAP)
|
||||
|
||||
static gboolean
|
||||
meta_device_map_xi2_grab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers,
|
||||
gboolean sync)
|
||||
{
|
||||
XIGrabModifiers mods = { modifiers, 0 };
|
||||
MetaDisplay *display;
|
||||
XIEventMask mask;
|
||||
gint retval;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
|
||||
mask.deviceid = XIAllMasterDevices;
|
||||
mask.mask = meta_device_xi2_translate_event_mask (KeyPressMask |
|
||||
KeyReleaseMask,
|
||||
&mask.mask_len);
|
||||
/* FIXME: Doesn't seem to work with
|
||||
* XIAllMasterDevices, use the VCK
|
||||
* at the moment
|
||||
*/
|
||||
retval = XIGrabKeycode (display->xdisplay,
|
||||
META_CORE_KEYBOARD_ID,
|
||||
keycode, xwindow,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
GrabModeAsync, /* Never care about the other device */
|
||||
True, &mask, 1, &mods);
|
||||
|
||||
return (retval == Success);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_xi2_ungrab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers)
|
||||
{
|
||||
XIGrabModifiers mods = { modifiers, 0 };
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
XIUngrabKeycode (display->xdisplay,
|
||||
META_CORE_KEYBOARD_ID,
|
||||
keycode, xwindow,
|
||||
1, &mods);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_device_map_xi2_grab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers,
|
||||
guint evmask,
|
||||
gboolean sync)
|
||||
{
|
||||
XIGrabModifiers mods = { modifiers, 0 };
|
||||
XIEventMask mask;
|
||||
MetaDisplay *display;
|
||||
int retval;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
|
||||
mask.deviceid = XIAllMasterDevices;
|
||||
mask.mask = meta_device_xi2_translate_event_mask (evmask, &mask.mask_len);
|
||||
|
||||
retval = XIGrabButton (display->xdisplay,
|
||||
XIAllMasterDevices,
|
||||
n_button, xwindow, None,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
GrabModeAsync, /* Never care about the other device */
|
||||
False, &mask, 1, &mods);
|
||||
|
||||
return (retval == Success);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_xi2_ungrab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers)
|
||||
{
|
||||
XIGrabModifiers mods = { modifiers, 0 };
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
XIUngrabButton (display->xdisplay,
|
||||
META_CORE_POINTER_ID,
|
||||
//XIAllMasterDevices,
|
||||
n_button, xwindow, 1, &mods);
|
||||
}
|
||||
|
||||
static void
|
||||
add_device_from_info (MetaDeviceMap *device_map,
|
||||
gint use,
|
||||
gint device_id)
|
||||
{
|
||||
MetaDevice *device;
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
|
||||
if (use == XIMasterPointer)
|
||||
device = meta_device_pointer_xi2_new (display, device_id);
|
||||
else if (use == XIMasterKeyboard)
|
||||
device = meta_device_keyboard_xi2_new (display, device_id);
|
||||
|
||||
if (device)
|
||||
{
|
||||
meta_device_map_add_device (device_map, device);
|
||||
g_object_unref (device);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
pair_devices (gpointer key,
|
||||
gpointer value,
|
||||
gpointer user_data)
|
||||
{
|
||||
MetaDevice *device1, *device2;
|
||||
MetaDeviceMap *device_map;
|
||||
|
||||
device_map = user_data;
|
||||
device1 = meta_device_map_lookup (device_map, GPOINTER_TO_INT (key));
|
||||
device2 = meta_device_map_lookup (device_map, GPOINTER_TO_INT (value));
|
||||
|
||||
meta_device_pair_devices (device1, device2);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_xi2_constructed (GObject *object)
|
||||
{
|
||||
MetaDeviceMap *device_map = META_DEVICE_MAP (object);
|
||||
MetaDisplay *display;
|
||||
XIDeviceInfo *info;
|
||||
GHashTable *pairs;
|
||||
int n_devices, i;
|
||||
|
||||
display = meta_device_map_get_display (device_map);
|
||||
|
||||
/* We're only interested in master devices,
|
||||
* detached slave devices are left for applications
|
||||
* to handle.
|
||||
*/
|
||||
info = XIQueryDevice (display->xdisplay, XIAllMasterDevices, &n_devices);
|
||||
pairs = g_hash_table_new (NULL, NULL);
|
||||
|
||||
for (i = 0; i < n_devices; i++)
|
||||
{
|
||||
add_device_from_info (device_map, info[i].use, info[i].deviceid);
|
||||
g_hash_table_insert (pairs,
|
||||
GINT_TO_POINTER (info[i].deviceid),
|
||||
GINT_TO_POINTER (info[i].attachment));
|
||||
}
|
||||
|
||||
g_hash_table_foreach (pairs, pair_devices, device_map);
|
||||
g_hash_table_destroy (pairs);
|
||||
|
||||
XIFreeDeviceInfo (info);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_xi2_class_init (MetaDeviceMapXI2Class *klass)
|
||||
{
|
||||
MetaDeviceMapClass *device_map_class = META_DEVICE_MAP_CLASS (klass);
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->constructed = meta_device_map_xi2_constructed;
|
||||
|
||||
device_map_class->grab_key = meta_device_map_xi2_grab_key;
|
||||
device_map_class->ungrab_key = meta_device_map_xi2_ungrab_key;
|
||||
device_map_class->grab_button = meta_device_map_xi2_grab_button;
|
||||
device_map_class->ungrab_button = meta_device_map_xi2_ungrab_button;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_xi2_init (MetaDeviceMapXI2 *device_map)
|
||||
{
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_device_map_xi2_handle_hierarchy_event (MetaDeviceMapXI2 *device_map,
|
||||
XEvent *ev)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_map_get_display (META_DEVICE_MAP (device_map));
|
||||
|
||||
if (ev->type == GenericEvent &&
|
||||
ev->xcookie.extension == display->xinput2_opcode)
|
||||
{
|
||||
XIHierarchyEvent *xev;
|
||||
GHashTable *pairs;
|
||||
gint i;
|
||||
|
||||
g_assert (display->have_xinput2 == TRUE);
|
||||
|
||||
xev = (XIHierarchyEvent *) ev->xcookie.data;
|
||||
|
||||
if (xev->evtype != XI_HierarchyChanged)
|
||||
return FALSE;
|
||||
|
||||
pairs = g_hash_table_new (NULL, NULL);
|
||||
|
||||
for (i = 0; i < xev->num_info; i++)
|
||||
{
|
||||
if (xev->info[i].flags & XIMasterAdded)
|
||||
{
|
||||
add_device_from_info (META_DEVICE_MAP (device_map),
|
||||
xev->info[i].use,
|
||||
xev->info[i].deviceid);
|
||||
g_hash_table_insert (pairs,
|
||||
GINT_TO_POINTER (xev->info[i].deviceid),
|
||||
GINT_TO_POINTER (xev->info[i].attachment));
|
||||
}
|
||||
else if (xev->info[i].flags & XIMasterRemoved)
|
||||
{
|
||||
MetaDevice *device;
|
||||
|
||||
device = meta_device_map_lookup (META_DEVICE_MAP (device_map),
|
||||
xev->info[i].deviceid);
|
||||
|
||||
if (device)
|
||||
meta_device_map_remove_device (META_DEVICE_MAP (device_map),
|
||||
device);
|
||||
}
|
||||
}
|
||||
|
||||
g_hash_table_foreach (pairs, pair_devices, device_map);
|
||||
g_hash_table_destroy (pairs);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
59
src/core/device-map-xi2.h
Normal file
59
src/core/device-map-xi2.h
Normal file
@@ -0,0 +1,59 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file device-map-xi2.h device map for XInput2 devices
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the XInput2 implementation of the device map
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef META_DEVICE_MAP_XI2_H
|
||||
#define META_DEVICE_MAP_XI2_H
|
||||
|
||||
typedef struct _MetaDeviceMapXI2 MetaDeviceMapXI2;
|
||||
typedef struct _MetaDeviceMapXI2Class MetaDeviceMapXI2Class;
|
||||
|
||||
#include "device-map-private.h"
|
||||
|
||||
#define META_TYPE_DEVICE_MAP_XI2 (meta_device_map_xi2_get_type ())
|
||||
#define META_DEVICE_MAP_XI2(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_MAP_XI2, MetaDeviceMapXI2))
|
||||
#define META_DEVICE_MAP_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_MAP_XI2, MetaDeviceMapXI2Class))
|
||||
#define META_IS_DEVICE_MAP_XI2(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_MAP_XI2))
|
||||
#define META_IS_DEVICE_MAP_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_MAP_XI2))
|
||||
#define META_DEVICE_MAP_XI2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_MAP_XI2, MetaDeviceMapXI2Class))
|
||||
|
||||
struct _MetaDeviceMapXI2
|
||||
{
|
||||
MetaDeviceMap parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDeviceMapXI2Class
|
||||
{
|
||||
MetaDeviceMapClass parent_class;
|
||||
};
|
||||
|
||||
GType meta_device_map_xi2_get_type (void) G_GNUC_CONST;
|
||||
|
||||
gboolean meta_device_map_xi2_handle_hierarchy_event (MetaDeviceMapXI2 *device_map,
|
||||
XEvent *ev);
|
||||
|
||||
#endif /* META_DEVICE_MAP_XI2_H */
|
390
src/core/device-map.c
Normal file
390
src/core/device-map.c
Normal file
@@ -0,0 +1,390 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Input device map */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "device-map-private.h"
|
||||
#include "device-map-core.h"
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
#include <X11/extensions/XInput2.h>
|
||||
#include "device-map-xi2.h"
|
||||
|
||||
#define XINPUT2_VERSION_MAJOR 2
|
||||
#define XINPUT2_VERSION_MINOR 2
|
||||
#endif
|
||||
|
||||
G_DEFINE_TYPE (MetaDeviceMap, meta_device_map, G_TYPE_OBJECT)
|
||||
|
||||
typedef struct MetaDeviceMapPrivate MetaDeviceMapPrivate;
|
||||
|
||||
struct MetaDeviceMapPrivate
|
||||
{
|
||||
MetaDisplay *display;
|
||||
GHashTable *devices;
|
||||
};
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_DISPLAY
|
||||
};
|
||||
|
||||
enum {
|
||||
DEVICE_ADDED,
|
||||
DEVICE_REMOVED,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
static guint signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
static void
|
||||
meta_device_map_get_property (GObject *object,
|
||||
guint param_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
priv = META_DEVICE_MAP (object)->priv;
|
||||
|
||||
switch (param_id)
|
||||
{
|
||||
case PROP_DISPLAY:
|
||||
g_value_set_object (value, priv->display);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_set_property (GObject *object,
|
||||
guint param_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
priv = META_DEVICE_MAP (object)->priv;
|
||||
|
||||
switch (param_id)
|
||||
{
|
||||
case PROP_DISPLAY:
|
||||
priv->display = g_value_get_object (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_finalize (GObject *object)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
GHashTableIter iter;
|
||||
MetaDevice *device;
|
||||
|
||||
priv = META_DEVICE_MAP (object)->priv;
|
||||
g_hash_table_iter_init (&iter, priv->devices);
|
||||
|
||||
while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &device))
|
||||
{
|
||||
/* Detach the device */
|
||||
g_hash_table_iter_steal (&iter);
|
||||
|
||||
g_signal_emit (object, signals[DEVICE_REMOVED], 0, device);
|
||||
g_object_unref (device);
|
||||
}
|
||||
|
||||
g_hash_table_destroy (priv->devices);
|
||||
G_OBJECT_CLASS (meta_device_map_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_class_init (MetaDeviceMapClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->get_property = meta_device_map_get_property;
|
||||
object_class->set_property = meta_device_map_set_property;
|
||||
object_class->finalize = meta_device_map_finalize;
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_DISPLAY,
|
||||
g_param_spec_object ("display",
|
||||
"Display",
|
||||
"Display",
|
||||
META_TYPE_DISPLAY,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY));
|
||||
signals[DEVICE_ADDED] =
|
||||
g_signal_new ("device-added",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
NULL, NULL,
|
||||
g_cclosure_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE, 1, META_TYPE_DEVICE);
|
||||
signals[DEVICE_REMOVED] =
|
||||
g_signal_new ("device-removed",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
NULL, NULL,
|
||||
g_cclosure_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE, 1, META_TYPE_DEVICE);
|
||||
|
||||
g_type_class_add_private (klass, sizeof (MetaDeviceMapPrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_map_init (MetaDeviceMap *device_map)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
priv = device_map->priv = G_TYPE_INSTANCE_GET_PRIVATE (device_map,
|
||||
META_TYPE_DEVICE_MAP,
|
||||
MetaDeviceMapPrivate);
|
||||
priv->devices = g_hash_table_new_full (NULL, NULL, NULL,
|
||||
(GDestroyNotify) g_object_unref);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_map_add_device (MetaDeviceMap *device_map,
|
||||
MetaDevice *device)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
priv = device_map->priv;
|
||||
g_hash_table_insert (priv->devices,
|
||||
GINT_TO_POINTER (meta_device_get_id (device)),
|
||||
g_object_ref (device));
|
||||
|
||||
g_signal_emit (device_map, signals[DEVICE_ADDED], 0, device);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_map_remove_device (MetaDeviceMap *device_map,
|
||||
MetaDevice *device)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
priv = device_map->priv;
|
||||
|
||||
if (g_hash_table_steal (priv->devices,
|
||||
GINT_TO_POINTER (meta_device_get_id (device))))
|
||||
{
|
||||
g_signal_emit (device_map, signals[DEVICE_REMOVED], 0, device);
|
||||
g_object_unref (device);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
|
||||
static gboolean
|
||||
initialize_xinput (MetaDisplay *display)
|
||||
{
|
||||
int major, minor, opcode;
|
||||
int unused;
|
||||
|
||||
if (!XQueryExtension (display->xdisplay,
|
||||
"XInputExtension",
|
||||
&opcode, &unused, &unused))
|
||||
return FALSE;
|
||||
|
||||
major = XINPUT2_VERSION_MAJOR;
|
||||
minor = XINPUT2_VERSION_MINOR;
|
||||
|
||||
XIQueryVersion (display->xdisplay, &major, &minor);
|
||||
|
||||
if (major == XINPUT2_VERSION_MAJOR &&
|
||||
minor == XINPUT2_VERSION_MINOR)
|
||||
{
|
||||
display->have_xinput2 = TRUE;
|
||||
display->xinput2_opcode = opcode;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#endif /* HAVE_XINPUT2 */
|
||||
|
||||
MetaDeviceMap *
|
||||
meta_device_map_new (MetaDisplay *display,
|
||||
gboolean force_core)
|
||||
{
|
||||
GType type = META_TYPE_DEVICE_MAP_CORE;
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
if (!force_core &&
|
||||
initialize_xinput (display))
|
||||
type = META_TYPE_DEVICE_MAP_XI2;
|
||||
#endif
|
||||
|
||||
return g_object_new (type,
|
||||
"display", display,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_device_map_lookup:
|
||||
* @device_map: a #MetaDeviceMap
|
||||
* @device_id: ID for a device
|
||||
*
|
||||
* returns the device corresponding to @device_id
|
||||
*
|
||||
* Returns: (transfer none): (allow-none): The matching device, or %NULL.
|
||||
**/
|
||||
MetaDevice *
|
||||
meta_device_map_lookup (MetaDeviceMap *device_map,
|
||||
gint device_id)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), NULL);
|
||||
|
||||
priv = device_map->priv;
|
||||
return g_hash_table_lookup (priv->devices,
|
||||
GINT_TO_POINTER (device_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_device_map_get_display:
|
||||
* @device_map: a #MetaDeviceMap
|
||||
*
|
||||
* Returns the #MetaDisplay to which @device_map belongs to.
|
||||
*
|
||||
* Returns: (transfer none): The #MetaDisplay.
|
||||
**/
|
||||
MetaDisplay *
|
||||
meta_device_map_get_display (MetaDeviceMap *device_map)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), NULL);
|
||||
|
||||
priv = device_map->priv;
|
||||
return priv->display;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_device_map_list_devices:
|
||||
* @device_map: a #MetaDeviceMap
|
||||
*
|
||||
* Returns the list of devices that @device_map holds.
|
||||
*
|
||||
* Returns: (element-type Meta.Device) (transfer container): the list
|
||||
* of devices, the contained objects are owned by @device_map
|
||||
* and should not be unref'ed. The list must be freed with
|
||||
* g_list_free().
|
||||
**/
|
||||
GList *
|
||||
meta_device_map_list_devices (MetaDeviceMap *device_map)
|
||||
{
|
||||
MetaDeviceMapPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), NULL);
|
||||
|
||||
priv = device_map->priv;
|
||||
return g_hash_table_get_values (priv->devices);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_device_map_grab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers,
|
||||
gboolean sync)
|
||||
{
|
||||
MetaDeviceMapClass *klass;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), FALSE);
|
||||
g_return_val_if_fail (xwindow != None, FALSE);
|
||||
|
||||
klass = META_DEVICE_MAP_GET_CLASS (device_map);
|
||||
|
||||
if (!klass->grab_key)
|
||||
return FALSE;
|
||||
|
||||
return (klass->grab_key) (device_map, xwindow, keycode, modifiers, sync);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_map_ungrab_key (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint keycode,
|
||||
guint modifiers)
|
||||
{
|
||||
MetaDeviceMapClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE_MAP (device_map));
|
||||
g_return_if_fail (xwindow != None);
|
||||
|
||||
klass = META_DEVICE_MAP_GET_CLASS (device_map);
|
||||
|
||||
if (klass->ungrab_key)
|
||||
(klass->ungrab_key) (device_map, xwindow, keycode, modifiers);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_device_map_grab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers,
|
||||
guint evmask,
|
||||
gboolean sync)
|
||||
{
|
||||
MetaDeviceMapClass *klass;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), FALSE);
|
||||
g_return_val_if_fail (xwindow != None, FALSE);
|
||||
|
||||
klass = META_DEVICE_MAP_GET_CLASS (device_map);
|
||||
|
||||
if (!klass->grab_button)
|
||||
return FALSE;
|
||||
|
||||
return (klass->grab_button) (device_map, xwindow, n_button,
|
||||
modifiers, evmask, sync);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_map_ungrab_button (MetaDeviceMap *device_map,
|
||||
Window xwindow,
|
||||
guint n_button,
|
||||
guint modifiers)
|
||||
{
|
||||
MetaDeviceMapClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE_MAP (device_map));
|
||||
g_return_if_fail (xwindow != None);
|
||||
|
||||
klass = META_DEVICE_MAP_GET_CLASS (device_map);
|
||||
|
||||
if (klass->ungrab_button)
|
||||
(klass->ungrab_button) (device_map, xwindow, n_button, modifiers);
|
||||
}
|
124
src/core/device-pointer.c
Normal file
124
src/core/device-pointer.c
Normal file
@@ -0,0 +1,124 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Pointer device abstraction */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include "device-pointer.h"
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (MetaDevicePointer,
|
||||
meta_device_pointer,
|
||||
META_TYPE_DEVICE)
|
||||
|
||||
static void
|
||||
meta_device_pointer_class_init (MetaDevicePointerClass *klass)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_init (MetaDevicePointer *pointer)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_pointer_warp (MetaDevicePointer *pointer,
|
||||
MetaScreen *screen,
|
||||
gint x,
|
||||
gint y)
|
||||
{
|
||||
MetaDevicePointerClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE_POINTER (pointer));
|
||||
g_return_if_fail (META_IS_SCREEN (screen));
|
||||
|
||||
klass = META_DEVICE_POINTER_GET_CLASS (pointer);
|
||||
|
||||
if (klass->warp)
|
||||
(klass->warp) (pointer, screen, x, y);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_pointer_set_window_cursor (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
MetaCursor cursor)
|
||||
{
|
||||
MetaDevicePointerClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE_POINTER (pointer));
|
||||
g_return_if_fail (xwindow != None);
|
||||
|
||||
klass = META_DEVICE_POINTER_GET_CLASS (pointer);
|
||||
|
||||
if (klass->set_window_cursor)
|
||||
(klass->set_window_cursor) (pointer, xwindow, cursor);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_device_pointer_query_position (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
Window *root_ret,
|
||||
Window *child_ret,
|
||||
gint *root_x_ret,
|
||||
gint *root_y_ret,
|
||||
gint *x_ret,
|
||||
gint *y_ret,
|
||||
guint *mask_ret)
|
||||
{
|
||||
MetaDevicePointerClass *klass;
|
||||
gint root_x, root_y, x, y;
|
||||
Window root, child;
|
||||
gboolean retval;
|
||||
guint mask;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE_POINTER (pointer), FALSE);
|
||||
g_return_val_if_fail (xwindow != None, FALSE);
|
||||
|
||||
klass = META_DEVICE_POINTER_GET_CLASS (pointer);
|
||||
|
||||
if (!klass->query_position)
|
||||
return FALSE;
|
||||
|
||||
retval = (klass->query_position) (pointer, xwindow, &root, &child,
|
||||
&root_x, &root_y, &x, &y, &mask);
|
||||
|
||||
if (root_ret)
|
||||
*root_ret = root;
|
||||
|
||||
if (child_ret)
|
||||
*child_ret = child;
|
||||
|
||||
if (root_x_ret)
|
||||
*root_x_ret = root_x;
|
||||
|
||||
if (root_y_ret)
|
||||
*root_y_ret = root_y;
|
||||
|
||||
if (x_ret)
|
||||
*x_ret = x;
|
||||
|
||||
if (y_ret)
|
||||
*y_ret = y;
|
||||
|
||||
if (mask_ret)
|
||||
*mask_ret = mask;
|
||||
|
||||
return retval;
|
||||
}
|
95
src/core/device-pointer.h
Normal file
95
src/core/device-pointer.h
Normal file
@@ -0,0 +1,95 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file device-pointer.h Pointer device abstraction
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the internal abstraction of pointer devices so
|
||||
* XInput2/core events can be handled similarly.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef META_DEVICE_POINTER_H
|
||||
#define META_DEVICE_POINTER_H
|
||||
|
||||
#include "display-private.h"
|
||||
#include <meta/screen.h>
|
||||
#include "device-private.h"
|
||||
|
||||
#define META_TYPE_DEVICE_POINTER (meta_device_pointer_get_type ())
|
||||
#define META_DEVICE_POINTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_POINTER, MetaDevicePointer))
|
||||
#define META_DEVICE_POINTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_POINTER, MetaDevicePointerClass))
|
||||
#define META_IS_DEVICE_POINTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_POINTER))
|
||||
#define META_IS_DEVICE_POINTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_POINTER))
|
||||
#define META_DEVICE_POINTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_POINTER, MetaDevicePointerClass))
|
||||
|
||||
typedef struct _MetaDevicePointer MetaDevicePointer;
|
||||
typedef struct _MetaDevicePointerClass MetaDevicePointerClass;
|
||||
|
||||
struct _MetaDevicePointer
|
||||
{
|
||||
MetaDevice parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDevicePointerClass
|
||||
{
|
||||
MetaDeviceClass parent_instance;
|
||||
|
||||
void (* warp) (MetaDevicePointer *pointer,
|
||||
MetaScreen *screen,
|
||||
gint x,
|
||||
gint y);
|
||||
|
||||
void (* set_window_cursor) (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
MetaCursor cursor);
|
||||
gboolean (* query_position) (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
Window *root,
|
||||
Window *child,
|
||||
gint *root_x,
|
||||
gint *root_y,
|
||||
gint *x,
|
||||
gint *y,
|
||||
guint *mask);
|
||||
};
|
||||
|
||||
GType meta_device_pointer_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void meta_device_pointer_warp (MetaDevicePointer *pointer,
|
||||
MetaScreen *screen,
|
||||
gint x,
|
||||
gint y);
|
||||
void meta_device_pointer_set_window_cursor (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
MetaCursor cursor);
|
||||
|
||||
gboolean meta_device_pointer_query_position (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
Window *root,
|
||||
Window *child,
|
||||
gint *root_x,
|
||||
gint *root_y,
|
||||
gint *x,
|
||||
gint *y,
|
||||
guint *mask);
|
||||
|
||||
#endif /* META_DEVICE_POINTER_H */
|
80
src/core/device-private.h
Normal file
80
src/core/device-private.h
Normal file
@@ -0,0 +1,80 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file device.h Input device abstraction
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the internal abstraction of input devices so
|
||||
* XInput2/core events can be handled similarly.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef META_DEVICE_PRIVATE_H
|
||||
#define META_DEVICE_PRIVATE_H
|
||||
|
||||
#include <meta/device.h>
|
||||
#include "display-private.h"
|
||||
|
||||
struct _MetaDevice
|
||||
{
|
||||
GObject parent_instance;
|
||||
gpointer priv;
|
||||
};
|
||||
|
||||
struct _MetaDeviceClass
|
||||
{
|
||||
GObjectClass parent_instance;
|
||||
|
||||
void (* allow_events) (MetaDevice *device,
|
||||
int mode,
|
||||
Time time);
|
||||
|
||||
gboolean (* grab) (MetaDevice *device,
|
||||
Window xwindow,
|
||||
guint evmask,
|
||||
MetaCursor cursor,
|
||||
gboolean owner_events,
|
||||
gboolean sync,
|
||||
Time time);
|
||||
void (* ungrab) (MetaDevice *device,
|
||||
Time time);
|
||||
};
|
||||
|
||||
GType meta_device_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void meta_device_allow_events (MetaDevice *device,
|
||||
int mode,
|
||||
Time time);
|
||||
|
||||
gboolean meta_device_grab (MetaDevice *device,
|
||||
Window xwindow,
|
||||
guint evmask,
|
||||
MetaCursor cursor,
|
||||
gboolean owner_events,
|
||||
gboolean sync,
|
||||
Time time);
|
||||
void meta_device_ungrab (MetaDevice *device,
|
||||
Time time);
|
||||
|
||||
void meta_device_pair_devices (MetaDevice *device,
|
||||
MetaDevice *other_device);
|
||||
|
||||
#endif /* META_DEVICE_PRIVATE_H */
|
270
src/core/device.c
Normal file
270
src/core/device.c
Normal file
@@ -0,0 +1,270 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Input device abstraction */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include "device-private.h"
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (MetaDevice, meta_device, G_TYPE_OBJECT)
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_DEVICE_ID,
|
||||
PROP_DISPLAY,
|
||||
PROP_PAIRED_DEVICE
|
||||
};
|
||||
|
||||
typedef struct MetaDevicePrivate MetaDevicePrivate;
|
||||
|
||||
struct MetaDevicePrivate
|
||||
{
|
||||
MetaDisplay *display;
|
||||
MetaDevice *paired_device;
|
||||
gint device_id;
|
||||
};
|
||||
|
||||
static void
|
||||
meta_device_get_property (GObject *object,
|
||||
guint param_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
switch (param_id)
|
||||
{
|
||||
case PROP_DEVICE_ID:
|
||||
g_value_set_int (value,
|
||||
meta_device_get_id (META_DEVICE (object)));
|
||||
break;
|
||||
case PROP_DISPLAY:
|
||||
g_value_set_object (value,
|
||||
meta_device_get_display (META_DEVICE (object)));
|
||||
break;
|
||||
case PROP_PAIRED_DEVICE:
|
||||
g_value_set_object (value,
|
||||
meta_device_get_paired_device (META_DEVICE (object)));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_set_property (GObject *object,
|
||||
guint param_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
MetaDevicePrivate *priv = META_DEVICE (object)->priv;
|
||||
|
||||
switch (param_id)
|
||||
{
|
||||
case PROP_DEVICE_ID:
|
||||
priv->device_id = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_DISPLAY:
|
||||
priv->display = g_value_get_object (value);
|
||||
break;
|
||||
case PROP_PAIRED_DEVICE:
|
||||
meta_device_pair_devices (META_DEVICE (object),
|
||||
g_value_get_object (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_class_init (MetaDeviceClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->get_property = meta_device_get_property;
|
||||
object_class->set_property = meta_device_set_property;
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_DEVICE_ID,
|
||||
g_param_spec_int ("device-id",
|
||||
"Device ID",
|
||||
"Device ID",
|
||||
2, G_MAXINT, 2,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY));
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_DISPLAY,
|
||||
g_param_spec_object ("display",
|
||||
"Display",
|
||||
"Display",
|
||||
META_TYPE_DISPLAY,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_CONSTRUCT_ONLY));
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_PAIRED_DEVICE,
|
||||
g_param_spec_object ("paired-device",
|
||||
"Paired device",
|
||||
"Paired device",
|
||||
META_TYPE_DEVICE,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_type_class_add_private (klass, sizeof (MetaDevicePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_init (MetaDevice *device)
|
||||
{
|
||||
device->priv = G_TYPE_INSTANCE_GET_PRIVATE (device,
|
||||
META_TYPE_DEVICE,
|
||||
MetaDevicePrivate);
|
||||
}
|
||||
|
||||
int
|
||||
meta_device_get_id (MetaDevice *device)
|
||||
{
|
||||
MetaDevicePrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE (device), 0);
|
||||
|
||||
priv = device->priv;
|
||||
return priv->device_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_device_get_display:
|
||||
* @device: a #MetaDevice
|
||||
*
|
||||
* Returns the #MetaDisplay to which the device belongs
|
||||
*
|
||||
* Returns: (transfer none): the #MetaDisplay to which the device belongs
|
||||
**/
|
||||
MetaDisplay *
|
||||
meta_device_get_display (MetaDevice *device)
|
||||
{
|
||||
MetaDevicePrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE (device), NULL);
|
||||
|
||||
priv = device->priv;
|
||||
return priv->display;
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_allow_events (MetaDevice *device,
|
||||
int mode,
|
||||
Time time)
|
||||
{
|
||||
MetaDeviceClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE (device));
|
||||
|
||||
klass = META_DEVICE_GET_CLASS (device);
|
||||
|
||||
if (klass->allow_events)
|
||||
(klass->allow_events) (device, mode, time);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_device_grab (MetaDevice *device,
|
||||
Window xwindow,
|
||||
guint evmask,
|
||||
MetaCursor cursor,
|
||||
gboolean owner_events,
|
||||
gboolean sync,
|
||||
Time time)
|
||||
{
|
||||
MetaDeviceClass *klass;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE (device), FALSE);
|
||||
g_return_val_if_fail (xwindow != None, FALSE);
|
||||
|
||||
klass = META_DEVICE_GET_CLASS (device);
|
||||
|
||||
if (!klass->grab)
|
||||
return FALSE;
|
||||
|
||||
return (klass->grab) (device, xwindow, evmask, cursor,
|
||||
owner_events, sync, time);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_ungrab (MetaDevice *device,
|
||||
Time time)
|
||||
{
|
||||
MetaDeviceClass *klass;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE (device));
|
||||
|
||||
klass = META_DEVICE_GET_CLASS (device);
|
||||
|
||||
if (klass->ungrab)
|
||||
(klass->ungrab) (device, time);
|
||||
}
|
||||
|
||||
void
|
||||
meta_device_pair_devices (MetaDevice *device,
|
||||
MetaDevice *other_device)
|
||||
{
|
||||
MetaDevicePrivate *priv1, *priv2;
|
||||
|
||||
g_return_if_fail (META_IS_DEVICE (device));
|
||||
g_return_if_fail (META_IS_DEVICE (other_device));
|
||||
|
||||
priv1 = device->priv;
|
||||
priv2 = other_device->priv;
|
||||
|
||||
/* Consider safe multiple calls
|
||||
* on already paired devices
|
||||
*/
|
||||
if (priv1->paired_device != NULL &&
|
||||
priv2->paired_device != NULL &&
|
||||
priv1->paired_device == other_device &&
|
||||
priv2->paired_device == device)
|
||||
return;
|
||||
|
||||
g_return_if_fail (priv1->paired_device == NULL);
|
||||
g_return_if_fail (priv2->paired_device == NULL);
|
||||
|
||||
priv1->paired_device = g_object_ref (other_device);
|
||||
priv2->paired_device = g_object_ref (device);
|
||||
|
||||
g_object_notify (G_OBJECT (device), "paired-device");
|
||||
g_object_notify (G_OBJECT (other_device), "paired-device");
|
||||
}
|
||||
|
||||
/**
|
||||
* meta_device_get_paired_device:
|
||||
* @device: a #MetaDevice
|
||||
*
|
||||
* Returns the paired device. Devices come in keyboard/pointer pairs.
|
||||
*
|
||||
* Returns: (transfer none): The paired device.
|
||||
**/
|
||||
MetaDevice *
|
||||
meta_device_get_paired_device (MetaDevice *device)
|
||||
{
|
||||
MetaDevicePrivate *priv;
|
||||
|
||||
g_return_val_if_fail (META_IS_DEVICE (device), NULL);
|
||||
|
||||
priv = device->priv;
|
||||
return priv->paired_device;
|
||||
}
|
256
src/core/devices-core.c
Normal file
256
src/core/devices-core.c
Normal file
@@ -0,0 +1,256 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* Core input devices implementation */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include "screen-private.h"
|
||||
#include "devices-core.h"
|
||||
#include "device-map-private.h"
|
||||
|
||||
/* Common functions */
|
||||
static void
|
||||
meta_device_core_common_allow_events (MetaDevice *device,
|
||||
int mode,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
XAllowEvents (display->xdisplay, mode, time);
|
||||
}
|
||||
|
||||
/* Core pointer */
|
||||
|
||||
G_DEFINE_TYPE (MetaDevicePointerCore,
|
||||
meta_device_pointer_core,
|
||||
META_TYPE_DEVICE_POINTER)
|
||||
|
||||
static gboolean
|
||||
meta_device_pointer_core_grab (MetaDevice *device,
|
||||
Window xwindow,
|
||||
guint evmask,
|
||||
MetaCursor cursor,
|
||||
gboolean owner_events,
|
||||
gboolean sync,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
Cursor xcursor;
|
||||
int retval;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
xcursor = meta_display_create_x_cursor (display, cursor);
|
||||
|
||||
retval = XGrabPointer (display->xdisplay,
|
||||
xwindow, owner_events,
|
||||
evmask,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
None, xcursor, time);
|
||||
|
||||
if (xcursor != None)
|
||||
XFreeCursor (display->xdisplay, xcursor);
|
||||
|
||||
return (retval == Success);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_core_ungrab (MetaDevice *device,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
XUngrabPointer (display->xdisplay, time);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_core_warp (MetaDevicePointer *pointer,
|
||||
MetaScreen *screen,
|
||||
gint x,
|
||||
gint y)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (pointer));
|
||||
XWarpPointer (display->xdisplay,
|
||||
None, screen->xroot,
|
||||
0, 0, 0, 0, x, y);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_core_set_window_cursor (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
MetaCursor cursor)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
Cursor xcursor;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (pointer));
|
||||
xcursor = meta_display_create_x_cursor (display, cursor);
|
||||
|
||||
XDefineCursor (display->xdisplay, xwindow, xcursor);
|
||||
|
||||
if (xcursor != None)
|
||||
XFreeCursor (display->xdisplay, xcursor);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_device_pointer_core_query_position (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
Window *root,
|
||||
Window *child,
|
||||
gint *root_x,
|
||||
gint *root_y,
|
||||
gint *x,
|
||||
gint *y,
|
||||
guint *mask)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (pointer));
|
||||
return XQueryPointer (display->xdisplay, xwindow,
|
||||
root, child, root_x, root_y,
|
||||
x, y, mask);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_core_class_init (MetaDevicePointerCoreClass *klass)
|
||||
{
|
||||
MetaDevicePointerClass *pointer_class = META_DEVICE_POINTER_CLASS (klass);
|
||||
MetaDeviceClass *device_class = META_DEVICE_CLASS (klass);
|
||||
|
||||
device_class->allow_events = meta_device_core_common_allow_events;
|
||||
device_class->grab = meta_device_pointer_core_grab;
|
||||
device_class->ungrab = meta_device_pointer_core_ungrab;
|
||||
|
||||
pointer_class->warp = meta_device_pointer_core_warp;
|
||||
pointer_class->set_window_cursor = meta_device_pointer_core_set_window_cursor;
|
||||
pointer_class->query_position = meta_device_pointer_core_query_position;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_core_init (MetaDevicePointerCore *pointer)
|
||||
{
|
||||
}
|
||||
|
||||
MetaDevice *
|
||||
meta_device_pointer_core_new (MetaDisplay *display)
|
||||
{
|
||||
return g_object_new (META_TYPE_DEVICE_POINTER_CORE,
|
||||
"device-id", META_CORE_POINTER_ID,
|
||||
"display", display,
|
||||
NULL);
|
||||
}
|
||||
|
||||
|
||||
/* Core Keyboard */
|
||||
|
||||
G_DEFINE_TYPE (MetaDeviceKeyboardCore,
|
||||
meta_device_keyboard_core,
|
||||
META_TYPE_DEVICE_KEYBOARD)
|
||||
|
||||
static gboolean
|
||||
meta_device_keyboard_core_grab (MetaDevice *device,
|
||||
Window xwindow,
|
||||
guint evmask,
|
||||
MetaCursor cursor,
|
||||
gboolean owner_events,
|
||||
gboolean sync,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
gint retval;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
retval = XGrabKeyboard (display->xdisplay, xwindow, owner_events,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
time);
|
||||
|
||||
return (retval == Success);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_core_ungrab (MetaDevice *device,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
XUngrabKeyboard (display->xdisplay, time);
|
||||
}
|
||||
|
||||
static Window
|
||||
meta_device_keyboard_core_get_focus_window (MetaDeviceKeyboard *keyboard)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
Window xwindow;
|
||||
int unused;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (keyboard));
|
||||
XGetInputFocus (display->xdisplay, &xwindow, &unused);
|
||||
|
||||
return xwindow;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_core_set_focus_window (MetaDeviceKeyboard *keyboard,
|
||||
Window xwindow,
|
||||
Time timestamp)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (keyboard));
|
||||
XSetInputFocus (display->xdisplay,
|
||||
xwindow,
|
||||
RevertToPointerRoot,
|
||||
timestamp);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_core_class_init (MetaDeviceKeyboardCoreClass *klass)
|
||||
{
|
||||
MetaDeviceKeyboardClass *keyboard_class = META_DEVICE_KEYBOARD_CLASS (klass);
|
||||
MetaDeviceClass *device_class = META_DEVICE_CLASS (klass);
|
||||
|
||||
keyboard_class->get_focus_window = meta_device_keyboard_core_get_focus_window;
|
||||
keyboard_class->set_focus_window = meta_device_keyboard_core_set_focus_window;
|
||||
|
||||
device_class->allow_events = meta_device_core_common_allow_events;
|
||||
device_class->grab = meta_device_keyboard_core_grab;
|
||||
device_class->ungrab = meta_device_keyboard_core_ungrab;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_core_init (MetaDeviceKeyboardCore *keyboard)
|
||||
{
|
||||
}
|
||||
|
||||
MetaDevice *
|
||||
meta_device_keyboard_core_new (MetaDisplay *display)
|
||||
{
|
||||
return g_object_new (META_TYPE_DEVICE_KEYBOARD_CORE,
|
||||
"device-id", META_CORE_KEYBOARD_ID,
|
||||
"display", display,
|
||||
NULL);
|
||||
}
|
85
src/core/devices-core.h
Normal file
85
src/core/devices-core.h
Normal file
@@ -0,0 +1,85 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file devices-core.h Core input devices implementation
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the core X protocol implementation of input devices.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef META_DEVICES_CORE_H
|
||||
#define META_DEVICES_CORE_H
|
||||
|
||||
#include "device-pointer.h"
|
||||
#include "device-keyboard.h"
|
||||
|
||||
/* Pointer */
|
||||
#define META_TYPE_DEVICE_POINTER_CORE (meta_device_pointer_core_get_type ())
|
||||
#define META_DEVICE_POINTER_CORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_POINTER_CORE, MetaDevicePointerCore))
|
||||
#define META_DEVICE_POINTER_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_POINTER_CORE, MetaDevicePointerCoreClass))
|
||||
#define META_IS_DEVICE_POINTER_CORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_POINTER_CORE))
|
||||
#define META_IS_DEVICE_POINTER_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_POINTER_CORE))
|
||||
#define META_DEVICE_POINTER_CORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_POINTER_CORE, MetaDevicePointerCoreClass))
|
||||
|
||||
typedef struct _MetaDevicePointerCore MetaDevicePointerCore;
|
||||
typedef struct _MetaDevicePointerCoreClass MetaDevicePointerCoreClass;
|
||||
|
||||
struct _MetaDevicePointerCore
|
||||
{
|
||||
MetaDevicePointer parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDevicePointerCoreClass
|
||||
{
|
||||
MetaDevicePointerClass parent_class;
|
||||
};
|
||||
|
||||
GType meta_device_pointer_core_get_type (void) G_GNUC_CONST;
|
||||
|
||||
MetaDevice *meta_device_pointer_core_new (MetaDisplay *display);
|
||||
|
||||
/* Keyboard */
|
||||
#define META_TYPE_DEVICE_KEYBOARD_CORE (meta_device_keyboard_core_get_type ())
|
||||
#define META_DEVICE_KEYBOARD_CORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_KEYBOARD_CORE, MetaDeviceKeyboardCore))
|
||||
#define META_DEVICE_KEYBOARD_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_KEYBOARD_CORE, MetaDeviceKeyboardCoreClass))
|
||||
#define META_IS_DEVICE_KEYBOARD_CORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_KEYBOARD_CORE))
|
||||
#define META_IS_DEVICE_KEYBOARD_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_KEYBOARD_CORE))
|
||||
#define META_DEVICE_KEYBOARD_CORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_KEYBOARD_CORE, MetaDeviceKeyboardCoreClass))
|
||||
|
||||
typedef struct _MetaDeviceKeyboardCore MetaDeviceKeyboardCore;
|
||||
typedef struct _MetaDeviceKeyboardCoreClass MetaDeviceKeyboardCoreClass;
|
||||
|
||||
struct _MetaDeviceKeyboardCore
|
||||
{
|
||||
MetaDeviceKeyboard parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDeviceKeyboardCoreClass
|
||||
{
|
||||
MetaDeviceKeyboardClass parent_class;
|
||||
};
|
||||
|
||||
GType meta_device_keyboard_core_get_type (void) G_GNUC_CONST;
|
||||
|
||||
MetaDevice *meta_device_keyboard_core_new (MetaDisplay *display);
|
||||
|
||||
#endif /* META_DEVICES_CORE_H */
|
343
src/core/devices-xi2.c
Normal file
343
src/core/devices-xi2.c
Normal file
@@ -0,0 +1,343 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/* XInput2 devices implementation */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include "devices-xi2.h"
|
||||
#include "display-private.h"
|
||||
#include "screen-private.h"
|
||||
#include <X11/extensions/XInput2.h>
|
||||
|
||||
/* Common functions */
|
||||
static void
|
||||
meta_device_xi2_common_allow_events (MetaDevice *device,
|
||||
int mode,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
gint device_id;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
device_id = meta_device_get_id (device);
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case AsyncPointer:
|
||||
case AsyncKeyboard:
|
||||
mode = XIAsyncDevice;
|
||||
break;
|
||||
case SyncPointer:
|
||||
case SyncKeyboard:
|
||||
mode = XISyncDevice;
|
||||
break;
|
||||
case ReplayPointer:
|
||||
case ReplayKeyboard:
|
||||
mode = XIReplayDevice;
|
||||
break;
|
||||
case AsyncBoth:
|
||||
mode = XIAsyncPair;
|
||||
break;
|
||||
case SyncBoth:
|
||||
mode = XISyncPair;
|
||||
break;
|
||||
}
|
||||
|
||||
XIAllowEvents (display->xdisplay, device_id, mode, time);
|
||||
}
|
||||
|
||||
guchar *
|
||||
meta_device_xi2_translate_event_mask (guint evmask,
|
||||
gint *len)
|
||||
{
|
||||
guchar *mask;
|
||||
|
||||
*len = XIMaskLen (XI_LASTEVENT);
|
||||
mask = g_new0 (guchar, *len);
|
||||
|
||||
if (evmask & KeyPressMask)
|
||||
XISetMask (mask, XI_KeyPress);
|
||||
if (evmask & KeyReleaseMask)
|
||||
XISetMask (mask, XI_KeyRelease);
|
||||
if (evmask & ButtonPressMask)
|
||||
XISetMask (mask, XI_ButtonPress);
|
||||
if (evmask & ButtonReleaseMask)
|
||||
XISetMask (mask, XI_ButtonRelease);
|
||||
if (evmask & EnterWindowMask)
|
||||
XISetMask (mask, XI_Enter);
|
||||
if (evmask & LeaveWindowMask)
|
||||
XISetMask (mask, XI_Leave);
|
||||
|
||||
/* No motion hints in XI2 at the moment... */
|
||||
if (evmask & PointerMotionMask ||
|
||||
evmask & PointerMotionHintMask)
|
||||
XISetMask (mask, XI_Motion);
|
||||
|
||||
if (evmask & FocusChangeMask)
|
||||
{
|
||||
XISetMask (mask, XI_FocusIn);
|
||||
XISetMask (mask, XI_FocusOut);
|
||||
}
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_device_xi2_common_grab (MetaDevice *device,
|
||||
Window xwindow,
|
||||
guint evmask,
|
||||
MetaCursor cursor,
|
||||
gboolean owner_events,
|
||||
gboolean sync,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
XIEventMask mask;
|
||||
gint device_id, retval;
|
||||
Cursor xcursor;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
device_id = meta_device_get_id (device);
|
||||
xcursor = meta_display_create_x_cursor (display, cursor);
|
||||
|
||||
mask.deviceid = device_id;
|
||||
mask.mask = meta_device_xi2_translate_event_mask (evmask, &mask.mask_len);
|
||||
|
||||
retval = XIGrabDevice (display->xdisplay,
|
||||
device_id, xwindow,
|
||||
time, xcursor,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
(sync) ? GrabModeSync : GrabModeAsync,
|
||||
owner_events, &mask);
|
||||
|
||||
if (xcursor != None)
|
||||
XFreeCursor (display->xdisplay, xcursor);
|
||||
|
||||
return (retval == Success);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_xi2_common_ungrab (MetaDevice *device,
|
||||
Time time)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
gint device_id;
|
||||
|
||||
display = meta_device_get_display (device);
|
||||
device_id = meta_device_get_id (device);
|
||||
|
||||
XIUngrabDevice (display->xdisplay, device_id, time);
|
||||
}
|
||||
|
||||
/* Pointer */
|
||||
|
||||
G_DEFINE_TYPE (MetaDevicePointerXI2,
|
||||
meta_device_pointer_xi2,
|
||||
META_TYPE_DEVICE_POINTER)
|
||||
|
||||
static void
|
||||
meta_device_pointer_xi2_warp (MetaDevicePointer *pointer,
|
||||
MetaScreen *screen,
|
||||
gint x,
|
||||
gint y)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
int device_id;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (pointer));
|
||||
device_id = meta_device_get_id (META_DEVICE (pointer));
|
||||
|
||||
XIWarpPointer (display->xdisplay,
|
||||
device_id,
|
||||
None, screen->xroot,
|
||||
0, 0, 0, 0, x, y);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_xi2_set_window_cursor (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
MetaCursor cursor)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
Cursor xcursor;
|
||||
int device_id;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (pointer));
|
||||
device_id = meta_device_get_id (META_DEVICE (pointer));
|
||||
xcursor = meta_display_create_x_cursor (display, cursor);
|
||||
|
||||
if (xcursor != None)
|
||||
{
|
||||
XIDefineCursor (display->xdisplay, device_id, xwindow, xcursor);
|
||||
XFreeCursor (display->xdisplay, xcursor);
|
||||
}
|
||||
else
|
||||
XIUndefineCursor (display->xdisplay, device_id, xwindow);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_device_pointer_xi2_query_position (MetaDevicePointer *pointer,
|
||||
Window xwindow,
|
||||
Window *root_ret,
|
||||
Window *child_ret,
|
||||
gint *root_x_ret,
|
||||
gint *root_y_ret,
|
||||
gint *x_ret,
|
||||
gint *y_ret,
|
||||
guint *mask_ret)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
XIModifierState mods;
|
||||
XIGroupState group_unused;
|
||||
XIButtonState buttons;
|
||||
gdouble root_x, root_y, x, y;
|
||||
int device_id;
|
||||
gboolean retval;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (pointer));
|
||||
device_id = meta_device_get_id (META_DEVICE (pointer));
|
||||
|
||||
retval = XIQueryPointer (display->xdisplay,
|
||||
device_id, xwindow,
|
||||
root_ret, child_ret,
|
||||
&root_x, &root_y, &x, &y,
|
||||
&buttons, &mods,
|
||||
&group_unused);
|
||||
if (mask_ret)
|
||||
{
|
||||
*mask_ret = mods.effective;
|
||||
|
||||
if (XIMaskIsSet (buttons.mask, 1))
|
||||
*mask_ret |= Button1Mask;
|
||||
else if (XIMaskIsSet (buttons.mask, 2))
|
||||
*mask_ret |= Button2Mask;
|
||||
else if (XIMaskIsSet (buttons.mask, 3))
|
||||
*mask_ret |= Button3Mask;
|
||||
}
|
||||
|
||||
if (root_x_ret)
|
||||
*root_x_ret = (int) root_x;
|
||||
|
||||
if (root_y_ret)
|
||||
*root_y_ret = (int) root_y;
|
||||
|
||||
if (x_ret)
|
||||
*x_ret = (int) x;
|
||||
|
||||
if (y_ret)
|
||||
*y_ret = (int) y;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_xi2_class_init (MetaDevicePointerXI2Class *klass)
|
||||
{
|
||||
MetaDevicePointerClass *pointer_class = META_DEVICE_POINTER_CLASS (klass);
|
||||
MetaDeviceClass *device_class = META_DEVICE_CLASS (klass);
|
||||
|
||||
device_class->allow_events = meta_device_xi2_common_allow_events;
|
||||
device_class->grab = meta_device_xi2_common_grab;
|
||||
device_class->ungrab = meta_device_xi2_common_ungrab;
|
||||
|
||||
pointer_class->warp = meta_device_pointer_xi2_warp;
|
||||
pointer_class->set_window_cursor = meta_device_pointer_xi2_set_window_cursor;
|
||||
pointer_class->query_position = meta_device_pointer_xi2_query_position;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_pointer_xi2_init (MetaDevicePointerXI2 *pointer)
|
||||
{
|
||||
}
|
||||
|
||||
MetaDevice *
|
||||
meta_device_pointer_xi2_new (MetaDisplay *display,
|
||||
gint device_id)
|
||||
{
|
||||
return g_object_new (META_TYPE_DEVICE_POINTER_XI2,
|
||||
"device-id", device_id,
|
||||
"display", display,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/* Keyboard */
|
||||
|
||||
G_DEFINE_TYPE (MetaDeviceKeyboardXI2,
|
||||
meta_device_keyboard_xi2,
|
||||
META_TYPE_DEVICE_KEYBOARD)
|
||||
|
||||
static Window
|
||||
meta_device_keyboard_xi2_get_focus_window (MetaDeviceKeyboard *keyboard)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
Window xwindow;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (keyboard));
|
||||
XIGetFocus (display->xdisplay,
|
||||
meta_device_get_id (META_DEVICE (keyboard)),
|
||||
&xwindow);
|
||||
|
||||
return xwindow;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_xi2_set_focus_window (MetaDeviceKeyboard *keyboard,
|
||||
Window xwindow,
|
||||
Time timestamp)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
|
||||
display = meta_device_get_display (META_DEVICE (keyboard));
|
||||
|
||||
XISetFocus (display->xdisplay,
|
||||
meta_device_get_id (META_DEVICE (keyboard)),
|
||||
xwindow,
|
||||
timestamp);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_xi2_class_init (MetaDeviceKeyboardXI2Class *klass)
|
||||
{
|
||||
MetaDeviceKeyboardClass *keyboard_class = META_DEVICE_KEYBOARD_CLASS (klass);
|
||||
MetaDeviceClass *device_class = META_DEVICE_CLASS (klass);
|
||||
|
||||
keyboard_class->get_focus_window = meta_device_keyboard_xi2_get_focus_window;
|
||||
keyboard_class->set_focus_window = meta_device_keyboard_xi2_set_focus_window;
|
||||
|
||||
device_class->allow_events = meta_device_xi2_common_allow_events;
|
||||
device_class->grab = meta_device_xi2_common_grab;
|
||||
device_class->ungrab = meta_device_xi2_common_ungrab;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_device_keyboard_xi2_init (MetaDeviceKeyboardXI2 *keyboard)
|
||||
{
|
||||
}
|
||||
|
||||
MetaDevice *
|
||||
meta_device_keyboard_xi2_new (MetaDisplay *display,
|
||||
gint device_id)
|
||||
{
|
||||
return g_object_new (META_TYPE_DEVICE_KEYBOARD_XI2,
|
||||
"device-id", device_id,
|
||||
"display", display,
|
||||
NULL);
|
||||
}
|
92
src/core/devices-xi2.h
Normal file
92
src/core/devices-xi2.h
Normal file
@@ -0,0 +1,92 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
/**
|
||||
* \file devices-xi2.h XInput2 input devices implementation
|
||||
*
|
||||
* Input devices.
|
||||
* This file contains the XInput2 implementation of input devices.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011 Carlos Garnacho
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef META_DEVICES_XI2_H
|
||||
#define META_DEVICES_XI2_H
|
||||
|
||||
#include "device-pointer.h"
|
||||
#include "device-keyboard.h"
|
||||
|
||||
/* Pointer */
|
||||
#define META_TYPE_DEVICE_POINTER_XI2 (meta_device_pointer_xi2_get_type ())
|
||||
#define META_DEVICE_POINTER_XI2(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_POINTER_XI2, MetaDevicePointerXI2))
|
||||
#define META_DEVICE_POINTER_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_POINTER_XI2, MetaDevicePointerXI2Class))
|
||||
#define META_IS_DEVICE_POINTER_XI2(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_POINTER_XI2))
|
||||
#define META_IS_DEVICE_POINTER_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_POINTER_XI2))
|
||||
#define META_DEVICE_POINTER_XI2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_POINTER_XI2, MetaDevicePointerXI2Class))
|
||||
|
||||
typedef struct _MetaDevicePointerXI2 MetaDevicePointerXI2;
|
||||
typedef struct _MetaDevicePointerXI2Class MetaDevicePointerXI2Class;
|
||||
|
||||
struct _MetaDevicePointerXI2
|
||||
{
|
||||
MetaDevicePointer parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDevicePointerXI2Class
|
||||
{
|
||||
MetaDevicePointerClass parent_class;
|
||||
};
|
||||
|
||||
GType meta_device_pointer_xi2_get_type (void) G_GNUC_CONST;
|
||||
|
||||
MetaDevice *meta_device_pointer_xi2_new (MetaDisplay *display,
|
||||
gint device_id);
|
||||
|
||||
/* Keyboard */
|
||||
#define META_TYPE_DEVICE_KEYBOARD_XI2 (meta_device_keyboard_xi2_get_type ())
|
||||
#define META_DEVICE_KEYBOARD_XI2(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_KEYBOARD_XI2, MetaDeviceKeyboardXI2))
|
||||
#define META_DEVICE_KEYBOARD_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_KEYBOARD_XI2, MetaDeviceKeyboardXI2Class))
|
||||
#define META_IS_DEVICE_KEYBOARD_XI2(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_KEYBOARD_XI2))
|
||||
#define META_IS_DEVICE_KEYBOARD_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_KEYBOARD_XI2))
|
||||
#define META_DEVICE_KEYBOARD_XI2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_KEYBOARD_XI2, MetaDeviceKeyboardXI2Class))
|
||||
|
||||
typedef struct _MetaDeviceKeyboardXI2 MetaDeviceKeyboardXI2;
|
||||
typedef struct _MetaDeviceKeyboardXI2Class MetaDeviceKeyboardXI2Class;
|
||||
|
||||
struct _MetaDeviceKeyboardXI2
|
||||
{
|
||||
MetaDeviceKeyboard parent_instance;
|
||||
};
|
||||
|
||||
struct _MetaDeviceKeyboardXI2Class
|
||||
{
|
||||
MetaDeviceKeyboardClass parent_class;
|
||||
};
|
||||
|
||||
GType meta_device_keyboard_xi2_get_type (void) G_GNUC_CONST;
|
||||
|
||||
MetaDevice *meta_device_keyboard_xi2_new (MetaDisplay *display,
|
||||
gint device_id);
|
||||
|
||||
/* Helper function for translating event masks */
|
||||
guchar * meta_device_xi2_translate_event_mask (guint evmask,
|
||||
gint *len);
|
||||
|
||||
|
||||
#endif /* META_DEVICES_XI2_H */
|
@@ -38,6 +38,7 @@
|
||||
#include <meta/boxes.h>
|
||||
#include <meta/display.h>
|
||||
#include "keybindings-private.h"
|
||||
#include "device-map-private.h"
|
||||
#include <meta/prefs.h>
|
||||
|
||||
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||
@@ -56,6 +57,9 @@ typedef struct _MetaWindowPropHooks MetaWindowPropHooks;
|
||||
|
||||
typedef struct MetaEdgeResistanceData MetaEdgeResistanceData;
|
||||
|
||||
typedef struct _MetaGrabInfo MetaGrabInfo;
|
||||
typedef struct _MetaFocusInfo MetaFocusInfo;
|
||||
|
||||
typedef void (* MetaWindowPingFunc) (MetaDisplay *display,
|
||||
Window xwindow,
|
||||
guint32 timestamp,
|
||||
@@ -86,6 +90,67 @@ typedef enum {
|
||||
META_TILE_MAXIMIZED
|
||||
} MetaTileMode;
|
||||
|
||||
struct _MetaGrabInfo
|
||||
{
|
||||
MetaDevice *grab_pointer;
|
||||
MetaDevice *grab_keyboard;
|
||||
|
||||
MetaGrabOp grab_op;
|
||||
MetaScreen *grab_screen;
|
||||
MetaWindow *grab_window;
|
||||
Window grab_xwindow;
|
||||
int grab_button;
|
||||
int grab_anchor_root_x;
|
||||
int grab_anchor_root_y;
|
||||
MetaRectangle grab_anchor_window_pos;
|
||||
MetaTileMode grab_tile_mode;
|
||||
int grab_tile_monitor_number;
|
||||
int grab_latest_motion_x;
|
||||
int grab_latest_motion_y;
|
||||
gulong grab_mask;
|
||||
guint grab_have_pointer : 1;
|
||||
guint grab_have_keyboard : 1;
|
||||
guint grab_frame_action : 1;
|
||||
/* During a resize operation, the directions in which we've broken
|
||||
* out of the initial maximization state */
|
||||
guint grab_resize_unmaximize : 2; /* MetaMaximizeFlags */
|
||||
MetaRectangle grab_initial_window_pos;
|
||||
int grab_initial_x, grab_initial_y; /* These are only relevant for */
|
||||
gboolean grab_threshold_movement_reached; /* raise_on_click == FALSE. */
|
||||
MetaResizePopup *grab_resize_popup;
|
||||
GTimeVal grab_last_moveresize_time;
|
||||
guint32 grab_motion_notify_time;
|
||||
GList* grab_old_window_stacking;
|
||||
unsigned int grab_last_user_action_was_snap;
|
||||
MetaEdgeResistanceData *grab_edge_resistance_data;
|
||||
|
||||
#ifdef HAVE_XSYNC
|
||||
/* alarm monitoring client's _NET_WM_SYNC_REQUEST_COUNTER */
|
||||
XSyncAlarm grab_sync_request_alarm;
|
||||
#endif
|
||||
int grab_resize_timeout_id;
|
||||
};
|
||||
|
||||
struct _MetaFocusInfo
|
||||
{
|
||||
/* This is the actual window from focus events,
|
||||
* not the one we last set
|
||||
*/
|
||||
MetaWindow *focus_window;
|
||||
|
||||
/* window we are expecting a FocusIn event for or the current focus
|
||||
* window if we are not expecting any FocusIn/FocusOut events; not
|
||||
* perfect because applications can call XSetInputFocus directly.
|
||||
* (It could also be messed up if a timestamp later than current
|
||||
* time is sent to meta_display_set_input_focus_window, though that
|
||||
* would be a programming error). See bug 154598 for more info.
|
||||
*/
|
||||
MetaWindow *expected_focus_window;
|
||||
|
||||
/* last timestamp passed to XSetInputFocus */
|
||||
guint32 last_focus_time;
|
||||
};
|
||||
|
||||
struct _MetaDisplay
|
||||
{
|
||||
GObject parent_instance;
|
||||
@@ -104,22 +169,8 @@ struct _MetaDisplay
|
||||
#include <meta/atomnames.h>
|
||||
#undef item
|
||||
|
||||
/* This is the actual window from focus events,
|
||||
* not the one we last set
|
||||
*/
|
||||
MetaWindow *focus_window;
|
||||
|
||||
/* window we are expecting a FocusIn event for or the current focus
|
||||
* window if we are not expecting any FocusIn/FocusOut events; not
|
||||
* perfect because applications can call XSetInputFocus directly.
|
||||
* (It could also be messed up if a timestamp later than current
|
||||
* time is sent to meta_display_set_input_focus_window, though that
|
||||
* would be a programming error). See bug 154598 for more info.
|
||||
*/
|
||||
MetaWindow *expected_focus_window;
|
||||
|
||||
/* last timestamp passed to XSetInputFocus */
|
||||
guint32 last_focus_time;
|
||||
/* keyboard -> MetaFocusInfo hashtable */
|
||||
GHashTable *focus_info;
|
||||
|
||||
/* last user interaction time in any app */
|
||||
guint32 last_user_time;
|
||||
@@ -172,6 +223,9 @@ struct _MetaDisplay
|
||||
/* Pings which we're waiting for a reply from */
|
||||
GSList *pending_pings;
|
||||
|
||||
/* Pending focus change */
|
||||
guint focus_timeout_id;
|
||||
|
||||
/* Pending autoraise */
|
||||
guint autoraise_timeout_id;
|
||||
MetaWindow* autoraise_window;
|
||||
@@ -179,35 +233,11 @@ struct _MetaDisplay
|
||||
/* Alt+click button grabs */
|
||||
unsigned int window_grab_modifiers;
|
||||
|
||||
/* current window operation */
|
||||
MetaGrabOp grab_op;
|
||||
MetaScreen *grab_screen;
|
||||
MetaWindow *grab_window;
|
||||
Window grab_xwindow;
|
||||
int grab_button;
|
||||
int grab_anchor_root_x;
|
||||
int grab_anchor_root_y;
|
||||
MetaRectangle grab_anchor_window_pos;
|
||||
MetaTileMode grab_tile_mode;
|
||||
int grab_tile_monitor_number;
|
||||
int grab_latest_motion_x;
|
||||
int grab_latest_motion_y;
|
||||
gulong grab_mask;
|
||||
guint grab_have_pointer : 1;
|
||||
guint grab_have_keyboard : 1;
|
||||
guint grab_frame_action : 1;
|
||||
/* During a resize operation, the directions in which we've broken
|
||||
* out of the initial maximization state */
|
||||
guint grab_resize_unmaximize : 2; /* MetaMaximizeFlags */
|
||||
MetaRectangle grab_initial_window_pos;
|
||||
int grab_initial_x, grab_initial_y; /* These are only relevant for */
|
||||
gboolean grab_threshold_movement_reached; /* raise_on_click == FALSE. */
|
||||
MetaResizePopup *grab_resize_popup;
|
||||
GTimeVal grab_last_moveresize_time;
|
||||
guint32 grab_motion_notify_time;
|
||||
GList* grab_old_window_stacking;
|
||||
MetaEdgeResistanceData *grab_edge_resistance_data;
|
||||
unsigned int grab_last_user_action_was_snap;
|
||||
/* per-device current window operation */
|
||||
GHashTable *current_grabs;
|
||||
|
||||
/* per-screen edge resistance cache */
|
||||
GHashTable *edge_resistance_info;
|
||||
|
||||
/* we use property updates as sentinels for certain window focus events
|
||||
* to avoid some race conditions on EnterNotify events
|
||||
@@ -218,11 +248,6 @@ struct _MetaDisplay
|
||||
int xkb_base_event_type;
|
||||
guint32 last_bell_time;
|
||||
#endif
|
||||
#ifdef HAVE_XSYNC
|
||||
/* alarm monitoring client's _NET_WM_SYNC_REQUEST_COUNTER */
|
||||
XSyncAlarm grab_sync_request_alarm;
|
||||
#endif
|
||||
int grab_resize_timeout_id;
|
||||
|
||||
/* Keybindings stuff */
|
||||
MetaKeyBinding *key_bindings;
|
||||
@@ -269,6 +294,9 @@ struct _MetaDisplay
|
||||
/* Managed by compositor.c */
|
||||
MetaCompositor *compositor;
|
||||
|
||||
/* Managed by device-map.c */
|
||||
MetaDeviceMap *device_map;
|
||||
|
||||
int render_event_base;
|
||||
int render_error_base;
|
||||
|
||||
@@ -292,6 +320,12 @@ struct _MetaDisplay
|
||||
int shape_event_base;
|
||||
int shape_error_base;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_XINPUT2
|
||||
int xinput2_opcode;
|
||||
unsigned int have_xinput2 : 1;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_XSYNC
|
||||
unsigned int have_xsync : 1;
|
||||
#define META_DISPLAY_HAS_XSYNC(display) ((display)->have_xsync)
|
||||
@@ -377,12 +411,14 @@ Cursor meta_display_create_x_cursor (MetaDisplay *display,
|
||||
|
||||
void meta_display_set_grab_op_cursor (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
MetaDevice *device,
|
||||
MetaGrabOp op,
|
||||
gboolean change_pointer,
|
||||
Window grab_xwindow,
|
||||
guint32 timestamp);
|
||||
|
||||
void meta_display_check_threshold_reached (MetaDisplay *display,
|
||||
MetaDevice *device,
|
||||
int x,
|
||||
int y);
|
||||
void meta_display_grab_window_buttons (MetaDisplay *display,
|
||||
@@ -396,7 +432,8 @@ void meta_display_ungrab_focus_window_button (MetaDisplay *display,
|
||||
MetaWindow *window);
|
||||
|
||||
/* Next function is defined in edge-resistance.c */
|
||||
void meta_display_cleanup_edges (MetaDisplay *display);
|
||||
void meta_display_cleanup_edges (MetaDisplay *display,
|
||||
MetaScreen *screen);
|
||||
|
||||
/* make a request to ensure the event serial has changed */
|
||||
void meta_display_increment_event_serial (MetaDisplay *display);
|
||||
@@ -444,4 +481,15 @@ void meta_display_overlay_key_activate (MetaDisplay *display);
|
||||
/* In above-tab-keycode.c */
|
||||
guint meta_display_get_above_tab_keycode (MetaDisplay *display);
|
||||
|
||||
MetaGrabInfo * meta_display_create_grab_info (MetaDisplay *display,
|
||||
MetaDevice *device);
|
||||
void meta_display_remove_grab_info (MetaDisplay *display,
|
||||
MetaDevice *device);
|
||||
|
||||
MetaGrabInfo * meta_display_get_grab_info (MetaDisplay *display,
|
||||
MetaDevice *device);
|
||||
MetaFocusInfo * meta_display_get_focus_info (MetaDisplay *display,
|
||||
MetaDevice *device);
|
||||
|
||||
|
||||
#endif
|
||||
|
3479
src/core/display.c
3479
src/core/display.c
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user