Compare commits
665 Commits
touch-text
...
wip/css-op
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
90bcb52293 | ||
|
|
3b48e562dd | ||
|
|
fc12246758 | ||
|
|
ae194d14d1 | ||
|
|
c55a492ad3 | ||
|
|
b70d8c477d | ||
|
|
73c436f43e | ||
|
|
c627b22126 | ||
|
|
e677cee28f | ||
|
|
2927383b5f | ||
|
|
2d9454363f | ||
|
|
eb7bf0a2f4 | ||
|
|
4f6e1fdf16 | ||
|
|
ddceddaa84 | ||
|
|
da09447914 | ||
|
|
d0af25f12c | ||
|
|
6e3d687386 | ||
|
|
6333cd8e83 | ||
|
|
8d28e2d8e9 | ||
|
|
e5948f5713 | ||
|
|
d967500c92 | ||
|
|
4be82195e4 | ||
|
|
455a0ecc1c | ||
|
|
2d5ad5f54e | ||
|
|
352c7f5120 | ||
|
|
c3f3a82db9 | ||
|
|
b55724e3a7 | ||
|
|
f2e05e2b41 | ||
|
|
bfbb9a58ae | ||
|
|
870657d57b | ||
|
|
4bc264a514 | ||
|
|
18fdc975be | ||
|
|
ed5d7fed89 | ||
|
|
2f8c2a3244 | ||
|
|
5671a869c2 | ||
|
|
f9b2edff39 | ||
|
|
53262cf7a6 | ||
|
|
6d3b4d9382 | ||
|
|
d3143779d2 | ||
|
|
43fc428cf0 | ||
|
|
70ba973d1d | ||
|
|
fd6ea42319 | ||
|
|
0e0ee480d3 | ||
|
|
78d0ef1d0b | ||
|
|
14c8e33ab9 | ||
|
|
c08efb2b32 | ||
|
|
c98ee1ec39 | ||
|
|
4366f80aab | ||
|
|
15570dd63d | ||
|
|
10c47c0226 | ||
|
|
0a1a2ac148 | ||
|
|
aa989a637a | ||
|
|
50a09957a4 | ||
|
|
e57ecafb6b | ||
|
|
b7743430aa | ||
|
|
77c0f9d8e6 | ||
|
|
872097603f | ||
|
|
5e01a05b30 | ||
|
|
a08eb4d58a | ||
|
|
8449e05865 | ||
|
|
b0f3aa82b7 | ||
|
|
4950f68a87 | ||
|
|
5f20d909e6 | ||
|
|
c59e8de533 | ||
|
|
e8f2eeac92 | ||
|
|
aae2bf91cb | ||
|
|
10c3a66e40 | ||
|
|
42fc6ab5d3 | ||
|
|
c8de9abe98 | ||
|
|
e60c9219f1 | ||
|
|
1c4158a649 | ||
|
|
55d65571f3 | ||
|
|
77912a65e2 | ||
|
|
8a40d8fe2a | ||
|
|
c94002f8c0 | ||
|
|
f4438a1ffc | ||
|
|
3563d11fc6 | ||
|
|
7b950944b0 | ||
|
|
ffeef28dbc | ||
|
|
0d9a45d460 | ||
|
|
947fed0961 | ||
|
|
ba88174614 | ||
|
|
598f86eaf3 | ||
|
|
3cb6ae3df3 | ||
|
|
bd31bd6d63 | ||
|
|
e3f407a71d | ||
|
|
1a213679bd | ||
|
|
e063a0fdf1 | ||
|
|
cff4718e91 | ||
|
|
ffa42cb5bb | ||
|
|
f9db800713 | ||
|
|
178e072e8a | ||
|
|
b42a4e2276 | ||
|
|
5e59033eb3 | ||
|
|
58021c9e98 | ||
|
|
e9dc0e391d | ||
|
|
9876fc4f17 | ||
|
|
aa534812f5 | ||
|
|
959bfbb66e | ||
|
|
debe81b1ea | ||
|
|
cdadbb069f | ||
|
|
9ebeb4e68a | ||
|
|
8bdc2aa228 | ||
|
|
075667e927 | ||
|
|
a46368dede | ||
|
|
1beb9db7b0 | ||
|
|
5830363787 | ||
|
|
7f870abf17 | ||
|
|
7501f9770f | ||
|
|
8bdff7a564 | ||
|
|
1ef057f983 | ||
|
|
756ebea036 | ||
|
|
dd6931d1ba | ||
|
|
c3148a81d2 | ||
|
|
aba0c5cc3b | ||
|
|
f55fe7e20b | ||
|
|
035e55d1ab | ||
|
|
f48b30c13a | ||
|
|
02bc589583 | ||
|
|
1d6e896fef | ||
|
|
62f5414742 | ||
|
|
be1bde9111 | ||
|
|
48ff2fc7ed | ||
|
|
9f6067a804 | ||
|
|
c8f2328337 | ||
|
|
dbbdefe4e0 | ||
|
|
dfea266e1f | ||
|
|
a1f6887f17 | ||
|
|
8796fe6d1c | ||
|
|
8710d97945 | ||
|
|
9c6e560819 | ||
|
|
ea3a750f13 | ||
|
|
94e3d7faf1 | ||
|
|
1cee5ff0dd | ||
|
|
0306278145 | ||
|
|
4067a45aff | ||
|
|
625f8a6dd3 | ||
|
|
0bfbf39306 | ||
|
|
f39f574914 | ||
|
|
281c592ea9 | ||
|
|
86ecf54139 | ||
|
|
2e287576b4 | ||
|
|
762e2d9322 | ||
|
|
fd73c1f8d9 | ||
|
|
1e08fe8646 | ||
|
|
6821a8f7b2 | ||
|
|
5e7949c47b | ||
|
|
ba96c34787 | ||
|
|
12dec5279e | ||
|
|
e9dbfc0e06 | ||
|
|
0ccb7db245 | ||
|
|
ccaf1c2c67 | ||
|
|
ce56248930 | ||
|
|
016647edb1 | ||
|
|
a68e76e058 | ||
|
|
67302c5ee0 | ||
|
|
16677bb85a | ||
|
|
c13efbf8b0 | ||
|
|
73fe9a2acf | ||
|
|
b1ad5c8abc | ||
|
|
b41215bdea | ||
|
|
738b453c66 | ||
|
|
9c9d82f1a9 | ||
|
|
bae55eaa80 | ||
|
|
beb02a5b4b | ||
|
|
840855d401 | ||
|
|
c9d035bde3 | ||
|
|
128437cc76 | ||
|
|
e903ff8f86 | ||
|
|
21cf5a7e00 | ||
|
|
3338f6cb5b | ||
|
|
249d2a8030 | ||
|
|
dc85125737 | ||
|
|
11825afc3e | ||
|
|
99e194e7cc | ||
|
|
63c75a2384 | ||
|
|
0eb09ac0f2 | ||
|
|
f6952ceb82 | ||
|
|
237e984a52 | ||
|
|
41f29032d2 | ||
|
|
019bb37dd3 | ||
|
|
ca0662dba4 | ||
|
|
5aff66f391 | ||
|
|
6245362a52 | ||
|
|
2b7ebd93f2 | ||
|
|
b5495cd7da | ||
|
|
bec6b260b4 | ||
|
|
c51157d437 | ||
|
|
4e42bd055d | ||
|
|
f67273c579 | ||
|
|
5a497e9fb8 | ||
|
|
288ed1f920 | ||
|
|
852d4d618c | ||
|
|
42da600eb1 | ||
|
|
67fec32d27 | ||
|
|
ad22a1faf6 | ||
|
|
ef027c93d4 | ||
|
|
247bc3ad69 | ||
|
|
aa81b0db2c | ||
|
|
c2032dec6d | ||
|
|
f8c81ad788 | ||
|
|
488e124f6a | ||
|
|
f0a211a1df | ||
|
|
e5b88f1bdd | ||
|
|
7151b1a28a | ||
|
|
f75498d8e1 | ||
|
|
eda0d9ba10 | ||
|
|
15fe3038be | ||
|
|
9d1b576af6 | ||
|
|
2ad31feaaa | ||
|
|
2216a6f658 | ||
|
|
fa2ed6b8a2 | ||
|
|
4c9db15212 | ||
|
|
5e55bf1d53 | ||
|
|
e5de18cbf9 | ||
|
|
0f36b16733 | ||
|
|
7c6454246e | ||
|
|
a021b72c71 | ||
|
|
6b3416a2d7 | ||
|
|
17760bd2eb | ||
|
|
97f49c681b | ||
|
|
6fb66261ca | ||
|
|
3b7e390484 | ||
|
|
d08dfbd390 | ||
|
|
1b51f50ce0 | ||
|
|
4e09e180e4 | ||
|
|
f9dae1d526 | ||
|
|
84922d3317 | ||
|
|
9208588771 | ||
|
|
10ead8a9d7 | ||
|
|
5465d89380 | ||
|
|
d83294d313 | ||
|
|
19fc090354 | ||
|
|
dad727d41c | ||
|
|
f1594c39be | ||
|
|
d13b70f779 | ||
|
|
8b667e006a | ||
|
|
06542b2b59 | ||
|
|
8b6e962811 | ||
|
|
0ea0293356 | ||
|
|
c86628b41e | ||
|
|
f44c9dff3d | ||
|
|
9a41636988 | ||
|
|
b8e4543ff3 | ||
|
|
1ea3979864 | ||
|
|
0bbfcc2491 | ||
|
|
538c241951 | ||
|
|
4745adaeff | ||
|
|
0ad379708f | ||
|
|
978f336aa4 | ||
|
|
95f3fadcbd | ||
|
|
1dc4d2c621 | ||
|
|
5226327e11 | ||
|
|
7264a996fe | ||
|
|
1cb322e870 | ||
|
|
861a031132 | ||
|
|
a81ccff4f5 | ||
|
|
661f0f547b | ||
|
|
1e2e9e2b34 | ||
|
|
e9583d850a | ||
|
|
4f0ac15343 | ||
|
|
a5ddbaf1f8 | ||
|
|
04b412079a | ||
|
|
b1198c0f09 | ||
|
|
c7ce4b6b3d | ||
|
|
e09cf6978e | ||
|
|
7cf19c8e4a | ||
|
|
2a03d59623 | ||
|
|
588ee411ad | ||
|
|
b454fc50ed | ||
|
|
55ade04e11 | ||
|
|
f9ddfa28b8 | ||
|
|
dd3c56d783 | ||
|
|
1a1361c4b3 | ||
|
|
dd9392a58c | ||
|
|
1037398041 | ||
|
|
03f5ff20de | ||
|
|
dd99577691 | ||
|
|
101c6a05a9 | ||
|
|
12683da8f7 | ||
|
|
48c6b3b4f4 | ||
|
|
9e486139ca | ||
|
|
eddac4911f | ||
|
|
1b5dabac8b | ||
|
|
8705c59f8c | ||
|
|
4f6a55d689 | ||
|
|
046d004725 | ||
|
|
a67bf5fde4 | ||
|
|
558ffc24c2 | ||
|
|
25271fe781 | ||
|
|
83c66c9c2c | ||
|
|
d6809d050a | ||
|
|
307a1dc638 | ||
|
|
9a88a47d33 | ||
|
|
f1bae7f1ff | ||
|
|
ec829be39f | ||
|
|
1e0fe40560 | ||
|
|
db374a0a87 | ||
|
|
86bcd1c22c | ||
|
|
17aea12417 | ||
|
|
95d9b17f35 | ||
|
|
203dd8bf7a | ||
|
|
96e7ff73dd | ||
|
|
7c87684629 | ||
|
|
4943cc4c12 | ||
|
|
a31d5379a0 | ||
|
|
9138fc11cf | ||
|
|
a7d2138544 | ||
|
|
f1ad9051bd | ||
|
|
2f89505b54 | ||
|
|
a2bef8ca51 | ||
|
|
1454ba15ba | ||
|
|
0cc32eae62 | ||
|
|
448cdb0737 | ||
|
|
e2ec13c5d2 | ||
|
|
5c4fc16cd4 | ||
|
|
94c0c1542b | ||
|
|
5e1ae36b2f | ||
|
|
8f96966178 | ||
|
|
fbb4c61665 | ||
|
|
4ccf8609ab | ||
|
|
ed3f5a5db4 | ||
|
|
ecd84fac48 | ||
|
|
3c7a6581dc | ||
|
|
f9d77959a4 | ||
|
|
cd6023cd7f | ||
|
|
5bbf7ac102 | ||
|
|
ec163b1457 | ||
|
|
dcf55ec040 | ||
|
|
d6a1c9f209 | ||
|
|
02dba79cf2 | ||
|
|
1ab0ce6401 | ||
|
|
a5ef604ce5 | ||
|
|
f8fe097fc0 | ||
|
|
f25b5c056e | ||
|
|
ee4ed40815 | ||
|
|
2640ff5727 | ||
|
|
325297ea98 | ||
|
|
da2c37442b | ||
|
|
f4c24968ed | ||
|
|
4b5db54fa7 | ||
|
|
0b11e08f87 | ||
|
|
31698e718c | ||
|
|
f9ed513361 | ||
|
|
563a874f0f | ||
|
|
67303a151e | ||
|
|
b1f3f9d6a0 | ||
|
|
cfb6da9b55 | ||
|
|
1bfa58951c | ||
|
|
26680176ab | ||
|
|
c160d89156 | ||
|
|
855881f574 | ||
|
|
bc331b802c | ||
|
|
81c0d11551 | ||
|
|
af4e7d69c7 | ||
|
|
95a75fc925 | ||
|
|
34ad030645 | ||
|
|
b0831691ea | ||
|
|
711b423230 | ||
|
|
b72ca33a9d | ||
|
|
a2b84f1f28 | ||
|
|
d03ceb8b2c | ||
|
|
72d8deb606 | ||
|
|
cca8cd2b21 | ||
|
|
c6a78d76bd | ||
|
|
0c16058bc6 | ||
|
|
2a67436640 | ||
|
|
efc90c730e | ||
|
|
71d2b68da0 | ||
|
|
de5bfaab1f | ||
|
|
85700627aa | ||
|
|
f83c79b665 | ||
|
|
d39977878e | ||
|
|
324c74ad20 | ||
|
|
2e75a12d6e | ||
|
|
f2cb8f1270 | ||
|
|
3377271ef0 | ||
|
|
10e2684870 | ||
|
|
7c3864ba79 | ||
|
|
59eb3ef30e | ||
|
|
b609686133 | ||
|
|
a239f2e8b0 | ||
|
|
502a2bf625 | ||
|
|
65ba8901aa | ||
|
|
267d1793c6 | ||
|
|
1cecaf6d7e | ||
|
|
43673dafdc | ||
|
|
75e746f9ef | ||
|
|
02e8e6bd45 | ||
|
|
2d5fa78528 | ||
|
|
67e44e6a4e | ||
|
|
4b3ed75f7d | ||
|
|
7af52ba222 | ||
|
|
be7752183e | ||
|
|
2d3aee2132 | ||
|
|
6696aa2128 | ||
|
|
697ed544dd | ||
|
|
ee91f22086 | ||
|
|
30a52ab1f4 | ||
|
|
eecbaaf90a | ||
|
|
1c366eb75e | ||
|
|
760f9f55ea | ||
|
|
a54b43ad4f | ||
|
|
890891796a | ||
|
|
b016822f3b | ||
|
|
b46ef0eb87 | ||
|
|
e0f2492ce8 | ||
|
|
5f9b010b94 | ||
|
|
e95490c15e | ||
|
|
5addd8cbe6 | ||
|
|
a67e885531 | ||
|
|
9cc918b642 | ||
|
|
4ff9b07490 | ||
|
|
99a53112ec | ||
|
|
8c3caae33f | ||
|
|
db089f4b8a | ||
|
|
6af7d82c90 | ||
|
|
bf2cf23262 | ||
|
|
6210e7fb80 | ||
|
|
ab3d6a0b0a | ||
|
|
9bd037aafe | ||
|
|
fc1169279e | ||
|
|
e56f73c32b | ||
|
|
da69e09d63 | ||
|
|
047b6b7194 | ||
|
|
0cecf315fd | ||
|
|
d74e1b9ac9 | ||
|
|
4a281edc87 | ||
|
|
7712d41b5e | ||
|
|
13cbd22d17 | ||
|
|
37dac2a481 | ||
|
|
e2cc9f3afc | ||
|
|
bf19d89510 | ||
|
|
2147473131 | ||
|
|
ee6f886434 | ||
|
|
f77f6f3322 | ||
|
|
ebf9e9db42 | ||
|
|
7cf2adfec4 | ||
|
|
bdd64dc055 | ||
|
|
23cc1e9528 | ||
|
|
eb6ad3562e | ||
|
|
a7ec3ba53f | ||
|
|
7248c19037 | ||
|
|
94a3bd21e5 | ||
|
|
89d6d34bee | ||
|
|
7224f897d6 | ||
|
|
229b6fe17a | ||
|
|
206aa209ae | ||
|
|
554002028c | ||
|
|
e1e9dec1b2 | ||
|
|
854585e770 | ||
|
|
677941dc48 | ||
|
|
c5551e55ce | ||
|
|
c69e30d65a | ||
|
|
5510bef70a | ||
|
|
0185e323db | ||
|
|
e6c951a303 | ||
|
|
cdbc6f48bb | ||
|
|
1bbd3235db | ||
|
|
c4cdb33b32 | ||
|
|
3ee837564e | ||
|
|
dd143479fe | ||
|
|
778aa7ade0 | ||
|
|
338b5f6c2d | ||
|
|
9480e21506 | ||
|
|
722081a9ef | ||
|
|
b05224b059 | ||
|
|
e34467a375 | ||
|
|
50e5323e51 | ||
|
|
70384941fb | ||
|
|
74f011d24e | ||
|
|
bc17073a25 | ||
|
|
af5ecd77e3 | ||
|
|
f9e435df43 | ||
|
|
e044676584 | ||
|
|
92ddf14457 | ||
|
|
9bd408a58f | ||
|
|
8a9a3949dd | ||
|
|
1f5dea9eba | ||
|
|
5debed5ae2 | ||
|
|
5b8d67a0aa | ||
|
|
909873bc6f | ||
|
|
e64317f8e1 | ||
|
|
775dbccd58 | ||
|
|
f981fb08b3 | ||
|
|
1187d8fbae | ||
|
|
102aeffa6d | ||
|
|
01cfe1b595 | ||
|
|
5b13b72287 | ||
|
|
3ea03735cf | ||
|
|
9df54873e4 | ||
|
|
33655d556f | ||
|
|
78c44d31d3 | ||
|
|
98ca019c74 | ||
|
|
d9c2f40a5d | ||
|
|
6e86a5f413 | ||
|
|
0dca4827e1 | ||
|
|
8b30cf2386 | ||
|
|
5be1fb056b | ||
|
|
8fb339c7ab | ||
|
|
9e46137d1c | ||
|
|
10114eadf7 | ||
|
|
95d82e68df | ||
|
|
30a28a0c81 | ||
|
|
ea9081ae3b | ||
|
|
2064987e31 | ||
|
|
52ea721551 | ||
|
|
1ad25dfb81 | ||
|
|
e181ae84b8 | ||
|
|
691b976593 | ||
|
|
1bf656f25f | ||
|
|
f57778e71e | ||
|
|
ee189efbc4 | ||
|
|
da86813bf8 | ||
|
|
ba2e43111e | ||
|
|
357db76c62 | ||
|
|
00b4354f85 | ||
|
|
33d45e138f | ||
|
|
5ff328d21f | ||
|
|
634ebb593c | ||
|
|
97912acbee | ||
|
|
dd7e8e9414 | ||
|
|
2971446d58 | ||
|
|
b70f556231 | ||
|
|
fb18145c06 | ||
|
|
986e78a2ea | ||
|
|
74236fecfd | ||
|
|
0ca068f831 | ||
|
|
4812d7d8ee | ||
|
|
ccea63d1cc | ||
|
|
64324a5da0 | ||
|
|
4519fb53fc | ||
|
|
42f953eead | ||
|
|
5d539c8800 | ||
|
|
7937b5d9f1 | ||
|
|
eb9223c008 | ||
|
|
1c9f52038b | ||
|
|
26f1c08d75 | ||
|
|
d219565292 | ||
|
|
531c128954 | ||
|
|
0582d9cfd3 | ||
|
|
dc9cdbd1da | ||
|
|
c3862b18a0 | ||
|
|
7a193b82ff | ||
|
|
e7cf6051c4 | ||
|
|
647cd664b0 | ||
|
|
0c6b579db4 | ||
|
|
a19e5a197c | ||
|
|
a2e8d4974c | ||
|
|
a3902c2473 | ||
|
|
2bb72abf67 | ||
|
|
1d7ab22099 | ||
|
|
71c3cc8f09 | ||
|
|
b3630a3074 | ||
|
|
fb3ba7c4ec | ||
|
|
ce03f114f2 | ||
|
|
4b28471137 | ||
|
|
a6a940c680 | ||
|
|
22b326bb61 | ||
|
|
591c1a8584 | ||
|
|
143a600466 | ||
|
|
f2ab3af20a | ||
|
|
fa029fd787 | ||
|
|
0ad4846793 | ||
|
|
a866ed7378 | ||
|
|
d05191a010 | ||
|
|
afd99d3579 | ||
|
|
daddcbff3e | ||
|
|
81045779f6 | ||
|
|
28bc9c4525 | ||
|
|
6f7611b438 | ||
|
|
0790aaf011 | ||
|
|
a79a7aa5ca | ||
|
|
e235420aec | ||
|
|
260b587c9c | ||
|
|
e3fc081c5d | ||
|
|
fd7668bfb5 | ||
|
|
912d5a5c23 | ||
|
|
44ba5d253f | ||
|
|
21d0db8254 | ||
|
|
8c3a668d52 | ||
|
|
5bda3a001d | ||
|
|
d38efb1713 | ||
|
|
1f7e375c33 | ||
|
|
8c632417c4 | ||
|
|
3c99587b5d | ||
|
|
b2b4f397ff | ||
|
|
314b6abbe8 | ||
|
|
0388c05b2f | ||
|
|
76b6188ac4 | ||
|
|
da28cda1b9 | ||
|
|
8c0f0e9bdc | ||
|
|
3efb83946d | ||
|
|
da945c37ee | ||
|
|
0ce4707335 | ||
|
|
95f64a4d4d | ||
|
|
9e4b550c98 | ||
|
|
6e6487b461 | ||
|
|
ed7a417dcb | ||
|
|
adcd3a039e | ||
|
|
97ee5efb4b | ||
|
|
4c67e71c63 | ||
|
|
3e656f36b8 | ||
|
|
1ac2982265 | ||
|
|
2458f4e594 | ||
|
|
ff54f93741 | ||
|
|
afc7466dfd | ||
|
|
e5b2ca5d89 | ||
|
|
ee2ad441ca | ||
|
|
9d3c8122f1 | ||
|
|
9fa1b4f65f | ||
|
|
b25109fbbf | ||
|
|
df40ba521b | ||
|
|
3d591ef112 | ||
|
|
07b33586e2 | ||
|
|
28f30a1374 | ||
|
|
3ba2fe9e18 | ||
|
|
f6ae08c423 | ||
|
|
582a3a3193 | ||
|
|
fe026b3b2f | ||
|
|
e1a1432bd3 | ||
|
|
3a65fbfc13 | ||
|
|
3cf6db8b1a | ||
|
|
11d0f9e408 | ||
|
|
27fd3fdf81 | ||
|
|
012526241a | ||
|
|
8ff08e7c5e | ||
|
|
a770f0c3eb | ||
|
|
1d7b23845f | ||
|
|
6fbd8b0003 | ||
|
|
8874a06ba0 | ||
|
|
5d2acb1fe9 | ||
|
|
9b228c59d5 | ||
|
|
2cb9dac14c | ||
|
|
0e2f35ed88 | ||
|
|
9e7e65ca6e | ||
|
|
6dc3113edc | ||
|
|
36c79712a1 | ||
|
|
c9b918b70f | ||
|
|
ec4c1e5682 | ||
|
|
bc5d383b9d | ||
|
|
c0df9067dc | ||
|
|
09f9fd42b4 | ||
|
|
9b4ed66218 | ||
|
|
9b953829fb | ||
|
|
3f00801e9a | ||
|
|
d70ccc67dd | ||
|
|
6bd45f9503 | ||
|
|
5ccf7913b2 | ||
|
|
13a821e70b | ||
|
|
7bc85458cc | ||
|
|
488305d2b4 | ||
|
|
322a1e72f9 | ||
|
|
b3a65248f5 | ||
|
|
45cc254431 | ||
|
|
3e7b66fcee | ||
|
|
2ab8e75319 | ||
|
|
870c39fafe | ||
|
|
8d4487b0be | ||
|
|
0cb56312b9 | ||
|
|
3b495daccc | ||
|
|
ac0c937d2c | ||
|
|
f98b501b12 | ||
|
|
4c36ba89a2 | ||
|
|
e296bff85f |
10
INSTALL.in
10
INSTALL.in
@@ -18,12 +18,12 @@ GTK+ requires the following packages:
|
||||
Simple install procedure
|
||||
========================
|
||||
|
||||
% gzip -cd gtk+-@GTK_VERSION@.tar.gz | tar xvf - # unpack the sources
|
||||
% cd gtk+-@GTK_VERSION@ # change to the toplevel directory
|
||||
% ./configure # run the `configure' script
|
||||
% make # build GTK+
|
||||
% tar xf gtk+-@GTK_VERSION@.tar.xz # unpack the sources
|
||||
% cd gtk+-@GTK_VERSION@ # change to the toplevel directory
|
||||
% ./configure # run the `configure' script
|
||||
% make # build GTK+
|
||||
[ Become root if necessary ]
|
||||
% make install # install GTK+
|
||||
% make install # install GTK+
|
||||
|
||||
The Details
|
||||
===========
|
||||
|
||||
275
NEWS
275
NEWS
@@ -1,3 +1,278 @@
|
||||
Overview of Changes in GTK+ 3.7.2
|
||||
=================================
|
||||
|
||||
* Theming:
|
||||
- Improve touch text handle theming
|
||||
- Always draw background of menuitems
|
||||
|
||||
* Geometry management
|
||||
- Size groups now handle height-for-width
|
||||
- Fix corner cases in label size allocation
|
||||
|
||||
* Accessibility
|
||||
- Make entry icons accessible
|
||||
|
||||
* Filechooser
|
||||
- Don't add duplicate bookmarks
|
||||
- Remember sidebar width
|
||||
|
||||
* Wayland: Build against wayland-client 1.0
|
||||
|
||||
* Bugs fixed:
|
||||
524295 remember the file chooser side pane's position
|
||||
577806 gtk_file_chooser_add_shortcut_folder adds duplicates...
|
||||
677609 GtkSizeGroup regression in GTK+ 3.3.20
|
||||
683896 Clean up global resources when the display is closed
|
||||
686021 spinner animation should not be subject to enable-an...
|
||||
686347 Clickable icons are not accessible as children of te...
|
||||
687059 icon-theme: support loading symbolic GFileIcons from...
|
||||
687196 filesystemmodel: invalidate nodes on file remove
|
||||
687467 Commit "Implement proper cross-fades for gradients" ...
|
||||
687842 Support partially transparent widgets
|
||||
687872 Segfault when attempting to get character extents fo...
|
||||
687977 icon-theme: Add some preconditions for NULL arguments
|
||||
|
||||
* Translation updates:
|
||||
Assamese
|
||||
Brazilian Portuguese
|
||||
Estonian
|
||||
Galician
|
||||
German
|
||||
Greek
|
||||
Gujarati
|
||||
Indonesian
|
||||
Latvian
|
||||
Lithuanian
|
||||
Marathi
|
||||
Norwegian bokmål
|
||||
Serbian
|
||||
Slovenian
|
||||
Spanish
|
||||
Traditional Chinese
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.7.0
|
||||
=================================
|
||||
|
||||
* Add an "inverted" property to GtkLevelBar
|
||||
|
||||
* Support RTL flipping in GtkLevelBar
|
||||
|
||||
* Various memory leak fixes
|
||||
|
||||
* Wayland: Update for protocol changes
|
||||
|
||||
* Bugs fixed:
|
||||
684288 level-bar: add an "inverted" property like GtkProgr...
|
||||
684415 Fix drag-motion event handling
|
||||
684980 Improve the appearance of the dragged header
|
||||
686013 CSS: crash drawing a GtkEntry in gedit
|
||||
686152 Calls gdk_window_get_frame_extents with a potential...
|
||||
686209 memleak with "text-shadow" css
|
||||
686265 scrolledwindow: set GDK_EXPOSURE_MASK on the oversh...
|
||||
686280 GtkScrollbar and GtkScale rendering broken in gtk 3.6
|
||||
686366 Use named union for _GtkSymbolicColor in gtk/gtksym...
|
||||
|
||||
* Translation updates:
|
||||
Czech
|
||||
Estonian
|
||||
Galician
|
||||
Indonesian
|
||||
Lithuanian
|
||||
Serbian
|
||||
Slovak
|
||||
Slovenian
|
||||
Spanish
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.6.1
|
||||
=================================
|
||||
|
||||
* CSS:
|
||||
- huge refactoring to avoid computing wrong values
|
||||
- treeview: Invalidate children properly
|
||||
- treeview: Fix computing child paths
|
||||
|
||||
* Broadway:
|
||||
- use binary websockets when available
|
||||
|
||||
* Bugs fixed:
|
||||
646221 Imperfect Russian translation of 'Print preview'...
|
||||
682395 Nautilus tabs have black background
|
||||
684517 window: Delay showing auto mnemonics on focus in
|
||||
684639 GTK+ 3.5.18 makes Epiphany unusable
|
||||
684984 No focus rendering for Icon Views in SELECTION_N...
|
||||
685449 Non-uniform borders on GtkScrolledWindow break c...
|
||||
685996 trivial build fix: test uses = not ==
|
||||
Fix a multi-display problem in touch handle code
|
||||
App chooser: respect NoDisplay
|
||||
|
||||
* Translation updates:
|
||||
Catalan
|
||||
Catalan (Valencian)
|
||||
Italian
|
||||
Japanese
|
||||
Khmer
|
||||
Norwegian bokmål
|
||||
Russian
|
||||
Slovak
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.6.0
|
||||
=================================
|
||||
|
||||
* Add support for blur to CSS shadows
|
||||
|
||||
* Bugs fixed:
|
||||
679883 When printing Custom paper sizes GTK Print Dialog...
|
||||
684258 Crash when calling gtk_application_set_menubar twice
|
||||
684606 GtkMenuButton: implement rtl flipping
|
||||
684607 GtkSearchEntry: flip the clear icon in rtl
|
||||
Fix style context path for internal buttons
|
||||
|
||||
* Translation updates:
|
||||
Bengali
|
||||
Brazilian Portuguese
|
||||
Bulgarian
|
||||
Catalan
|
||||
Catalan (Valencian)
|
||||
Czech
|
||||
Galician
|
||||
German
|
||||
Gujarati
|
||||
Hebrew
|
||||
Hindi
|
||||
Kannada
|
||||
Kyrgyz
|
||||
Latvian
|
||||
Malayalam
|
||||
Punjabi
|
||||
Russian
|
||||
Serbian
|
||||
Telugu
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.5.18
|
||||
==================================
|
||||
|
||||
* GMenu:
|
||||
- Support namespaces for actions
|
||||
- Allow submenus to have actions for opening
|
||||
- New function: gtk_menu_shell_bind_model
|
||||
|
||||
* CSS:
|
||||
- Parse and support CSS animations
|
||||
- Support cross-fading and transitions
|
||||
|
||||
* OS X:
|
||||
- Adjust scrollbar and scale behavior according to platform
|
||||
|
||||
* Bugs fixed
|
||||
643611 Leak on gail_widget_get_description
|
||||
658694 GtkAssistant: Unable to change current page in prepare...
|
||||
670390 -GtkMenuBar-shadow-type: none disables background inst...
|
||||
671786 Glade XML files cannot set an ImageMenuItem accelerato...
|
||||
674108 Hard crash due to wrong NSAutoreleasePool stacking
|
||||
676890 GtkButton are still highlighted after removing them fr...
|
||||
677559 argument of Gdk.Keymap.map_virtual_modifiers is not co...
|
||||
680962 GtkMenuButton doesn't display accelerators when used w...
|
||||
682630 GMenuModel attribute for an action to toggle on submen...
|
||||
682831 gtkmodelmenu: expose API for action namespace
|
||||
683474 Print dialog lists custom paper sizes twice for "Print...
|
||||
683627 Memory leak in style_data_lookup
|
||||
683718 box: Fix typo
|
||||
683738 Simplify GtkApplicationWindow accel handling
|
||||
683874 Load settings.ini also from XDG_CONFIG_DIRS
|
||||
683896 Clean up global resources when the display is closed
|
||||
684038 togglebutton: always set PRELIGHT state when in_button...
|
||||
684076 clean up a11y on shutdown
|
||||
684096 GtkWidget:drag-data-received code sample refers to rem...
|
||||
684156 fontchooserwidget: scroll to the currently selected row
|
||||
|
||||
* Translation updates
|
||||
Arabic
|
||||
Assamese
|
||||
Belarusian
|
||||
Brazilian Portuguese
|
||||
British English
|
||||
Danish
|
||||
Finnish
|
||||
French
|
||||
Galician
|
||||
Greek
|
||||
Hebrew
|
||||
Hungarian
|
||||
Indonesian
|
||||
Korean
|
||||
Lithuanian
|
||||
Persian
|
||||
Polish
|
||||
Portuguese
|
||||
Punjabi
|
||||
Serbian
|
||||
Slovenian
|
||||
Thai
|
||||
Spanish
|
||||
Russian
|
||||
Traditional Chinese
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.5.16
|
||||
==================================
|
||||
|
||||
* Fix critical warnings on startup in nautilus
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.5.14
|
||||
==================================
|
||||
|
||||
* Input method support
|
||||
- Propagate input purpose and hints to individual IMs
|
||||
- Add a hint to suppress on-screen keyboards
|
||||
|
||||
* GtkEntry can now set Pango attributes for its text
|
||||
|
||||
* GtkEntry and GtkTextView show 'selection handles' when
|
||||
used with touch devices
|
||||
|
||||
* GtkSpinButton can be oriented vertically
|
||||
|
||||
* Bugs fixed
|
||||
645065 GtkFileChooserButton doesn't handle closing its dialo...
|
||||
661973 gtk+ reacts on F10 press incorrectly with xkeyboard-c...
|
||||
672046 Issues with widget state propagation
|
||||
672431 the alt+tab app switch makes mnemonics flash
|
||||
676787 Update printing demo to use new print setting
|
||||
679144 Gdk doesn't properly find the child area with alpha
|
||||
681617 radio button text isn't centered when draw indicator ...
|
||||
682129 Print Dialog / Improving "Print to file" option
|
||||
682291 GtkMenuButton .ui issues
|
||||
682552 Improve the layout of the mount operations dialog
|
||||
682662 GtkAspectFrame: vertical alignment should be top/bott...
|
||||
682724 Fix a typo in the the comments
|
||||
682825 Also compile gtkdbusgenerated.c on non-UNIX environme...
|
||||
682919 Crash in GTK+-3.x (3.0.x-3.5.12+) on Windows with CJK...
|
||||
683001 Make headings bold in message dialogs by default
|
||||
683168 Make spinbutton orientable
|
||||
|
||||
* Translation updates
|
||||
Assamese
|
||||
French
|
||||
Galician
|
||||
Greek
|
||||
Indonesian
|
||||
Japanese
|
||||
Kazakh
|
||||
Latvian
|
||||
Lithuanian
|
||||
Norwegian bokmål
|
||||
Persian
|
||||
Polish
|
||||
Punjabi
|
||||
Spanish
|
||||
Vietnamese
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.5.12
|
||||
==================================
|
||||
|
||||
|
||||
13
README.in
13
README.in
@@ -75,8 +75,17 @@ Patches should be in unified diff form. (The -up option to GNU diff.)
|
||||
Release notes for 3.6
|
||||
=====================
|
||||
|
||||
* Now follows the XDG Base Directory specification for user
|
||||
configuration and data files. In detail,
|
||||
* The accessibility bridge code that exports accessible objects
|
||||
on the bus is now used by default; atk-bridge has been converted
|
||||
into a library that GTK+ links against. To void the linking,
|
||||
pass --without-atk-bridge when configuring GTK+.
|
||||
|
||||
* GDK threading support has been deprecated. It is recommended to
|
||||
use g_idle_add(), g_main_context_invoke() and similar funtions
|
||||
to make all GTK+ calls from the main thread.
|
||||
|
||||
* GTK+ now follows the XDG Base Directory specification for
|
||||
user configuration and data files. In detail,
|
||||
* $XDG_CONFIG_HOME/gtk-3.0/custom-papers is the new location
|
||||
for $HOME/.gtk-custom-papers
|
||||
* $XDG_CONFIG_HOME/gtk-3.0/bookmarks is the new location
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<CopyDir>$(GlibEtcInstallRoot)</CopyDir>
|
||||
<DefDir>$(SolutionDir)$(Configuration)\$(Platform)\obj\$(ProjectName)</DefDir>
|
||||
<GtkApiVersion>3.0</GtkApiVersion>
|
||||
<GtkBinaryVersion>2.10.0</GtkBinaryVersion>
|
||||
<GtkBinaryVersion>3.0.0</GtkBinaryVersion>
|
||||
<GtkDummyPrefix>\"/dummy\"</GtkDummyPrefix>
|
||||
<GtkPrefixDefine>GTK_PREFIX="\"$(GtkDummyPrefix)\""</GtkPrefixDefine>
|
||||
<GdkDefines>GDK_COMPILATION;G_LOG_DOMAIN="\"Gdk\""</GdkDefines>
|
||||
@@ -18,24 +18,24 @@ mkdir $(CopyDir)\bin
|
||||
|
||||
copy $(Configuration)\$(Platform)\bin\*.dll $(CopyDir)\bin
|
||||
|
||||
copy $(Configuration)\$(Platform)\bin\*.exe $(CopyDir)\bin
|
||||
|
||||
mkdir $(CopyDir)\bin\gtk3-demo
|
||||
|
||||
copy $(Configuration)\$(Platform)\bin\*.exe $(CopyDir)\bin\gtk3-demo
|
||||
mkdir $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.c $(CopyDir)\bin\gtk3-demo
|
||||
copy ..\..\..\demos\gtk-demo\*.c $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.css $(CopyDir)\bin\gtk3-demo
|
||||
copy ..\..\..\demos\gtk-demo\*.css $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.h $(CopyDir)\bin\gtk3-demo
|
||||
copy ..\..\..\demos\gtk-demo\*.h $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.ui $(CopyDir)\bin\gtk3-demo
|
||||
copy ..\..\..\demos\gtk-demo\*.ui $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.jpg $(CopyDir)\bin\gtk3-demo
|
||||
copy ..\..\..\demos\gtk-demo\*.jpg $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.png $(CopyDir)\bin\gtk3-demo
|
||||
copy ..\..\..\demos\gtk-demo\*.png $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.gif $(CopyDir)\bin\gtk3-demo
|
||||
copy ..\..\..\demos\gtk-demo\*.gif $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
|
||||
mkdir $(CopyDir)\lib
|
||||
@@ -319,6 +319,8 @@ copy ..\..\..\gtk\gtklabel.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtklayout.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtklevelbar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtklinkbutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkliststore.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
@@ -331,6 +333,8 @@ copy ..\..\..\gtk\gtkmenu.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkmenubar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkmenubutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkmenuitem.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkmenushell.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
@@ -411,6 +415,8 @@ copy ..\..\..\gtk\gtkscrollbar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkscrolledwindow.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtksearchentry.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkselection.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkseparator.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
@@ -176,6 +176,8 @@
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_accordion.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_basics.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_multiplebgs.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_pixbufs.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_shadows.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\demo_resources.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\dialog.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\drawingarea.c" />
|
||||
|
||||
@@ -47,6 +47,12 @@
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_multiplebgs.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_pixbufs.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_shadows.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\demo_resources.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
|
||||
@@ -41,7 +41,7 @@ copy ..\..\..\gdk\gdkconfig.h.win32 ..\..\..\gdk\gdkconfig.h

|
||||
/>
|
||||
<UserMacro
|
||||
Name="GtkBinaryVersion"
|
||||
Value="2.10.0"
|
||||
Value="3.0.0"
|
||||
/>
|
||||
<UserMacro
|
||||
Name="GtkDummyPrefix"
|
||||
@@ -69,16 +69,17 @@ copy ..\..\..\gdk\gdkconfig.h.win32 ..\..\..\gdk\gdkconfig.h

|
||||
echo on

|
||||
mkdir $(CopyDir)\bin

|
||||
copy $(ConfigurationName)\$(PlatformName)\bin\*.dll $(CopyDir)\bin

|
||||
copy $(ConfigurationName)\$(PlatformName)\bin\*.exe $(CopyDir)\bin

|
||||
|
||||
mkdir $(CopyDir)\bin\gtk3-demo

|
||||
copy $(ConfigurationName)\$(PlatformName)\bin\*.exe $(CopyDir)\bin\gtk3-demo

|
||||
copy ..\..\..\demos\gtk-demo\*.c $(CopyDir)\bin\gtk3-demo

|
||||
copy ..\..\..\demos\gtk-demo\*.css $(CopyDir)\bin\gtk3-demo

|
||||
copy ..\..\..\demos\gtk-demo\*.h $(CopyDir)\bin\gtk3-demo

|
||||
copy ..\..\..\demos\gtk-demo\*.ui $(CopyDir)\bin\gtk3-demo

|
||||
copy ..\..\..\demos\gtk-demo\*.jpg $(CopyDir)\bin\gtk3-demo

|
||||
copy ..\..\..\demos\gtk-demo\*.png $(CopyDir)\bin\gtk3-demo

|
||||
copy ..\..\..\demos\gtk-demo\*.gif $(CopyDir)\bin\gtk3-demo

|
||||
mkdir $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.c $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
copy ..\..\..\demos\gtk-demo\*.css $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
copy ..\..\..\demos\gtk-demo\*.h $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
copy ..\..\..\demos\gtk-demo\*.ui $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
copy ..\..\..\demos\gtk-demo\*.jpg $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
copy ..\..\..\demos\gtk-demo\*.png $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
copy ..\..\..\demos\gtk-demo\*.gif $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
|
||||
mkdir $(CopyDir)\lib

|
||||
copy $(ConfigurationName)\$(PlatformName)\bin\*-$(GtkApiVersion).lib $(CopyDir)\lib

|
||||
@@ -222,12 +223,14 @@ copy ..\..\..\gtk\gtkinfobar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
copy ..\..\..\gtk\gtkinvisible.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtklabel.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtklayout.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtklevelbar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtklinkbutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkliststore.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtklockbutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkmain.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkmenu.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkmenubar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkmenubutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkmenuitem.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkmenushell.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkmenutoolbutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
@@ -268,6 +271,7 @@ copy ..\..\..\gtk\gtkscalebutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#
|
||||
copy ..\..\..\gtk\gtkscrollable.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkscrollbar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkscrolledwindow.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtksearchentry.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkselection.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkseparator.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkseparatormenuitem.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
|
||||
@@ -171,6 +171,8 @@
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\combobox.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_accordion.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_basics.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_pixbufs.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_shadows.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_multiplebgs.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\demo_resources.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\dialog.c" />
|
||||
|
||||
@@ -20,9 +20,6 @@
|
||||
/* Define the location where the catalogs will be installed */
|
||||
#define GTK_LOCALEDIR "NONE/share/locale"
|
||||
|
||||
/* Define if we're using atk-bridge-2.0 */
|
||||
/* #undef HAVE_ATK_BRIDGE */
|
||||
|
||||
/* Define to 1 if you have the `bind_textdomain_codeset' function. */
|
||||
#define HAVE_BIND_TEXTDOMAIN_CODESET 1
|
||||
|
||||
@@ -299,6 +296,11 @@
|
||||
/* Define to 1 if the X Window System is missing or not being used. */
|
||||
/* #undef X_DISPLAY_MISSING */
|
||||
|
||||
/* Enable large inode numbers on Mac OS X 10.5. */
|
||||
#ifndef _DARWIN_USE_64_BIT_INODE
|
||||
# define _DARWIN_USE_64_BIT_INODE 1
|
||||
#endif
|
||||
|
||||
/* Number of bits in a file offset, on hosts where this is settable. */
|
||||
/* #undef _FILE_OFFSET_BITS */
|
||||
|
||||
|
||||
30
configure.ac
30
configure.ac
@@ -9,8 +9,8 @@
|
||||
# set GTK_BINARY_AGE and GTK_INTERFACE_AGE to 0.
|
||||
|
||||
m4_define([gtk_major_version], [3])
|
||||
m4_define([gtk_minor_version], [5])
|
||||
m4_define([gtk_micro_version], [13])
|
||||
m4_define([gtk_minor_version], [7])
|
||||
m4_define([gtk_micro_version], [3])
|
||||
m4_define([gtk_interface_age], [0])
|
||||
m4_define([gtk_binary_age],
|
||||
[m4_eval(100 * gtk_minor_version + gtk_micro_version)])
|
||||
@@ -39,7 +39,7 @@ AC_CONFIG_AUX_DIR([build-aux])
|
||||
m4_define([gtk_binary_version], [3.0.0])
|
||||
|
||||
# required versions of other packages
|
||||
m4_define([glib_required_version], [2.33.1])
|
||||
m4_define([glib_required_version], [2.35.0])
|
||||
m4_define([pango_required_version], [1.30.0])
|
||||
m4_define([atk_required_version], [2.5.3])
|
||||
m4_define([cairo_required_version], [1.10.0])
|
||||
@@ -383,7 +383,7 @@ else
|
||||
fi
|
||||
AC_SUBST(DISABLE_ON_QUARTZ)
|
||||
|
||||
if test "x$enable_broadway_backend" == xyes; then
|
||||
if test "x$enable_broadway_backend" = xyes; then
|
||||
GDK_BACKENDS="$GDK_BACKENDS broadway"
|
||||
cairo_backends="$cairo_backends cairo"
|
||||
GDK_WINDOWING="$GDK_WINDOWING
|
||||
@@ -394,8 +394,8 @@ else
|
||||
AM_CONDITIONAL(USE_BROADWAY, false)
|
||||
fi
|
||||
|
||||
if test "x$enable_wayland_backend" == "xyes"; then
|
||||
if test "x$enable_wayland_cairo_gl" == "xyes"; then
|
||||
if test "x$enable_wayland_backend" = "xyes"; then
|
||||
if test "x$enable_wayland_cairo_gl" = "xyes"; then
|
||||
# Wayland can use cairo-gl
|
||||
cairo_backends="$cairo_backends cairo-gl"
|
||||
AC_DEFINE(GDK_WAYLAND_USE_EGL, [1], [Whether to use EGL in Wayland backend])
|
||||
@@ -407,8 +407,8 @@ if test "x$enable_wayland_backend" == "xyes"; then
|
||||
have_gio_unix=yes
|
||||
GDK_WINDOWING="$GDK_WINDOWING
|
||||
#define GDK_WINDOWING_WAYLAND"
|
||||
WAYLAND_PACKAGES="wayland-client xkbcommon wayland-cursor"
|
||||
if test "x$enable_wayland_cairo_gl" == "xyes"; then
|
||||
WAYLAND_PACKAGES="wayland-client >= 1.0.0 xkbcommon >= 0.2.0 wayland-cursor"
|
||||
if test "x$enable_wayland_cairo_gl" = "xyes"; then
|
||||
WAYLAND_PACKAGES="$WAYLAND_PACKAGES wayland-egl egl"
|
||||
fi
|
||||
AM_CONDITIONAL(USE_WAYLAND, true)
|
||||
@@ -714,7 +714,6 @@ AM_PATH_GLIB_2_0(glib_required_version, :,
|
||||
*** GLIB is always available from ftp://ftp.gtk.org/pub/gtk/.]),
|
||||
gobject gmodule-no-export)
|
||||
|
||||
dnl
|
||||
dnl Check for bind_textdomain_codeset, including -lintl if GLib brings it in.
|
||||
dnl
|
||||
gtk_save_LIBS=$LIBS
|
||||
@@ -748,6 +747,19 @@ else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
|
||||
#
|
||||
# Disable deprecation checks for all libraries we depend on on stable branches.
|
||||
# This is so newer versions of those libraries don't cause more warnings with
|
||||
# a stable GTK version.
|
||||
# We don't ever want to turn off deprecation warnings for master however, because
|
||||
# that's where we get rid of deprecated API we use.
|
||||
#
|
||||
if test m4_eval(gtk_minor_version % 2) = 0 ; then
|
||||
AC_DEFINE_UNQUOTED(GLIB_DISABLE_DEPRECATION_WARNINGS, 1,
|
||||
[Disable deprecation warnings from glib])
|
||||
fi
|
||||
|
||||
dnl
|
||||
saved_cflags="$CFLAGS"
|
||||
saved_ldflags="$LDFLAGS"
|
||||
|
||||
|
||||
@@ -18,6 +18,8 @@ demos = \
|
||||
css_accordion.c \
|
||||
css_basics.c \
|
||||
css_multiplebgs.c \
|
||||
css_pixbufs.c \
|
||||
css_shadows.c \
|
||||
dialog.c \
|
||||
drawingarea.c \
|
||||
editable_cells.c \
|
||||
@@ -118,6 +120,8 @@ RESOURCES= application.ui \
|
||||
css_accordion.css \
|
||||
css_basics.css \
|
||||
css_multiplebgs.css \
|
||||
css_pixbufs.css \
|
||||
css_shadows.css \
|
||||
cssview.css \
|
||||
fancy.css \
|
||||
reset.css
|
||||
|
||||
@@ -61,6 +61,7 @@ do_css_accordion (GtkWidget *do_widget)
|
||||
data = g_bytes_get_data (bytes, &data_size);
|
||||
|
||||
gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider), (gchar *)data, data_size, NULL);
|
||||
g_bytes_unref (bytes);
|
||||
|
||||
apply_css (window, provider);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
@import url("reset.css");
|
||||
@import url("resource:///reset.css");
|
||||
|
||||
* {
|
||||
transition-property: color, background-color, border-color, background-image, padding, border-width;
|
||||
@@ -49,4 +49,4 @@ GtkWindow {
|
||||
.button:hover:active,
|
||||
.button:active {
|
||||
background-color: #993401;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,6 +100,7 @@ do_css_basics (GtkWidget *do_widget)
|
||||
|
||||
bytes = g_resources_lookup_data ("/css_basics/gtk.css", 0, NULL);
|
||||
gtk_text_buffer_set_text (text, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes));
|
||||
g_bytes_unref (bytes);
|
||||
|
||||
g_signal_connect (provider,
|
||||
"parsing-error",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
/* This CSS resets all properties to their defaults values
|
||||
* and overrides all user settings and the theme in use */
|
||||
@import url("reset.css");
|
||||
@import url("resource:///reset.css");
|
||||
|
||||
/* Set a very futuristic style by default */
|
||||
* {
|
||||
|
||||
@@ -149,6 +149,7 @@ do_css_multiplebgs (GtkWidget *do_widget)
|
||||
|
||||
bytes = g_resources_lookup_data ("/css_multiplebgs/gtk.css", 0, NULL);
|
||||
gtk_text_buffer_set_text (text, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes));
|
||||
g_bytes_unref (bytes);
|
||||
|
||||
g_signal_connect (provider,
|
||||
"parsing-error",
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
|
||||
/* This CSS resets all properties to their defaults values
|
||||
* and overrides all user settings and the theme in use */
|
||||
@import url("reset.css");
|
||||
@import url("cssview.css");
|
||||
@import url("resource:///reset.css");
|
||||
@import url("resource:///cssview.css");
|
||||
|
||||
#canvas {
|
||||
transition-property: background-color, background-image;
|
||||
@@ -56,7 +56,7 @@
|
||||
/*
|
||||
#bricks-button {
|
||||
background-color: #eef;
|
||||
background-image: url('brick.png');
|
||||
background-image: url('resource:///css_multiplebgs/brick.png');
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
}
|
||||
@@ -133,4 +133,4 @@
|
||||
background-image: linear-gradient(90deg, transparent 79px, alpha(#999, 0.40) 79px, #999 80px, alpha(#999, 0.40) 81px, transparent 81px),
|
||||
linear-gradient(alpha(#bbb, 0.60), alpha(#bbb, 0.60) 1px, transparent 1px);
|
||||
}
|
||||
*/
|
||||
*/
|
||||
|
||||
127
demos/gtk-demo/css_pixbufs.c
Normal file
127
demos/gtk-demo/css_pixbufs.c
Normal file
@@ -0,0 +1,127 @@
|
||||
/* CSS Theming/Animated backgrounds
|
||||
*
|
||||
* This demo is done in honour of the Pixbufs demo further down. It is done exclusively
|
||||
* with CSS as the background of the window.
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
static GtkWidget *window = NULL;
|
||||
|
||||
static void
|
||||
show_parsing_error (GtkCssProvider *provider,
|
||||
GtkCssSection *section,
|
||||
const GError *error,
|
||||
GtkTextBuffer *buffer)
|
||||
{
|
||||
GtkTextIter start, end;
|
||||
const char *tag_name;
|
||||
|
||||
gtk_text_buffer_get_iter_at_line_index (buffer,
|
||||
&start,
|
||||
gtk_css_section_get_start_line (section),
|
||||
gtk_css_section_get_start_position (section));
|
||||
gtk_text_buffer_get_iter_at_line_index (buffer,
|
||||
&end,
|
||||
gtk_css_section_get_end_line (section),
|
||||
gtk_css_section_get_end_position (section));
|
||||
|
||||
if (g_error_matches (error, GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR_DEPRECATED))
|
||||
tag_name = "warning";
|
||||
else
|
||||
tag_name = "error";
|
||||
|
||||
gtk_text_buffer_apply_tag_by_name (buffer, tag_name, &start, &end);
|
||||
}
|
||||
|
||||
static void
|
||||
css_text_changed (GtkTextBuffer *buffer,
|
||||
GtkCssProvider *provider)
|
||||
{
|
||||
GtkTextIter start, end;
|
||||
char *text;
|
||||
|
||||
gtk_text_buffer_get_start_iter (buffer, &start);
|
||||
gtk_text_buffer_get_end_iter (buffer, &end);
|
||||
gtk_text_buffer_remove_all_tags (buffer, &start, &end);
|
||||
|
||||
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
|
||||
gtk_css_provider_load_from_data (provider, text, -1, NULL);
|
||||
g_free (text);
|
||||
|
||||
gtk_style_context_reset_widgets (gdk_screen_get_default ());
|
||||
}
|
||||
|
||||
static void
|
||||
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
||||
{
|
||||
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
||||
if (GTK_IS_CONTAINER (widget))
|
||||
gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
do_css_pixbufs (GtkWidget *do_widget)
|
||||
{
|
||||
if (!window)
|
||||
{
|
||||
GtkWidget *paned, *container, *child;
|
||||
GtkStyleProvider *provider;
|
||||
GtkTextBuffer *text;
|
||||
GBytes *bytes;
|
||||
|
||||
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
||||
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
|
||||
g_signal_connect (window, "destroy",
|
||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
||||
|
||||
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
|
||||
gtk_container_add (GTK_CONTAINER (window), paned);
|
||||
|
||||
/* Need a filler so we get a handle */
|
||||
child = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
gtk_container_add (GTK_CONTAINER (paned), child);
|
||||
|
||||
text = gtk_text_buffer_new (NULL);
|
||||
gtk_text_buffer_create_tag (text,
|
||||
"warning",
|
||||
"underline", PANGO_UNDERLINE_SINGLE,
|
||||
NULL);
|
||||
gtk_text_buffer_create_tag (text,
|
||||
"error",
|
||||
"underline", PANGO_UNDERLINE_ERROR,
|
||||
NULL);
|
||||
|
||||
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
||||
|
||||
container = gtk_scrolled_window_new (NULL, NULL);
|
||||
gtk_container_add (GTK_CONTAINER (paned), container);
|
||||
child = gtk_text_view_new_with_buffer (text);
|
||||
gtk_container_add (GTK_CONTAINER (container), child);
|
||||
g_signal_connect (text,
|
||||
"changed",
|
||||
G_CALLBACK (css_text_changed),
|
||||
provider);
|
||||
|
||||
bytes = g_resources_lookup_data ("/css_pixbufs/gtk.css", 0, NULL);
|
||||
gtk_text_buffer_set_text (text, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes));
|
||||
|
||||
g_signal_connect (provider,
|
||||
"parsing-error",
|
||||
G_CALLBACK (show_parsing_error),
|
||||
gtk_text_view_get_buffer (GTK_TEXT_VIEW (child)));
|
||||
|
||||
apply_css (window, provider);
|
||||
}
|
||||
|
||||
if (!gtk_widget_get_visible (window))
|
||||
gtk_widget_show_all (window);
|
||||
else
|
||||
{
|
||||
gtk_widget_destroy (window);
|
||||
window = NULL;
|
||||
}
|
||||
|
||||
return window;
|
||||
}
|
||||
@@ -6,8 +6,8 @@
|
||||
|
||||
/* This CSS resets all properties to their defaults values
|
||||
* and overrides all user settings and the theme in use */
|
||||
@import url("reset.css");
|
||||
@import url("cssview.css");
|
||||
@import url("resource:///reset.css");
|
||||
@import url("resource:///cssview.css");
|
||||
|
||||
@keyframes move-the-image {
|
||||
0% { background-position: 50.00% 75.00%, 67.68% 67.68%, 75.00% 50.00%, 67.68% 32.32%, 50.00% 25.00%, 32.32% 32.32%, 25.00% 50.00%, 32.32% 67.68%, 0% 0%; }
|
||||
@@ -46,21 +46,31 @@
|
||||
}
|
||||
|
||||
@keyframes size-the-image {
|
||||
0% { background-size: 96px, 12px, 96px, 12px, 96px, 12px, 96px, 12px, 100% }
|
||||
100% { background-size: 12px, 96px, 12px, 96px, 12px, 96px, 12px, 96px, 100% }
|
||||
0% { background-size: 96px, 12px, 96px, 12px, 96px, 12px, 96px, 12px, auto }
|
||||
100% { background-size: 12px, 96px, 12px, 96px, 12px, 96px, 12px, 96px, auto }
|
||||
}
|
||||
|
||||
GtkWindow {
|
||||
background-image: url("apple-red.png"),
|
||||
url("gnome-applets.png"),
|
||||
url("gnome-calendar.png"),
|
||||
url("gnome-foot.png"),
|
||||
url("gnome-gmush.png"),
|
||||
url("gnome-gimp.png"),
|
||||
url("gnome-gsame.png"),
|
||||
url("gnu-keys.png"),
|
||||
url("background.jpg");
|
||||
background-image: url("resource:///css_pixbufs/apple-red.png"),
|
||||
url("resource:///css_pixbufs/gnome-applets.png"),
|
||||
url("resource:///css_pixbufs/gnome-calendar.png"),
|
||||
url("resource:///css_pixbufs/gnome-foot.png"),
|
||||
url("resource:///css_pixbufs/gnome-gmush.png"),
|
||||
url("resource:///css_pixbufs/gnome-gimp.png"),
|
||||
url("resource:///css_pixbufs/gnome-gsame.png"),
|
||||
url("resource:///css_pixbufs/gnu-keys.png"),
|
||||
url("resource:///css_pixbufs/background.jpg");
|
||||
background-position: 50.00% 75.00%, 67.68% 67.68%, 75.00% 50.00%, 67.68% 32.32%, 50.00% 25.00%, 32.32% 32.32%, 25.00% 50.00%, 32.32% 67.68%, 0% 0%;
|
||||
background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, repeat;
|
||||
animation: move-the-image infinite linear 3s, size-the-image infinite alternate ease-in-out 0.75s;
|
||||
}
|
||||
|
||||
/* Make the text editor has a nice style */
|
||||
.view, .scrollbar, .pane-separator {
|
||||
color: black;
|
||||
background-color: rgba(255,255,255,0.5);
|
||||
}
|
||||
|
||||
.view:selected {
|
||||
background-color: rgba(127,127,255,0.5);
|
||||
}
|
||||
|
||||
147
demos/gtk-demo/css_shadows.c
Normal file
147
demos/gtk-demo/css_shadows.c
Normal file
@@ -0,0 +1,147 @@
|
||||
/* CSS Theming/Shadows
|
||||
*
|
||||
* This demo shows how to use CSS shadows.
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
static GtkWidget *window = NULL;
|
||||
|
||||
static void
|
||||
show_parsing_error (GtkCssProvider *provider,
|
||||
GtkCssSection *section,
|
||||
const GError *error,
|
||||
GtkTextBuffer *buffer)
|
||||
{
|
||||
GtkTextIter start, end;
|
||||
const char *tag_name;
|
||||
|
||||
gtk_text_buffer_get_iter_at_line_index (buffer,
|
||||
&start,
|
||||
gtk_css_section_get_start_line (section),
|
||||
gtk_css_section_get_start_position (section));
|
||||
gtk_text_buffer_get_iter_at_line_index (buffer,
|
||||
&end,
|
||||
gtk_css_section_get_end_line (section),
|
||||
gtk_css_section_get_end_position (section));
|
||||
|
||||
if (g_error_matches (error, GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR_DEPRECATED))
|
||||
tag_name = "warning";
|
||||
else
|
||||
tag_name = "error";
|
||||
|
||||
gtk_text_buffer_apply_tag_by_name (buffer, tag_name, &start, &end);
|
||||
}
|
||||
|
||||
static void
|
||||
css_text_changed (GtkTextBuffer *buffer,
|
||||
GtkCssProvider *provider)
|
||||
{
|
||||
GtkTextIter start, end;
|
||||
char *text;
|
||||
|
||||
gtk_text_buffer_get_start_iter (buffer, &start);
|
||||
gtk_text_buffer_get_end_iter (buffer, &end);
|
||||
gtk_text_buffer_remove_all_tags (buffer, &start, &end);
|
||||
|
||||
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
|
||||
gtk_css_provider_load_from_data (provider, text, -1, NULL);
|
||||
g_free (text);
|
||||
|
||||
gtk_style_context_reset_widgets (gdk_screen_get_default ());
|
||||
}
|
||||
|
||||
static void
|
||||
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
||||
{
|
||||
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
||||
if (GTK_IS_CONTAINER (widget))
|
||||
gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
create_toolbar (void)
|
||||
{
|
||||
GtkWidget *toolbar;
|
||||
GtkToolItem *item;
|
||||
|
||||
toolbar = gtk_toolbar_new ();
|
||||
gtk_widget_set_valign (toolbar, GTK_ALIGN_CENTER);
|
||||
|
||||
item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_FORWARD);
|
||||
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
|
||||
|
||||
item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_BACK);
|
||||
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
|
||||
|
||||
item = gtk_tool_button_new (NULL, "Hello World");
|
||||
gtk_tool_item_set_is_important (item, TRUE);
|
||||
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
|
||||
|
||||
return toolbar;
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
do_css_shadows (GtkWidget *do_widget)
|
||||
{
|
||||
if (!window)
|
||||
{
|
||||
GtkWidget *paned, *container, *child;
|
||||
GtkStyleProvider *provider;
|
||||
GtkTextBuffer *text;
|
||||
GBytes *bytes;
|
||||
|
||||
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
||||
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
|
||||
g_signal_connect (window, "destroy",
|
||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
||||
|
||||
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
|
||||
gtk_container_add (GTK_CONTAINER (window), paned);
|
||||
|
||||
child = create_toolbar ();
|
||||
gtk_container_add (GTK_CONTAINER (paned), child);
|
||||
|
||||
text = gtk_text_buffer_new (NULL);
|
||||
gtk_text_buffer_create_tag (text,
|
||||
"warning",
|
||||
"underline", PANGO_UNDERLINE_SINGLE,
|
||||
NULL);
|
||||
gtk_text_buffer_create_tag (text,
|
||||
"error",
|
||||
"underline", PANGO_UNDERLINE_ERROR,
|
||||
NULL);
|
||||
|
||||
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
||||
|
||||
container = gtk_scrolled_window_new (NULL, NULL);
|
||||
gtk_container_add (GTK_CONTAINER (paned), container);
|
||||
child = gtk_text_view_new_with_buffer (text);
|
||||
gtk_container_add (GTK_CONTAINER (container), child);
|
||||
g_signal_connect (text,
|
||||
"changed",
|
||||
G_CALLBACK (css_text_changed),
|
||||
provider);
|
||||
|
||||
bytes = g_resources_lookup_data ("/css_shadows/gtk.css", 0, NULL);
|
||||
gtk_text_buffer_set_text (text, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes));
|
||||
|
||||
g_signal_connect (provider,
|
||||
"parsing-error",
|
||||
G_CALLBACK (show_parsing_error),
|
||||
gtk_text_view_get_buffer (GTK_TEXT_VIEW (child)));
|
||||
|
||||
apply_css (window, provider);
|
||||
}
|
||||
|
||||
if (!gtk_widget_get_visible (window))
|
||||
gtk_widget_show_all (window);
|
||||
else
|
||||
{
|
||||
gtk_widget_destroy (window);
|
||||
window = NULL;
|
||||
}
|
||||
|
||||
return window;
|
||||
}
|
||||
44
demos/gtk-demo/css_shadows.css
Normal file
44
demos/gtk-demo/css_shadows.css
Normal file
@@ -0,0 +1,44 @@
|
||||
/* You can edit the text in this window to change the
|
||||
* appearance of this Window.
|
||||
* Be careful, if you screw it up, nothing might be visible
|
||||
* anymore. :)
|
||||
*/
|
||||
|
||||
/* This CSS resets all properties to their defaults values
|
||||
* and overrides all user settings and the theme in use */
|
||||
@import url("resource:///reset.css");
|
||||
@import url("resource:///cssview.css");
|
||||
|
||||
/* Get a nice background for the window */
|
||||
.background {
|
||||
background-color: #4870bc;
|
||||
background-image: linear-gradient(to left, transparent, rgba(255,255,255,.07) 50%, transparent 50%),
|
||||
linear-gradient(to left, transparent, rgba(255,255,255,.13) 50%, transparent 50%),
|
||||
linear-gradient(to left, transparent, transparent 50%, rgba(255,255,255,.17) 50%),
|
||||
linear-gradient(to left, transparent, transparent 50%, rgba(255,255,255,.19) 50%);
|
||||
background-size: 29px, 59px, 73px, 109px;
|
||||
}
|
||||
|
||||
.button {
|
||||
color: black;
|
||||
padding: 10px;
|
||||
border-radius: 5px;
|
||||
transition: all 250ms ease-in;
|
||||
border: 1px transparent solid;
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
text-shadow: 3px 3px 5px alpha(black, 0.75);
|
||||
icon-shadow: 3px 3px 5px alpha(black, 0.75);
|
||||
box-shadow: 3px 3px 5px alpha(black, 0.5) inset;
|
||||
border: solid 1px alpha(black, 0.75);
|
||||
}
|
||||
|
||||
.button:active {
|
||||
padding: 11px 9px 9px 11px;
|
||||
text-shadow: 1px 1px 2.5px alpha(black, 0.6);
|
||||
icon-shadow: 1px 1px 2.5px alpha(black, 0.6);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
</gresource>
|
||||
<gresource prefix="/css_multiplebgs">
|
||||
<file alias="gtk.css">css_multiplebgs.css</file>
|
||||
<file>brick.png</file>
|
||||
</gresource>
|
||||
<gresource prefix="/theming_custom_css">
|
||||
<file alias="gtk.css">fancy.css</file>
|
||||
@@ -27,4 +28,19 @@
|
||||
<gresource prefix="/theming_style_classes">
|
||||
<file preprocess="xml-stripblanks">theming.ui</file>
|
||||
</gresource>
|
||||
<gresource prefix="/css_pixbufs">
|
||||
<file alias="gtk.css">css_pixbufs.css</file>
|
||||
<file>background.jpg</file>
|
||||
<file>apple-red.png</file>
|
||||
<file>gnome-applets.png</file>
|
||||
<file>gnome-calendar.png</file>
|
||||
<file>gnome-foot.png</file>
|
||||
<file>gnome-gmush.png</file>
|
||||
<file>gnome-gimp.png</file>
|
||||
<file>gnome-gsame.png</file>
|
||||
<file>gnu-keys.png</file>
|
||||
</gresource>
|
||||
<gresource prefix="/css_shadows">
|
||||
<file alias="gtk.css">css_shadows.css</file>
|
||||
</gresource>
|
||||
</gresources>
|
||||
|
||||
@@ -1,24 +1,65 @@
|
||||
GtkButton#fancy {
|
||||
font-weight: bold;
|
||||
background-image: linear-gradient(135deg, yellow, blue);
|
||||
border-radius: 20px;
|
||||
color: white;
|
||||
transition: none;
|
||||
background-image: linear-gradient(to bottom,
|
||||
alpha(white, 0.7),
|
||||
alpha(white, 0) 30%),
|
||||
linear-gradient(to top,
|
||||
alpha(#babdb6, 0.4),
|
||||
alpha(#babdb6, 0) 50%),
|
||||
linear-gradient(135deg,
|
||||
#eeeeec,
|
||||
white 20%,
|
||||
#d3d7cf,
|
||||
white 80%,
|
||||
#babdb6);
|
||||
color: #3465a4;
|
||||
font-weight: bold;
|
||||
text-shadow: 0 1px white;
|
||||
}
|
||||
|
||||
GtkButton#fancy:hover {
|
||||
font-weight: bold;
|
||||
background-image: linear-gradient(135deg, blue, yellow);
|
||||
border-radius: 20px;
|
||||
color: white;
|
||||
transition: all 250ms linear;
|
||||
background-image: linear-gradient(to bottom,
|
||||
alpha(white, 1),
|
||||
alpha(white, 0)),
|
||||
linear-gradient(135deg,
|
||||
#eeeeec 10%,
|
||||
white 40%,
|
||||
#d3d7cf,
|
||||
white 70%,
|
||||
#babdb6);
|
||||
color: #204a87;
|
||||
}
|
||||
|
||||
GtkButton#fancy:active {
|
||||
font-weight: bold;
|
||||
background-image: linear-gradient(yellow, yellow);
|
||||
border-radius: 20px;
|
||||
color: black;
|
||||
GtkButton#fancy:active,
|
||||
GtkButton#fancy:active:hover {
|
||||
transition: none;
|
||||
background-image: linear-gradient(to bottom,
|
||||
alpha(#555753, 0.5),
|
||||
alpha(#babdb6, 0.3)),
|
||||
linear-gradient(135deg,
|
||||
#eeeeec,
|
||||
white 20%,
|
||||
#d3d7cf,
|
||||
white 80%,
|
||||
#babdb6);
|
||||
color: white;
|
||||
text-shadow: 0 1px black;
|
||||
}
|
||||
|
||||
GtkButton#fancy:backdrop,
|
||||
GtkButton#fancy:backdrop:hover {
|
||||
transition: none;
|
||||
background-image: linear-gradient(135deg,
|
||||
alpha(#eeeeec, 0.5) 10%,
|
||||
alpha(white, 0.5) 40%,
|
||||
alpha(#d3d7cf, 0.5),
|
||||
alpha(white, 0.5) 70%,
|
||||
alpha(#babdb6, 0.5));
|
||||
color: #babdb6;
|
||||
}
|
||||
|
||||
GtkButton#fancy * {
|
||||
color: inherit;
|
||||
/* Yeah this should be inherited by default */
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
@@ -579,10 +579,7 @@ load_file (const gchar *filename)
|
||||
}
|
||||
|
||||
if (current_file && !strcmp (current_file, names[0]))
|
||||
{
|
||||
g_string_free (buffer, TRUE);
|
||||
return;
|
||||
}
|
||||
goto out;
|
||||
|
||||
g_free (current_file);
|
||||
current_file = g_strdup (names[0]);
|
||||
@@ -598,7 +595,7 @@ load_file (const gchar *filename)
|
||||
{
|
||||
g_warning ("%s", err->message);
|
||||
g_error_free (err);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
|
||||
file = g_fopen (full_filename, "r");
|
||||
@@ -609,7 +606,7 @@ load_file (const gchar *filename)
|
||||
g_free (full_filename);
|
||||
|
||||
if (!file)
|
||||
return;
|
||||
goto out;
|
||||
|
||||
gtk_text_buffer_get_iter_at_offset (info_buffer, &start, 0);
|
||||
while (read_line (file, buffer))
|
||||
@@ -725,6 +722,7 @@ load_file (const gchar *filename)
|
||||
|
||||
fontify ();
|
||||
|
||||
out:
|
||||
g_string_free (buffer, TRUE);
|
||||
|
||||
g_strfreev (names);
|
||||
|
||||
@@ -149,8 +149,6 @@ do_printing (GtkWidget *do_widget)
|
||||
GtkPrintOperation *operation;
|
||||
GtkPrintSettings *settings;
|
||||
PrintData *data;
|
||||
gchar *uri, *ext;
|
||||
const gchar *dir;
|
||||
GError *error = NULL;
|
||||
|
||||
operation = gtk_print_operation_new ();
|
||||
@@ -170,25 +168,14 @@ do_printing (GtkWidget *do_widget)
|
||||
gtk_print_operation_set_embed_page_setup (operation, TRUE);
|
||||
|
||||
settings = gtk_print_settings_new ();
|
||||
dir = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
|
||||
if (dir == NULL)
|
||||
dir = g_get_home_dir ();
|
||||
if (g_strcmp0 (gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT), "ps") == 0)
|
||||
ext = ".ps";
|
||||
else if (g_strcmp0 (gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT), "svg") == 0)
|
||||
ext = ".svg";
|
||||
else
|
||||
ext = ".pdf";
|
||||
|
||||
uri = g_strconcat ("file://", dir, "/", "gtk-demo", ext, NULL);
|
||||
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_OUTPUT_URI, uri);
|
||||
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_OUTPUT_BASENAME, "gtk-demo");
|
||||
gtk_print_operation_set_print_settings (operation, settings);
|
||||
|
||||
gtk_print_operation_run (operation, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, GTK_WINDOW (do_widget), &error);
|
||||
|
||||
g_object_unref (operation);
|
||||
g_object_unref (settings);
|
||||
g_free (uri);
|
||||
|
||||
if (error)
|
||||
{
|
||||
|
||||
@@ -65,12 +65,26 @@ show_about (GtkMenuItem *item, GtkWidget *window)
|
||||
g_object_unref (pixbuf);
|
||||
}
|
||||
|
||||
static void
|
||||
on_page_toggled (GtkToggleButton *button,
|
||||
GtkNotebook *pages)
|
||||
{
|
||||
gint page;
|
||||
|
||||
if (!gtk_toggle_button_get_active (button))
|
||||
return;
|
||||
|
||||
page = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (button), "page"));
|
||||
gtk_notebook_set_current_page (pages, page);
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
GtkBuilder *builder;
|
||||
GtkWidget *window;
|
||||
GtkWidget *widget;
|
||||
GtkWidget *notebook;
|
||||
gboolean dark = FALSE;
|
||||
|
||||
gtk_init (&argc, &argv);
|
||||
@@ -88,6 +102,15 @@ main (int argc, char *argv[])
|
||||
g_signal_connect (widget, "toggled", G_CALLBACK (dark_toggled), NULL);
|
||||
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (widget), dark);
|
||||
|
||||
notebook = (GtkWidget*) gtk_builder_get_object (builder, "toplevel_notebook");
|
||||
widget = (GtkWidget*) gtk_builder_get_object (builder, "togglepage1");
|
||||
g_object_set_data (G_OBJECT (widget), "page", GINT_TO_POINTER (0));
|
||||
g_signal_connect (widget, "toggled", G_CALLBACK (on_page_toggled), notebook);
|
||||
|
||||
widget = (GtkWidget*) gtk_builder_get_object (builder, "togglepage2");
|
||||
g_object_set_data (G_OBJECT (widget), "page", GINT_TO_POINTER (1));
|
||||
g_signal_connect (widget, "toggled", G_CALLBACK (on_page_toggled), notebook);
|
||||
|
||||
widget = (GtkWidget*) gtk_builder_get_object (builder, "aboutmenuitem");
|
||||
g_signal_connect (widget, "activate", G_CALLBACK (show_about), window);
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -89,25 +89,20 @@ Make sure that gtk-doc is the latest released version.
|
||||
it to download.gnome.org. If you don't have an account on master.gnome.org,
|
||||
find someone who can do it for you. The command for this looks like
|
||||
|
||||
scp gtk+-2.12.10.tar.gz matthiasc@master.gnome.org:
|
||||
ssh matthiasc@master.gnome.org
|
||||
install-module gtk+-2.12.10.tar.gz
|
||||
scp gtk+-2.12.10.tar.xz matthiasc@master.gnome.org:
|
||||
ssh matthiasc@master.gnome.org ftpadmin install gtk+-2.12.10.tar.xz
|
||||
|
||||
15) Get the .bz2 tarball and the .md5sum files back from master.gnome.org
|
||||
You can probably also create it locally, but I've experienced md5
|
||||
mismatches when doing so.
|
||||
15) Upload the tarball and checksum to ftp.gtk.org and put them in the right
|
||||
directory below /ftp/pub. Pay attention to correct ownership, and don't
|
||||
forget to update the LATEST file in the directory.
|
||||
|
||||
16) Upload the .gz and .bz2 tarballs and checksums to ftp.gtk.org and put
|
||||
them in the right directory below /ftp/pub. Pay attention to correct
|
||||
ownership, and don't forget to update the LATEST file in the directory.
|
||||
|
||||
17) Go to the gnome-announce list archives, find the last announce message,
|
||||
16) Go to the gnome-announce list archives, find the last announce message,
|
||||
create a new message in the same form, replacing version numbers,
|
||||
commentary at the top about "what this release is about" and the
|
||||
summary of changes.
|
||||
|
||||
18) Send it to gnome-announce-list, gtk-list, gtk-app-devel-list and
|
||||
17) Send it to gnome-announce-list, gtk-list, gtk-app-devel-list and
|
||||
gtk-devel-list. Set reply-to to desktop-devel-list.
|
||||
|
||||
19) Add a link to the release announcement to www.gtk.org which lives
|
||||
18) Add a link to the release announcement to www.gtk.org which lives
|
||||
in the gtk-web git module.
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
The latest versions can be found online at
|
||||
<ulink role="online-location" url="http://developer.gnome.org/gdk3/">http://developer.gnome.org/gdk3/</ulink>.
|
||||
If you are looking for the older GDK 2 series of libraries,
|
||||
see <ulink role="online-location" url="http://developer.gnome.org/gdk/">http://developer.gnome.org/gdk/</ulink>.
|
||||
see <ulink role="online-location" url="http://developer.gnome.org/gdk2/">http://developer.gnome.org/gdk2/</ulink>.
|
||||
</releaseinfo>
|
||||
</bookinfo>
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
<xi:include href="xml/cairo_interaction.xml" />
|
||||
<xi:include href="xml/x_interaction.xml" />
|
||||
<xi:include href="xml/gdkapplaunchcontext.xml" />
|
||||
<xi:include href="xml/gdktesting.xml" />
|
||||
<xi:include href="xml/gdktestutils.xml" />
|
||||
</reference>
|
||||
|
||||
<index id="api-index-full">
|
||||
|
||||
@@ -1145,8 +1145,8 @@ gdk_app_launch_context_get_type
|
||||
|
||||
<SECTION>
|
||||
<TITLE>Testing</TITLE>
|
||||
<FILE>gdktesting</FILE>
|
||||
<FILE>gdktestutils</FILE>
|
||||
gdk_test_render_sync
|
||||
gdk_test_simulate_button
|
||||
gdk_test_simulate_key
|
||||
|
||||
</SECTION>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<chapter id="gtk-getting-started" xmlns:xi="http://www.w3.org/2003/XInclude">
|
||||
<title>Getting Started with GTK+</title>
|
||||
|
||||
<para>This chapter is contains some tutorial information to get you
|
||||
<para>This chapter contains some tutorial information to get you
|
||||
started with GTK+ programming. It assumes that you have GTK+, its
|
||||
dependencies and a C compiler installed and ready to use. If you
|
||||
need to build GTK+ itself first, refer to the
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
The latest versions can be found online at
|
||||
<ulink role="online-location" url="http://developer.gnome.org/gtk3/">http://developer.gnome.org/gtk3/</ulink>.
|
||||
If you are looking for the older GTK+ 2 series of libraries,
|
||||
see <ulink role="online-location" url="http://developer.gnome.org/gtk/">http://developer.gnome.org/gtk/</ulink>.
|
||||
see <ulink role="online-location" url="http://developer.gnome.org/gtk2/">http://developer.gnome.org/gtk2/</ulink>.
|
||||
</releaseinfo>
|
||||
</bookinfo>
|
||||
|
||||
|
||||
@@ -139,6 +139,7 @@ gtk_accel_label_set_accel_closure
|
||||
gtk_accel_label_get_accel_widget
|
||||
gtk_accel_label_set_accel_widget
|
||||
gtk_accel_label_get_accel_width
|
||||
gtk_accel_label_set_accel
|
||||
gtk_accel_label_refetch
|
||||
<SUBSECTION Standard>
|
||||
GTK_ACCEL_LABEL
|
||||
@@ -263,6 +264,8 @@ gtk_action_group_get_sensitive
|
||||
gtk_action_group_set_sensitive
|
||||
gtk_action_group_get_visible
|
||||
gtk_action_group_set_visible
|
||||
gtk_action_group_get_accel_group
|
||||
gtk_action_group_set_accel_group
|
||||
gtk_action_group_get_action
|
||||
gtk_action_group_list_actions
|
||||
gtk_action_group_add_action
|
||||
@@ -530,6 +533,7 @@ gtk_builder_add_from_resource
|
||||
gtk_builder_add_from_string
|
||||
gtk_builder_add_objects_from_file
|
||||
gtk_builder_add_objects_from_string
|
||||
gtk_builder_add_objects_from_resource
|
||||
gtk_builder_get_object
|
||||
gtk_builder_get_objects
|
||||
gtk_builder_connect_signals
|
||||
@@ -583,6 +587,8 @@ gtk_button_set_image
|
||||
gtk_button_get_image
|
||||
gtk_button_set_image_position
|
||||
gtk_button_get_image_position
|
||||
gtk_button_set_always_show_image
|
||||
gtk_button_get_always_show_image
|
||||
gtk_button_get_event_window
|
||||
|
||||
<SUBSECTION Standard>
|
||||
@@ -1046,6 +1052,8 @@ gtk_entry_get_layout
|
||||
gtk_entry_get_layout_offsets
|
||||
gtk_entry_layout_index_to_text_index
|
||||
gtk_entry_text_index_to_layout_index
|
||||
gtk_entry_set_attributes
|
||||
gtk_entry_get_attributes
|
||||
gtk_entry_get_max_length
|
||||
gtk_entry_get_visibility
|
||||
gtk_entry_set_completion
|
||||
@@ -1808,6 +1816,7 @@ gtk_image_new_from_stock
|
||||
gtk_image_new_from_animation
|
||||
gtk_image_new_from_icon_name
|
||||
gtk_image_new_from_gicon
|
||||
gtk_image_new_from_resource
|
||||
gtk_image_set_from_file
|
||||
gtk_image_set_from_icon_set
|
||||
gtk_image_set_from_pixbuf
|
||||
@@ -1815,6 +1824,7 @@ gtk_image_set_from_stock
|
||||
gtk_image_set_from_animation
|
||||
gtk_image_set_from_icon_name
|
||||
gtk_image_set_from_gicon
|
||||
gtk_image_set_from_resource
|
||||
gtk_image_clear
|
||||
gtk_image_new
|
||||
gtk_image_set_pixel_size
|
||||
@@ -2244,6 +2254,7 @@ gtk_menu_shell_set_take_focus
|
||||
gtk_menu_shell_get_take_focus
|
||||
gtk_menu_shell_get_selected_item
|
||||
gtk_menu_shell_get_parent_shell
|
||||
gtk_menu_shell_bind_model
|
||||
GtkMenuDirectionType
|
||||
<SUBSECTION Standard>
|
||||
GTK_MENU_SHELL
|
||||
@@ -3270,6 +3281,8 @@ gtk_level_bar_set_min_value
|
||||
gtk_level_bar_get_min_value
|
||||
gtk_level_bar_set_max_value
|
||||
gtk_level_bar_get_max_value
|
||||
gtk_level_bar_set_inverted
|
||||
gtk_level_bar_get_inverted
|
||||
gtk_level_bar_add_offset_value
|
||||
gtk_level_bar_remove_offset_value
|
||||
gtk_level_bar_get_offset_value
|
||||
@@ -5278,6 +5291,7 @@ gtk_widget_get_sensitive
|
||||
gtk_widget_is_sensitive
|
||||
gtk_widget_get_state
|
||||
gtk_widget_get_visible
|
||||
gtk_widget_is_visible
|
||||
gtk_widget_set_visible
|
||||
gtk_widget_set_state_flags
|
||||
gtk_widget_unset_state_flags
|
||||
@@ -5765,6 +5779,8 @@ GTK_STYLE_CLASS_LINKED
|
||||
GTK_STYLE_CLASS_ARROW
|
||||
GTK_STYLE_CLASS_OSD
|
||||
GTK_STYLE_CLASS_LEVEL_BAR
|
||||
GTK_STYLE_CLASS_CURSOR_HANDLE
|
||||
GTK_STYLE_CLASS_INSERTION_CURSOR
|
||||
GTK_STYLE_REGION_COLUMN
|
||||
GTK_STYLE_REGION_COLUMN_HEADER
|
||||
GTK_STYLE_REGION_ROW
|
||||
@@ -5974,6 +5990,7 @@ gtk_gradient_add_color_stop
|
||||
gtk_gradient_ref
|
||||
gtk_gradient_unref
|
||||
gtk_gradient_resolve
|
||||
gtk_gradient_resolve_for_context
|
||||
gtk_gradient_to_string
|
||||
|
||||
<SUBSECTION Standard>
|
||||
@@ -7106,6 +7123,7 @@ gtk_application_add_window
|
||||
gtk_application_remove_window
|
||||
gtk_application_get_windows
|
||||
gtk_application_get_window_by_id
|
||||
gtk_application_get_active_window
|
||||
|
||||
<SUBSECTION>
|
||||
GtkApplicationInhibitFlags
|
||||
|
||||
@@ -55,6 +55,7 @@ noinst_PROGRAMS = \
|
||||
bloatpad \
|
||||
plugman \
|
||||
sunny \
|
||||
action-namespace \
|
||||
grid-packing \
|
||||
drawing \
|
||||
builder
|
||||
|
||||
134
examples/action-namespace.c
Normal file
134
examples/action-namespace.c
Normal file
@@ -0,0 +1,134 @@
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
static void
|
||||
action_activated (GSimpleAction *action,
|
||||
GVariant *parameter,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkWindow *parent = user_data;
|
||||
GtkWidget *dialog;
|
||||
|
||||
dialog = gtk_message_dialog_new (parent,
|
||||
GTK_DIALOG_DESTROY_WITH_PARENT,
|
||||
GTK_MESSAGE_INFO,
|
||||
GTK_BUTTONS_CLOSE,
|
||||
"Activated action `%s`",
|
||||
g_action_get_name (G_ACTION (action)));
|
||||
|
||||
g_signal_connect_swapped (dialog, "response",
|
||||
G_CALLBACK (gtk_widget_destroy), dialog);
|
||||
|
||||
gtk_widget_show_all (dialog);
|
||||
}
|
||||
|
||||
static GActionEntry doc_entries[] = {
|
||||
{ "save", action_activated },
|
||||
{ "print", action_activated },
|
||||
{ "share", action_activated }
|
||||
};
|
||||
|
||||
static GActionEntry win_entries[] = {
|
||||
{ "fullscreen", action_activated },
|
||||
{ "close", action_activated },
|
||||
};
|
||||
|
||||
const gchar *menu_ui =
|
||||
"<interface>"
|
||||
" <menu id='doc-menu'>"
|
||||
" <section>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Save</attribute>"
|
||||
" <attribute name='action'>save</attribute>"
|
||||
" </item>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Print</attribute>"
|
||||
" <attribute name='action'>print</attribute>"
|
||||
" </item>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Share</attribute>"
|
||||
" <attribute name='action'>share</attribute>"
|
||||
" </item>"
|
||||
" </section>"
|
||||
" </menu>"
|
||||
" <menu id='win-menu'>"
|
||||
" <section>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Fullscreen</attribute>"
|
||||
" <attribute name='action'>fullscreen</attribute>"
|
||||
" </item>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Close</attribute>"
|
||||
" <attribute name='action'>close</attribute>"
|
||||
" </item>"
|
||||
" </section>"
|
||||
" </menu>"
|
||||
"</interface>";
|
||||
|
||||
static void
|
||||
activate (GApplication *app,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkWidget *win;
|
||||
GtkWidget *button;
|
||||
GSimpleActionGroup *doc_actions;
|
||||
GtkBuilder *builder;
|
||||
GMenuModel *doc_menu;
|
||||
GMenuModel *win_menu;
|
||||
GMenu *button_menu;
|
||||
GMenuItem *section;
|
||||
|
||||
if (gtk_application_get_windows (GTK_APPLICATION (app)) != NULL)
|
||||
return;
|
||||
|
||||
win = gtk_application_window_new (GTK_APPLICATION (app));
|
||||
|
||||
doc_actions = g_simple_action_group_new ();
|
||||
g_simple_action_group_add_entries (doc_actions, doc_entries,
|
||||
G_N_ELEMENTS (doc_entries), win);
|
||||
|
||||
g_action_map_add_action_entries (G_ACTION_MAP (win), win_entries,
|
||||
G_N_ELEMENTS (win_entries), win);
|
||||
|
||||
builder = gtk_builder_new ();
|
||||
gtk_builder_add_from_string (builder, menu_ui, -1, NULL);
|
||||
|
||||
doc_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "doc-menu"));
|
||||
win_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "win-menu"));
|
||||
|
||||
button_menu = g_menu_new ();
|
||||
|
||||
section = g_menu_item_new_section (NULL, doc_menu);
|
||||
g_menu_item_set_attribute (section, "action-namespace", "s", "doc");
|
||||
g_menu_append_item (button_menu, section);
|
||||
g_object_unref (section);
|
||||
|
||||
section = g_menu_item_new_section (NULL, win_menu);
|
||||
g_menu_item_set_attribute (section, "action-namespace", "s", "win");
|
||||
g_menu_append_item (button_menu, section);
|
||||
g_object_unref (section);
|
||||
|
||||
button = gtk_menu_button_new ();
|
||||
gtk_button_set_label (GTK_BUTTON (button), "Menu");
|
||||
gtk_widget_insert_action_group (button, "doc", G_ACTION_GROUP (doc_actions));
|
||||
gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (button), G_MENU_MODEL (button_menu));
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (win), button);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (win), 12);
|
||||
gtk_widget_show_all (win);
|
||||
|
||||
g_object_unref (button_menu);
|
||||
g_object_unref (doc_actions);
|
||||
g_object_unref (builder);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc,
|
||||
char **argv)
|
||||
{
|
||||
GtkApplication *app;
|
||||
|
||||
app = gtk_application_new ("org.gtk.Example", 0);
|
||||
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
|
||||
|
||||
return g_application_run (G_APPLICATION (app), argc, argv);
|
||||
}
|
||||
@@ -191,7 +191,14 @@ bloat_pad_open (GApplication *application,
|
||||
new_window (application, files[i]);
|
||||
}
|
||||
|
||||
typedef GtkApplication BloatPad;
|
||||
typedef struct
|
||||
{
|
||||
GtkApplication parent_instance;
|
||||
|
||||
GMenu *time;
|
||||
guint timeout;
|
||||
} BloatPad;
|
||||
|
||||
typedef GtkApplicationClass BloatPadClass;
|
||||
|
||||
G_DEFINE_TYPE (BloatPad, bloat_pad, GTK_TYPE_APPLICATION)
|
||||
@@ -234,15 +241,65 @@ quit_activated (GSimpleAction *action,
|
||||
g_application_quit (app);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
update_time (gpointer user_data)
|
||||
{
|
||||
BloatPad *bloatpad = user_data;
|
||||
GDateTime *now;
|
||||
gchar *time;
|
||||
|
||||
while (g_menu_model_get_n_items (G_MENU_MODEL (bloatpad->time)))
|
||||
g_menu_remove (bloatpad->time, 0);
|
||||
|
||||
g_message ("Updating the time menu (which should be open now)...");
|
||||
|
||||
now = g_date_time_new_now_local ();
|
||||
time = g_date_time_format (now, "%c");
|
||||
g_menu_append (bloatpad->time, time, NULL);
|
||||
g_date_time_unref (now);
|
||||
g_free (time);
|
||||
|
||||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
static void
|
||||
time_active_changed (GSimpleAction *action,
|
||||
GVariant *state,
|
||||
gpointer user_data)
|
||||
{
|
||||
BloatPad *bloatpad = user_data;
|
||||
|
||||
if (g_variant_get_boolean (state))
|
||||
{
|
||||
if (!bloatpad->timeout)
|
||||
{
|
||||
bloatpad->timeout = g_timeout_add (1000, update_time, bloatpad);
|
||||
update_time (bloatpad);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bloatpad->timeout)
|
||||
{
|
||||
g_source_remove (bloatpad->timeout);
|
||||
bloatpad->timeout = 0;
|
||||
}
|
||||
}
|
||||
|
||||
g_simple_action_set_state (action, state);
|
||||
}
|
||||
|
||||
static GActionEntry app_entries[] = {
|
||||
{ "new", new_activated, NULL, NULL, NULL },
|
||||
{ "about", about_activated, NULL, NULL, NULL },
|
||||
{ "quit", quit_activated, NULL, NULL, NULL },
|
||||
{ "time-active", NULL, NULL, "false", time_active_changed }
|
||||
};
|
||||
|
||||
static void
|
||||
bloat_pad_startup (GApplication *application)
|
||||
{
|
||||
BloatPad *bloatpad = (BloatPad*) application;
|
||||
GtkBuilder *builder;
|
||||
|
||||
G_APPLICATION_CLASS (bloat_pad_parent_class)
|
||||
@@ -301,13 +358,34 @@ bloat_pad_startup (GApplication *application)
|
||||
" </item>"
|
||||
" </section>"
|
||||
" </submenu>"
|
||||
" <submenu id='time-menu'>"
|
||||
" <attribute name='label' translatable='yes'>Time</attribute>"
|
||||
" <attribute name='submenu-action'>app.time-active</attribute>"
|
||||
" </submenu>"
|
||||
" </menu>"
|
||||
"</interface>", -1, NULL);
|
||||
gtk_application_set_app_menu (GTK_APPLICATION (application), G_MENU_MODEL (gtk_builder_get_object (builder, "app-menu")));
|
||||
gtk_application_set_menubar (GTK_APPLICATION (application), G_MENU_MODEL (gtk_builder_get_object (builder, "menubar")));
|
||||
//gtk_application_set_menubar (GTK_APPLICATION (application), G_MENU_MODEL (gtk_builder_get_object (builder, "app-menu")));
|
||||
bloatpad->time = G_MENU (gtk_builder_get_object (builder, "time-menu"));
|
||||
g_object_unref (builder);
|
||||
}
|
||||
|
||||
static void
|
||||
bloat_pad_shutdown (GApplication *application)
|
||||
{
|
||||
BloatPad *bloatpad = (BloatPad *) application;
|
||||
|
||||
if (bloatpad->timeout)
|
||||
{
|
||||
g_source_remove (bloatpad->timeout);
|
||||
bloatpad->timeout = 0;
|
||||
}
|
||||
|
||||
G_APPLICATION_CLASS (bloat_pad_parent_class)
|
||||
->shutdown (application);
|
||||
}
|
||||
|
||||
static void
|
||||
bloat_pad_init (BloatPad *app)
|
||||
{
|
||||
@@ -320,6 +398,7 @@ bloat_pad_class_init (BloatPadClass *class)
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||
|
||||
application_class->startup = bloat_pad_startup;
|
||||
application_class->shutdown = bloat_pad_shutdown;
|
||||
application_class->activate = bloat_pad_activate;
|
||||
application_class->open = bloat_pad_open;
|
||||
|
||||
@@ -330,9 +409,7 @@ bloat_pad_class_init (BloatPadClass *class)
|
||||
BloatPad *
|
||||
bloat_pad_new (void)
|
||||
{
|
||||
GtkApplication *bloat_pad;
|
||||
|
||||
g_type_init ();
|
||||
BloatPad *bloat_pad;
|
||||
|
||||
g_set_application_name ("Bloatpad");
|
||||
|
||||
|
||||
@@ -465,8 +465,6 @@ plug_man_class_init (PlugManClass *class)
|
||||
PlugMan *
|
||||
plug_man_new (void)
|
||||
{
|
||||
g_type_init ();
|
||||
|
||||
return g_object_new (plug_man_get_type (),
|
||||
"application-id", "org.gtk.Test.plugman",
|
||||
"flags", G_APPLICATION_HANDLES_OPEN,
|
||||
|
||||
@@ -191,8 +191,6 @@ menu_button_class_init (MenuButtonClass *class)
|
||||
MenuButton *
|
||||
menu_button_new (void)
|
||||
{
|
||||
g_type_init ();
|
||||
|
||||
return g_object_new (menu_button_get_type (),
|
||||
"application-id", "org.gtk.Test.Sunny",
|
||||
"flags", G_APPLICATION_HANDLES_OPEN,
|
||||
|
||||
@@ -341,7 +341,8 @@ gdkmarshalers.h: @REBUILD@ gdkmarshalers.list
|
||||
&& mv gdkmarshalers-h.tmp gdkmarshalers.h \
|
||||
|| ( rm -f gdkmarshalers-h.tmp && exit 1)
|
||||
gdkmarshalers.c: @REBUILD@ gdkmarshalers.list
|
||||
$(AM_V_GEN) $(GLIB_GENMARSHAL) --prefix=_gdk_marshal $(srcdir)/gdkmarshalers.list --body > gdkmarshalers-c.tmp \
|
||||
$(AM_V_GEN) (echo "#include \"gdkmarshalers.h\""; \
|
||||
$(GLIB_GENMARSHAL) --prefix=_gdk_marshal $(srcdir)/gdkmarshalers.list --body) > gdkmarshalers-c.tmp \
|
||||
&& mv gdkmarshalers-c.tmp gdkmarshalers.c \
|
||||
|| ( rm -f gdkmarshalers-c.tmp && exit 1 )
|
||||
|
||||
|
||||
@@ -31,12 +31,12 @@ libbroadway_la_SOURCES = \
|
||||
broadway.c
|
||||
|
||||
clienthtml.h: client.html
|
||||
$(PERL) ./toarray.pl client.html client_html > $@
|
||||
$(PERL) $(srcdir)/toarray.pl $(srcdir)/client.html client_html > $@
|
||||
|
||||
EXTRA_DIST += client.html
|
||||
|
||||
broadwayjs.h: broadway.js
|
||||
$(PERL) ./toarray.pl broadway.js broadway_js > $@
|
||||
$(PERL) $(srcdir)/toarray.pl $(srcdir)/broadway.js broadway_js > $@
|
||||
|
||||
EXTRA_DIST += broadway.js
|
||||
|
||||
|
||||
@@ -57,8 +57,44 @@ base64_uint32 (guint32 v, char *c)
|
||||
* conversion of raw image data to png data: uris *
|
||||
***********************************************************/
|
||||
|
||||
static cairo_status_t
|
||||
write_png_data (void *closure,
|
||||
const unsigned char *data,
|
||||
unsigned int data_len)
|
||||
{
|
||||
GString *buf = closure;
|
||||
|
||||
g_string_append_len (buf, (char *)data, data_len);
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static void
|
||||
to_png_rgb (GString *buf, int w, int h, int byte_stride, guint32 *data)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data,
|
||||
CAIRO_FORMAT_RGB24, w, h, byte_stride);
|
||||
|
||||
cairo_surface_write_to_png_stream (surface, write_png_data, buf);
|
||||
cairo_surface_destroy (surface);
|
||||
}
|
||||
|
||||
static void
|
||||
to_png_rgba (GString *buf, int w, int h, int byte_stride, guint32 *data)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data,
|
||||
CAIRO_FORMAT_ARGB32, w, h, byte_stride);
|
||||
|
||||
cairo_surface_write_to_png_stream (surface, write_png_data, buf);
|
||||
cairo_surface_destroy (surface);
|
||||
}
|
||||
|
||||
struct PngTarget {
|
||||
GString *url;
|
||||
GString *buf;
|
||||
int state;
|
||||
int save;
|
||||
};
|
||||
@@ -71,71 +107,73 @@ write_png_url (void *closure,
|
||||
struct PngTarget *target = closure;
|
||||
gsize res, old_len;
|
||||
|
||||
old_len = target->url->len;
|
||||
g_string_set_size (target->url,
|
||||
old_len = target->buf->len;
|
||||
g_string_set_size (target->buf,
|
||||
old_len + (data_len / 3 + 1) * 4 + 4);
|
||||
|
||||
res = g_base64_encode_step (data, data_len, FALSE,
|
||||
target->url->str + old_len,
|
||||
target->buf->str + old_len,
|
||||
&target->state, &target->save);
|
||||
|
||||
g_string_set_size (target->url, old_len + res);
|
||||
g_string_set_size (target->buf, old_len + res);
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static char *
|
||||
to_png_rgb (int w, int h, int byte_stride, guint32 *data)
|
||||
static void
|
||||
to_png_url_rgb (GString *buf, int w, int h, int byte_stride, guint32 *data)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
struct PngTarget target;
|
||||
gsize res, old_len;
|
||||
|
||||
target.url = g_string_new ("data:image/png;base64,");
|
||||
target.buf = buf;
|
||||
target.state = 0;
|
||||
target.save = 0;
|
||||
|
||||
g_string_append (buf, "data:image/png;base64,");
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data,
|
||||
CAIRO_FORMAT_RGB24, w, h, byte_stride);
|
||||
|
||||
cairo_surface_write_to_png_stream (surface, write_png_url, &target);
|
||||
cairo_surface_destroy (surface);
|
||||
|
||||
old_len = target.url->len;
|
||||
old_len = buf->len;
|
||||
|
||||
g_string_set_size (target.url, old_len + 4);
|
||||
g_string_set_size (buf, old_len + 4);
|
||||
res = g_base64_encode_close (FALSE,
|
||||
target.url->str + old_len,
|
||||
buf->str + old_len,
|
||||
&target.state, &target.save);
|
||||
g_string_set_size (target.url, old_len + res);
|
||||
|
||||
return g_string_free (target.url, FALSE);
|
||||
g_string_set_size (buf, old_len + res);
|
||||
}
|
||||
|
||||
static char *
|
||||
to_png_rgba (int w, int h, int byte_stride, guint32 *data)
|
||||
static void
|
||||
to_png_url_rgba (GString *buf, int w, int h, int byte_stride, guint32 *data)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
struct PngTarget target;
|
||||
gsize res, old_len;
|
||||
|
||||
target.url = g_string_new ("data:image/png;base64,");
|
||||
target.buf = buf;
|
||||
target.state = 0;
|
||||
target.save = 0;
|
||||
|
||||
g_string_append (buf, "data:image/png;base64,");
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data,
|
||||
CAIRO_FORMAT_ARGB32, w, h, byte_stride);
|
||||
|
||||
cairo_surface_write_to_png_stream (surface, write_png_url, &target);
|
||||
cairo_surface_destroy (surface);
|
||||
|
||||
old_len = target.url->len;
|
||||
old_len = buf->len;
|
||||
|
||||
g_string_set_size (target.url, old_len + 4);
|
||||
g_string_set_size (buf, old_len + 4);
|
||||
res = g_base64_encode_close (FALSE,
|
||||
target.url->str + old_len,
|
||||
buf->str + old_len,
|
||||
&target.state, &target.save);
|
||||
g_string_set_size (target.url, old_len + res);
|
||||
|
||||
return g_string_free (target.url, FALSE);
|
||||
g_string_set_size (buf, old_len + res);
|
||||
}
|
||||
|
||||
#if 0
|
||||
@@ -173,9 +211,11 @@ to_png_a (int w, int h, int byte_stride, guint8 *data)
|
||||
|
||||
struct BroadwayOutput {
|
||||
GOutputStream *out;
|
||||
GString *buf;
|
||||
int error;
|
||||
guint32 serial;
|
||||
gboolean proto_v7_plus;
|
||||
gboolean binary;
|
||||
};
|
||||
|
||||
static void
|
||||
@@ -212,13 +252,12 @@ broadway_output_send_cmd (BroadwayOutput *output,
|
||||
}
|
||||
|
||||
static void
|
||||
broadway_output_sendmsg (BroadwayOutput *output,
|
||||
const void *buf, gsize count)
|
||||
broadway_output_send_cmd_pre_v7 (BroadwayOutput *output,
|
||||
const void *buf, gsize count)
|
||||
{
|
||||
if (!output->proto_v7_plus)
|
||||
g_output_stream_write_all (output->out, buf, count, NULL, NULL, NULL);
|
||||
else
|
||||
broadway_output_send_cmd (output, TRUE, BROADWAY_WS_TEXT, buf, count);
|
||||
g_output_stream_write_all (output->out, "\0", 1, NULL, NULL, NULL);
|
||||
g_output_stream_write_all (output->out, buf, count, NULL, NULL, NULL);
|
||||
g_output_stream_write_all (output->out, "\xff", 1, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
void broadway_output_pong (BroadwayOutput *output)
|
||||
@@ -227,42 +266,40 @@ void broadway_output_pong (BroadwayOutput *output)
|
||||
broadway_output_send_cmd (output, TRUE, BROADWAY_WS_CNX_PONG, NULL, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
broadway_output_sendmsg_initiate (BroadwayOutput *output)
|
||||
{
|
||||
if (!output->proto_v7_plus)
|
||||
g_output_stream_write (output->out, "\0", 1, NULL, NULL);
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
broadway_output_flush (BroadwayOutput *output)
|
||||
{
|
||||
if (output->buf->len == 0)
|
||||
return TRUE;
|
||||
|
||||
if (!output->proto_v7_plus)
|
||||
{
|
||||
broadway_output_sendmsg (output, "\xff", 1);
|
||||
broadway_output_sendmsg (output, "\0", 1);
|
||||
return !output->error;
|
||||
}
|
||||
else /* no need to flush */
|
||||
return !output->error;
|
||||
broadway_output_send_cmd_pre_v7 (output, output->buf->str, output->buf->len);
|
||||
else if (output->binary)
|
||||
broadway_output_send_cmd (output, TRUE, BROADWAY_WS_BINARY,
|
||||
output->buf->str, output->buf->len);
|
||||
else
|
||||
broadway_output_send_cmd (output, TRUE, BROADWAY_WS_TEXT,
|
||||
output->buf->str, output->buf->len);
|
||||
|
||||
g_string_set_size (output->buf, 0);
|
||||
|
||||
return !output->error;
|
||||
|
||||
}
|
||||
|
||||
BroadwayOutput *
|
||||
broadway_output_new(GOutputStream *out, guint32 serial,
|
||||
gboolean proto_v7_plus)
|
||||
broadway_output_new (GOutputStream *out, guint32 serial,
|
||||
gboolean proto_v7_plus, gboolean binary)
|
||||
{
|
||||
BroadwayOutput *output;
|
||||
|
||||
output = g_new0 (BroadwayOutput, 1);
|
||||
|
||||
output->out = g_object_ref (out);
|
||||
output->buf = g_string_new ("");
|
||||
output->serial = serial;
|
||||
output->proto_v7_plus = proto_v7_plus;
|
||||
|
||||
broadway_output_sendmsg_initiate (output);
|
||||
output->binary = binary;
|
||||
|
||||
return output;
|
||||
}
|
||||
@@ -285,32 +322,97 @@ broadway_output_get_next_serial (BroadwayOutput *output)
|
||||
* Core rendering operations *
|
||||
************************************************************************/
|
||||
|
||||
#define HEADER_LEN (1+6)
|
||||
|
||||
static void
|
||||
append_uint16 (guint32 v, char *buf, int *p)
|
||||
append_char (BroadwayOutput *output, char c)
|
||||
{
|
||||
base64_uint16 (v, &buf[*p]);
|
||||
*p += 3;
|
||||
g_string_append_c (output->buf, c);
|
||||
}
|
||||
|
||||
static void
|
||||
append_uint32 (guint32 v, char *buf, int *p)
|
||||
append_bool (BroadwayOutput *output, gboolean val)
|
||||
{
|
||||
base64_uint32 (v, &buf[*p]);
|
||||
*p += 6;
|
||||
if (output->binary)
|
||||
g_string_append_c (output->buf, val ? 1: 0);
|
||||
else
|
||||
g_string_append_c (output->buf, val ? '1': '0');
|
||||
}
|
||||
|
||||
static int
|
||||
write_header(BroadwayOutput *output, char *buf, char op)
|
||||
static void
|
||||
append_flags (BroadwayOutput *output, guint32 val)
|
||||
{
|
||||
int p;
|
||||
if (output->binary)
|
||||
g_string_append_c (output->buf, val);
|
||||
else
|
||||
g_string_append_c (output->buf, val + '0');
|
||||
}
|
||||
|
||||
p = 0;
|
||||
buf[p++] = op;
|
||||
append_uint32 (output->serial++, buf, &p);
|
||||
|
||||
return p;
|
||||
static void
|
||||
append_uint16 (BroadwayOutput *output, guint32 v)
|
||||
{
|
||||
gsize old_len = output->buf->len;
|
||||
|
||||
if (output->binary)
|
||||
{
|
||||
guint8 *buf = (guint8 *)output->buf->str + old_len;
|
||||
|
||||
g_string_set_size (output->buf, old_len + 2);
|
||||
buf[0] = (v >> 0) & 0xff;
|
||||
buf[1] = (v >> 8) & 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_string_set_size (output->buf, old_len + 3);
|
||||
base64_uint16 (v, output->buf->str + old_len);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
append_uint32 (BroadwayOutput *output, guint32 v)
|
||||
{
|
||||
gsize old_len = output->buf->len;
|
||||
|
||||
if (output->binary)
|
||||
{
|
||||
guint8 *buf = (guint8 *)output->buf->str + old_len;
|
||||
|
||||
g_string_set_size (output->buf, old_len + 4);
|
||||
buf[0] = (v >> 0) & 0xff;
|
||||
buf[1] = (v >> 8) & 0xff;
|
||||
buf[2] = (v >> 16) & 0xff;
|
||||
buf[3] = (v >> 24) & 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_string_set_size (output->buf, old_len + 6);
|
||||
base64_uint32 (v, output->buf->str + old_len);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
overwrite_uint32 (BroadwayOutput *output, gsize pos, guint32 v)
|
||||
{
|
||||
if (output->binary)
|
||||
{
|
||||
guint8 *buf = (guint8 *)output->buf->str + pos;
|
||||
|
||||
buf[0] = (v >> 0) & 0xff;
|
||||
buf[1] = (v >> 8) & 0xff;
|
||||
buf[2] = (v >> 16) & 0xff;
|
||||
buf[3] = (v >> 24) & 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
base64_uint32 (v, output->buf->str + pos);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
write_header(BroadwayOutput *output, char op)
|
||||
{
|
||||
append_char (output, op);
|
||||
append_uint32 (output, output->serial++);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -318,29 +420,20 @@ broadway_output_copy_rectangles (BroadwayOutput *output, int id,
|
||||
BroadwayRect *rects, int n_rects,
|
||||
int dx, int dy)
|
||||
{
|
||||
char *buf;
|
||||
int len, i, p;
|
||||
int i;
|
||||
|
||||
len = HEADER_LEN + 3 + 3 + 3*4*n_rects + 3 + 3;
|
||||
|
||||
buf = g_malloc (len);
|
||||
p = write_header (output, buf, 'b');
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (n_rects, buf, &p);
|
||||
write_header (output, 'b');
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, n_rects);
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
append_uint16 (rects[i].x, buf, &p);
|
||||
append_uint16 (rects[i].y, buf, &p);
|
||||
append_uint16 (rects[i].width, buf, &p);
|
||||
append_uint16 (rects[i].height, buf, &p);
|
||||
append_uint16 (output, rects[i].x);
|
||||
append_uint16 (output, rects[i].y);
|
||||
append_uint16 (output, rects[i].width);
|
||||
append_uint16 (output, rects[i].height);
|
||||
}
|
||||
append_uint16 (dx, buf, &p);
|
||||
append_uint16 (dy, buf, &p);
|
||||
|
||||
assert (p == len);
|
||||
|
||||
broadway_output_sendmsg (output, buf, len);
|
||||
free (buf);
|
||||
append_uint16 (output, dx);
|
||||
append_uint16 (output, dy);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -348,31 +441,18 @@ broadway_output_grab_pointer (BroadwayOutput *output,
|
||||
int id,
|
||||
gboolean owner_event)
|
||||
{
|
||||
char buf[HEADER_LEN + 3 + 1];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'g');
|
||||
append_uint16 (id, buf, &p);
|
||||
buf[p++] = owner_event ? '1': '0';
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 'g');
|
||||
append_uint16 (output, id);
|
||||
append_bool (output, owner_event);
|
||||
}
|
||||
|
||||
guint32
|
||||
broadway_output_ungrab_pointer (BroadwayOutput *output)
|
||||
{
|
||||
char buf[HEADER_LEN];
|
||||
guint32 serial;
|
||||
int p;
|
||||
|
||||
serial = output->serial;
|
||||
p = write_header (output, buf, 'u');
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 'u');
|
||||
|
||||
return serial;
|
||||
}
|
||||
@@ -382,62 +462,34 @@ broadway_output_new_surface(BroadwayOutput *output,
|
||||
int id, int x, int y, int w, int h,
|
||||
gboolean is_temp)
|
||||
{
|
||||
char buf[HEADER_LEN + 16];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 's');
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (x, buf, &p);
|
||||
append_uint16 (y, buf, &p);
|
||||
append_uint16 (w, buf, &p);
|
||||
append_uint16 (h, buf, &p);
|
||||
buf[p++] = is_temp ? '1' : '0';
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 's');
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, x);
|
||||
append_uint16 (output, y);
|
||||
append_uint16 (output, w);
|
||||
append_uint16 (output, h);
|
||||
append_bool (output, is_temp);
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_show_surface(BroadwayOutput *output, int id)
|
||||
{
|
||||
char buf[HEADER_LEN + 3];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'S');
|
||||
append_uint16 (id, buf, &p);
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 'S');
|
||||
append_uint16 (output, id);
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_hide_surface(BroadwayOutput *output, int id)
|
||||
{
|
||||
char buf[HEADER_LEN + 3];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'H');
|
||||
append_uint16 (id, buf, &p);
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 'H');
|
||||
append_uint16 (output, id);
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_destroy_surface(BroadwayOutput *output, int id)
|
||||
{
|
||||
char buf[HEADER_LEN + 3];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'd');
|
||||
append_uint16 (id, buf, &p);
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 'd');
|
||||
append_uint16 (output, id);
|
||||
}
|
||||
|
||||
|
||||
@@ -451,31 +503,25 @@ broadway_output_move_resize_surface (BroadwayOutput *output,
|
||||
int w,
|
||||
int h)
|
||||
{
|
||||
char buf[HEADER_LEN+3+1+6+6];
|
||||
int p;
|
||||
int val;
|
||||
|
||||
if (!has_pos && !has_size)
|
||||
return;
|
||||
|
||||
p = write_header (output, buf, 'm');
|
||||
|
||||
write_header (output, 'm');
|
||||
val = (!!has_pos) | ((!!has_size) << 1);
|
||||
append_uint16 (id, buf, &p);
|
||||
buf[p++] = val + '0';
|
||||
append_uint16 (output, id);
|
||||
append_flags (output, val);
|
||||
if (has_pos)
|
||||
{
|
||||
append_uint16 (x, buf, &p);
|
||||
append_uint16 (y, buf, &p);
|
||||
append_uint16 (output, x);
|
||||
append_uint16 (output, y);
|
||||
}
|
||||
if (has_size)
|
||||
{
|
||||
append_uint16 (w, buf, &p);
|
||||
append_uint16 (h, buf, &p);
|
||||
append_uint16 (output, w);
|
||||
append_uint16 (output, h);
|
||||
}
|
||||
assert (p <= sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, p);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -483,17 +529,9 @@ broadway_output_set_transient_for (BroadwayOutput *output,
|
||||
int id,
|
||||
int parent_id)
|
||||
{
|
||||
char buf[HEADER_LEN + 6];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'p');
|
||||
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (parent_id, buf, &p);
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 'p');
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, parent_id);
|
||||
}
|
||||
|
||||
|
||||
@@ -501,32 +539,26 @@ void
|
||||
broadway_output_put_rgb (BroadwayOutput *output, int id, int x, int y,
|
||||
int w, int h, int byte_stride, void *data)
|
||||
{
|
||||
gsize buf_size;
|
||||
gsize url_len;
|
||||
char *url, *buf;
|
||||
int p;
|
||||
gsize size_start, image_start, len;
|
||||
|
||||
url = to_png_rgb (w, h, byte_stride, (guint32*)data);
|
||||
url_len = strlen (url);
|
||||
write_header (output, 'i');
|
||||
|
||||
buf_size = HEADER_LEN + 15 + url_len;
|
||||
buf = g_malloc (buf_size);
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, x);
|
||||
append_uint16 (output, y);
|
||||
|
||||
p = write_header (output, buf, 'i');
|
||||
size_start = output->buf->len;
|
||||
append_uint32 (output, 0);
|
||||
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (x, buf, &p);
|
||||
append_uint16 (y, buf, &p);
|
||||
image_start = output->buf->len;
|
||||
if (output->binary)
|
||||
to_png_rgb (output->buf, w, h, byte_stride, (guint32*)data);
|
||||
else
|
||||
to_png_url_rgb (output->buf, w, h, byte_stride, (guint32*)data);
|
||||
|
||||
append_uint32 (url_len, buf, &p);
|
||||
len = output->buf->len - image_start;
|
||||
|
||||
g_assert (p == HEADER_LEN + 15);
|
||||
strncpy (buf + p, url, url_len);
|
||||
|
||||
broadway_output_sendmsg (output, buf, buf_size);
|
||||
|
||||
g_free (buf);
|
||||
free (url);
|
||||
overwrite_uint32 (output, size_start, len);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
@@ -757,39 +789,38 @@ broadway_output_put_rgba (BroadwayOutput *output, int id, int x, int y,
|
||||
int w, int h, int byte_stride, void *data)
|
||||
{
|
||||
BroadwayBox *rects;
|
||||
int p, i, n_rects;
|
||||
int i, n_rects;
|
||||
gsize size_start, image_start, len;
|
||||
|
||||
rects = rgba_find_rects (data, w, h, byte_stride, &n_rects);
|
||||
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
gsize url_len, buf_size;
|
||||
char *buf, *url;
|
||||
guint8 *subdata;
|
||||
|
||||
write_header (output, 'i');
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, x + rects[i].x1);
|
||||
append_uint16 (output, y + rects[i].y1);
|
||||
|
||||
size_start = output->buf->len;
|
||||
append_uint32 (output, 0);
|
||||
|
||||
image_start = output->buf->len;
|
||||
|
||||
subdata = (guint8 *)data + rects[i].x1 * 4 + rects[i].y1 * byte_stride;
|
||||
url = to_png_rgba (rects[i].x2 - rects[i].x1,
|
||||
if (output->binary)
|
||||
to_png_rgba (output->buf, rects[i].x2 - rects[i].x1,
|
||||
rects[i].y2 - rects[i].y1,
|
||||
byte_stride, (guint32*)subdata);
|
||||
else
|
||||
to_png_url_rgba (output->buf, rects[i].x2 - rects[i].x1,
|
||||
rects[i].y2 - rects[i].y1,
|
||||
byte_stride, (guint32*)subdata);
|
||||
|
||||
url_len = strlen (url);
|
||||
buf_size = HEADER_LEN + 15 + url_len;
|
||||
buf = g_malloc (buf_size);
|
||||
len = output->buf->len - image_start;
|
||||
|
||||
|
||||
p = write_header (output, buf, 'i');
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (x + rects[i].x1, buf, &p);
|
||||
append_uint16 (y + rects[i].y1, buf, &p);
|
||||
|
||||
append_uint32 (url_len, buf, &p);
|
||||
g_assert (p == HEADER_LEN + 15);
|
||||
strncpy (buf + p, url, url_len);
|
||||
|
||||
broadway_output_sendmsg (output, buf, buf_size);
|
||||
|
||||
free (url);
|
||||
g_free (buf);
|
||||
overwrite_uint32 (output, size_start, len);
|
||||
}
|
||||
|
||||
free (rects);
|
||||
@@ -799,13 +830,6 @@ void
|
||||
broadway_output_surface_flush (BroadwayOutput *output,
|
||||
int id)
|
||||
{
|
||||
char buf[HEADER_LEN + 3];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'f');
|
||||
append_uint16 (id, buf, &p);
|
||||
|
||||
g_assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 'f');
|
||||
append_uint16 (output, id);
|
||||
}
|
||||
|
||||
@@ -19,7 +19,8 @@ typedef enum {
|
||||
|
||||
BroadwayOutput *broadway_output_new (GOutputStream *out,
|
||||
guint32 serial,
|
||||
gboolean proto_v7_plus);
|
||||
gboolean proto_v7_plus,
|
||||
gboolean binary);
|
||||
void broadway_output_free (BroadwayOutput *output);
|
||||
int broadway_output_flush (BroadwayOutput *output);
|
||||
int broadway_output_has_error (BroadwayOutput *output);
|
||||
|
||||
@@ -725,76 +725,56 @@ function cmdUngrabPointer()
|
||||
doUngrab();
|
||||
}
|
||||
|
||||
function handleCommands(cmdObj)
|
||||
function handleCommands(cmd)
|
||||
{
|
||||
var cmd = cmdObj.data;
|
||||
var i = cmdObj.pos;
|
||||
|
||||
while (i < cmd.length) {
|
||||
while (cmd.pos < cmd.length) {
|
||||
var id, x, y, w, h, q;
|
||||
var command = cmd[i++];
|
||||
lastSerial = base64_32(cmd, i);
|
||||
i = i + 6;
|
||||
var command = cmd.get_char();
|
||||
lastSerial = cmd.get_32();
|
||||
switch (command) {
|
||||
case 's': // create new surface
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
x = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
y = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
w = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
h = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var isTemp = cmd[i] == '1';
|
||||
i = i + 1;
|
||||
id = cmd.get_16();
|
||||
x = cmd.get_16s();
|
||||
y = cmd.get_16s();
|
||||
w = cmd.get_16();
|
||||
h = cmd.get_16();
|
||||
var isTemp = cmd.get_bool();
|
||||
cmdCreateSurface(id, x, y, w, h, isTemp);
|
||||
break;
|
||||
|
||||
case 'S': // Show a surface
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
id = cmd.get_16();
|
||||
cmdShowSurface(id);
|
||||
break;
|
||||
|
||||
case 'H': // Hide a surface
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
id = cmd.get_16();
|
||||
cmdHideSurface(id);
|
||||
break;
|
||||
|
||||
case 'p': // Set transient parent
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var parentId = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
id = cmd.get_16();
|
||||
var parentId = cmd.get_16();
|
||||
cmdSetTransientFor(id, parentId);
|
||||
break;
|
||||
|
||||
case 'd': // Delete surface
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
id = cmd.get_16();
|
||||
cmdDeleteSurface(id);
|
||||
break;
|
||||
|
||||
case 'm': // Move a surface
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var ops = cmd.charCodeAt(i++) - 48;
|
||||
id = cmd.get_16();
|
||||
var ops = cmd.get_flags();
|
||||
var has_pos = ops & 1;
|
||||
if (has_pos) {
|
||||
x = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
y = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
x = cmd.get_16s();
|
||||
y = cmd.get_16s();
|
||||
}
|
||||
var has_size = ops & 2;
|
||||
if (has_size) {
|
||||
w = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
h = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
w = cmd.get_16();
|
||||
h = cmd.get_16();
|
||||
}
|
||||
cmdMoveResizeSurface(id, has_pos, x, y, has_size, w, h);
|
||||
break;
|
||||
@@ -802,67 +782,50 @@ function handleCommands(cmdObj)
|
||||
case 'i': // Put image data surface
|
||||
q = new Object();
|
||||
q.op = 'i';
|
||||
q.id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
q.x = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
q.y = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var size = base64_32(cmd, i);
|
||||
i = i + 6;
|
||||
var url = cmd.slice(i, i + size);
|
||||
i = i + size;
|
||||
q.id = cmd.get_16();
|
||||
q.x = cmd.get_16();
|
||||
q.y = cmd.get_16();
|
||||
var url = cmd.get_image_url ();
|
||||
q.img = new Image();
|
||||
q.img.src = url;
|
||||
surfaces[q.id].drawQueue.push(q);
|
||||
if (!q.img.complete) {
|
||||
cmdObj.pos = i;
|
||||
q.img.onload = function() { handleOutstanding(); };
|
||||
q.img.onload = function() { cmd.free_image_url (url); handleOutstanding(); };
|
||||
return false;
|
||||
}
|
||||
cmd.free_image_url (url);
|
||||
break;
|
||||
|
||||
case 'b': // Copy rects
|
||||
q = new Object();
|
||||
q.op = 'b';
|
||||
q.id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
|
||||
var nrects = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
q.id = cmd.get_16();
|
||||
var nrects = cmd.get_16();
|
||||
|
||||
q.rects = [];
|
||||
for (var r = 0; r < nrects; r++) {
|
||||
var rect = new Object();
|
||||
rect.x = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
rect.y = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
rect.w = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
rect.h = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
rect.x = cmd.get_16();
|
||||
rect.y = cmd.get_16();
|
||||
rect.w = cmd.get_16();
|
||||
rect.h = cmd.get_16();
|
||||
q.rects.push (rect);
|
||||
}
|
||||
|
||||
q.dx = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
q.dy = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
q.dx = cmd.get_16s();
|
||||
q.dy = cmd.get_16s();
|
||||
surfaces[q.id].drawQueue.push(q);
|
||||
break;
|
||||
|
||||
case 'f': // Flush surface
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
id = cmd.get_16();
|
||||
|
||||
cmdFlushSurface(id);
|
||||
break;
|
||||
|
||||
case 'g': // Grab
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var ownerEvents = cmd[i++] == '1';
|
||||
id = cmd.get_16();
|
||||
var ownerEvents = cmd.get_bool ();
|
||||
|
||||
cmdGrabPointer(id, ownerEvents);
|
||||
break;
|
||||
@@ -888,13 +851,103 @@ function handleOutstanding()
|
||||
}
|
||||
}
|
||||
|
||||
function TextCommands(message) {
|
||||
this.data = message;
|
||||
this.length = message.length;
|
||||
this.pos = 0;
|
||||
}
|
||||
|
||||
TextCommands.prototype.get_char = function() {
|
||||
return this.data[this.pos++];
|
||||
};
|
||||
TextCommands.prototype.get_bool = function() {
|
||||
return this.get_char() == '1';
|
||||
};
|
||||
TextCommands.prototype.get_flags = function() {
|
||||
return this.get_char() - 48;
|
||||
}
|
||||
TextCommands.prototype.get_16 = function() {
|
||||
var n = base64_16(this.data, this.pos);
|
||||
this.pos = this.pos + 3;
|
||||
return n;
|
||||
};
|
||||
TextCommands.prototype.get_16s = function() {
|
||||
var n = base64_16s(this.data, this.pos);
|
||||
this.pos = this.pos + 3;
|
||||
return n;
|
||||
};
|
||||
TextCommands.prototype.get_32 = function() {
|
||||
var n = base64_32(this.data, this.pos);
|
||||
this.pos = this.pos + 6;
|
||||
return n;
|
||||
};
|
||||
TextCommands.prototype.get_image_url = function() {
|
||||
var size = this.get_32();
|
||||
var url = this.data.slice(this.pos, this.pos + size);
|
||||
this.pos = this.pos + size;
|
||||
return url;
|
||||
};
|
||||
TextCommands.prototype.free_image_url = function(url) {
|
||||
};
|
||||
|
||||
function BinCommands(message) {
|
||||
this.arraybuffer = message;
|
||||
this.u8 = new Uint8Array(message);
|
||||
this.length = this.u8.length;
|
||||
this.pos = 0;
|
||||
}
|
||||
|
||||
BinCommands.prototype.get_char = function() {
|
||||
return String.fromCharCode(this.u8[this.pos++]);
|
||||
};
|
||||
BinCommands.prototype.get_bool = function() {
|
||||
return this.u8[this.pos++] != 0;
|
||||
};
|
||||
BinCommands.prototype.get_flags = function() {
|
||||
return this.u8[this.pos++];
|
||||
}
|
||||
BinCommands.prototype.get_16 = function() {
|
||||
var v =
|
||||
this.u8[this.pos] +
|
||||
(this.u8[this.pos+1] << 8);
|
||||
this.pos = this.pos + 2;
|
||||
return v;
|
||||
};
|
||||
BinCommands.prototype.get_16s = function() {
|
||||
var v = this.get_16 ();
|
||||
if (v > 32767)
|
||||
return v - 65536;
|
||||
else
|
||||
return v;
|
||||
};
|
||||
BinCommands.prototype.get_32 = function() {
|
||||
var v =
|
||||
this.u8[this.pos] +
|
||||
(this.u8[this.pos+1] << 8) +
|
||||
(this.u8[this.pos+2] << 16) +
|
||||
(this.u8[this.pos+3] << 24);
|
||||
this.pos = this.pos + 4;
|
||||
return v;
|
||||
};
|
||||
BinCommands.prototype.get_image_url = function() {
|
||||
var size = this.get_32();
|
||||
var png_blob = new Blob ([this.arraybuffer.slice (this.pos, this.pos + size)], {type:"image/png"});
|
||||
var url = URL.createObjectURL(png_blob, {oneTimeOnly: true});
|
||||
this.pos = this.pos + size;
|
||||
return url;
|
||||
};
|
||||
BinCommands.prototype.free_image_url = function(url) {
|
||||
URL.revokeObjectURL(url);
|
||||
};
|
||||
|
||||
function handleMessage(message)
|
||||
{
|
||||
var cmdObj = {};
|
||||
cmdObj.data = message;
|
||||
cmdObj.pos = 0;
|
||||
|
||||
outstandingCommands.push(cmdObj);
|
||||
var cmd;
|
||||
if (message instanceof ArrayBuffer)
|
||||
cmd = new BinCommands(message);
|
||||
else
|
||||
cmd = new TextCommands(message);
|
||||
outstandingCommands.push(cmd);
|
||||
if (outstandingCommands.length == 1) {
|
||||
handleOutstanding();
|
||||
}
|
||||
@@ -2759,6 +2812,18 @@ function setupDocument(document)
|
||||
}
|
||||
}
|
||||
|
||||
function newWS(loc) {
|
||||
var ws = null;
|
||||
if ("WebSocket" in window) {
|
||||
ws = new WebSocket(loc, "broadway");
|
||||
} else if ("MozWebSocket" in window) { // Firefox 6
|
||||
ws = new MozWebSocket(loc);
|
||||
} else {
|
||||
alert("WebSocket not supported, broadway will not work!");
|
||||
}
|
||||
return ws;
|
||||
}
|
||||
|
||||
function connect()
|
||||
{
|
||||
var url = window.location.toString();
|
||||
@@ -2771,41 +2836,39 @@ function connect()
|
||||
|
||||
var loc = window.location.toString().replace("http:", "ws:");
|
||||
loc = loc.substr(0, loc.lastIndexOf('/')) + "/socket";
|
||||
var ws = null;
|
||||
|
||||
if ("WebSocket" in window) {
|
||||
ws = new WebSocket(loc, "broadway");
|
||||
} else if ("MozWebSocket" in window) { // Firefox 6
|
||||
ws = new MozWebSocket(loc);
|
||||
var supports_binary = newWS (loc + "-test").binaryType == "blob";
|
||||
if (supports_binary) {
|
||||
ws = newWS (loc + "-bin");
|
||||
ws.binaryType = "arraybuffer";
|
||||
} else {
|
||||
alert("WebSocket not supported, input will not work!");
|
||||
return;
|
||||
ws = newWS (loc);
|
||||
}
|
||||
|
||||
ws.onopen = function() {
|
||||
inputSocket = ws;
|
||||
var w, h;
|
||||
if (useToplevelWindows) {
|
||||
w = window.screen.width;
|
||||
h = window.screen.height;
|
||||
} else {
|
||||
ws.onopen = function() {
|
||||
inputSocket = ws;
|
||||
var w, h;
|
||||
if (useToplevelWindows) {
|
||||
w = window.screen.width;
|
||||
h = window.screen.height;
|
||||
} else {
|
||||
w = window.innerWidth;
|
||||
h = window.innerHeight;
|
||||
window.onresize = function(ev) {
|
||||
var w, h;
|
||||
w = window.innerWidth;
|
||||
h = window.innerHeight;
|
||||
window.onresize = function(ev) {
|
||||
var w, h;
|
||||
w = window.innerWidth;
|
||||
h = window.innerHeight;
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
}
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
ws.onclose = function() {
|
||||
inputSocket = null;
|
||||
};
|
||||
ws.onmessage = function(event) {
|
||||
handleMessage(event.data);
|
||||
};
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
}
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
ws.onclose = function() {
|
||||
inputSocket = null;
|
||||
};
|
||||
ws.onmessage = function(event) {
|
||||
handleMessage(event.data);
|
||||
};
|
||||
|
||||
setupDocument(document);
|
||||
window.onunload = function (ev) {
|
||||
|
||||
@@ -130,7 +130,7 @@ typedef struct HttpRequest {
|
||||
GString *request;
|
||||
} HttpRequest;
|
||||
|
||||
static void start_output (HttpRequest *request, gboolean proto_v7_plus);
|
||||
static void start_output (HttpRequest *request, gboolean proto_v7_plus, gboolean binary);
|
||||
|
||||
static void
|
||||
http_request_free (HttpRequest *request)
|
||||
@@ -149,6 +149,7 @@ struct BroadwayInput {
|
||||
gboolean seen_time;
|
||||
gint64 time_base;
|
||||
gboolean proto_v7_plus;
|
||||
gboolean binary;
|
||||
};
|
||||
|
||||
static void
|
||||
@@ -691,7 +692,7 @@ generate_handshake_response_wsietf_v7 (const gchar *key)
|
||||
}
|
||||
|
||||
static void
|
||||
start_input (HttpRequest *request)
|
||||
start_input (HttpRequest *request, gboolean binary)
|
||||
{
|
||||
char **lines;
|
||||
char *p;
|
||||
@@ -867,6 +868,7 @@ start_input (HttpRequest *request)
|
||||
input->display = request->display;
|
||||
input->connection = g_object_ref (request->connection);
|
||||
input->proto_v7_plus = proto_v7_plus;
|
||||
input->binary = binary;
|
||||
|
||||
data_buffer = g_buffered_input_stream_peek_buffer (G_BUFFERED_INPUT_STREAM (request->data), &data_buffer_size);
|
||||
input->buffer = g_byte_array_sized_new (data_buffer_size);
|
||||
@@ -874,7 +876,7 @@ start_input (HttpRequest *request)
|
||||
|
||||
broadway_display->input = input;
|
||||
|
||||
start_output (request, proto_v7_plus);
|
||||
start_output (request, proto_v7_plus, binary);
|
||||
|
||||
/* This will free and close the data input stream, but we got all the buffered content already */
|
||||
http_request_free (request);
|
||||
@@ -892,7 +894,7 @@ start_input (HttpRequest *request)
|
||||
}
|
||||
|
||||
static void
|
||||
start_output (HttpRequest *request, gboolean proto_v7_plus)
|
||||
start_output (HttpRequest *request, gboolean proto_v7_plus, gboolean binary)
|
||||
{
|
||||
GSocket *socket;
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
@@ -912,7 +914,7 @@ start_output (HttpRequest *request, gboolean proto_v7_plus)
|
||||
|
||||
broadway_display->output =
|
||||
broadway_output_new (g_io_stream_get_output_stream (G_IO_STREAM (request->connection)),
|
||||
broadway_display->saved_serial, proto_v7_plus);
|
||||
broadway_display->saved_serial, proto_v7_plus, binary);
|
||||
|
||||
_gdk_broadway_resync_windows ();
|
||||
|
||||
@@ -985,7 +987,9 @@ got_request (HttpRequest *request)
|
||||
else if (strcmp (escaped, "/broadway.js") == 0)
|
||||
send_data (request, "text/javascript", broadway_js, G_N_ELEMENTS(broadway_js) - 1);
|
||||
else if (strcmp (escaped, "/socket") == 0)
|
||||
start_input (request);
|
||||
start_input (request, FALSE);
|
||||
else if (strcmp (escaped, "/socket-bin") == 0)
|
||||
start_input (request, TRUE);
|
||||
else
|
||||
send_error (request, 404, "File not found");
|
||||
|
||||
|
||||
@@ -274,8 +274,6 @@ gdk_pre_parse_libgtk_only (void)
|
||||
_gdk_rendering_mode = GDK_RENDERING_MODE_RECORDING;
|
||||
}
|
||||
|
||||
g_type_init ();
|
||||
|
||||
/* Do any setup particular to the windowing system */
|
||||
gdk_display_manager_get ();
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
#include "config.h"
|
||||
|
||||
#include "gdkdisplay.h"
|
||||
#include "gdkmain.h"
|
||||
#include "gdkwindow.h"
|
||||
|
||||
/**
|
||||
* gdk_pointer_ungrab:
|
||||
|
||||
@@ -584,12 +584,11 @@ gdk_keymap_translate_keyboard_state (GdkKeymap *keymap,
|
||||
/**
|
||||
* gdk_keymap_add_virtual_modifiers:
|
||||
* @keymap: a #GdkKeymap
|
||||
* @state: (out): pointer to the modifier mask to change
|
||||
* @state: (inout): pointer to the modifier mask to change
|
||||
*
|
||||
* Adds virtual modifiers (i.e. Super, Hyper and Meta) which correspond
|
||||
* to the real modifiers (i.e Mod2, Mod3, ...) in @modifiers.
|
||||
* are set in @state to their non-virtual counterparts (i.e. Mod2,
|
||||
* Mod3,...) and set the corresponding bits in @state.
|
||||
* Maps the non-virtual modifiers (i.e Mod2, Mod3, ...) which are set
|
||||
* in @state to the virtual modifiers (i.e. Super, Hyper and Meta) and
|
||||
* set the corresponding bits in @state.
|
||||
*
|
||||
* GDK already does this before delivering key events, but for
|
||||
* compatibility reasons, it only sets the first virtual modifier
|
||||
@@ -612,7 +611,7 @@ gdk_keymap_add_virtual_modifiers (GdkKeymap *keymap,
|
||||
/**
|
||||
* gdk_keymap_map_virtual_modifiers:
|
||||
* @keymap: a #GdkKeymap
|
||||
* @state: (out): pointer to the modifier state to map
|
||||
* @state: (inout): pointer to the modifier state to map
|
||||
*
|
||||
* Maps the virtual modifiers (i.e. Super, Hyper and Meta) which
|
||||
* are set in @state to their non-virtual counterparts (i.e. Mod2,
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gdkkeys.h"
|
||||
#include "gdktypes.h"
|
||||
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gdkinternals.h"
|
||||
#include "gdkscreenprivate.h"
|
||||
#include "gdkrectangle.h"
|
||||
#include "gdkwindow.h"
|
||||
|
||||
@@ -29,7 +29,7 @@ G_BEGIN_DECLS
|
||||
|
||||
|
||||
/**
|
||||
* SECTION:gdktesting
|
||||
* SECTION:gdktestutils
|
||||
* @Short_description: Test utilities
|
||||
* @Title: Testing
|
||||
*
|
||||
|
||||
@@ -90,6 +90,16 @@
|
||||
*/
|
||||
#define GDK_VERSION_3_6 (G_ENCODE_VERSION (3, 6))
|
||||
|
||||
/**
|
||||
* GDK_VERSION_3_8:
|
||||
*
|
||||
* A macro that evaluates to the 3.8 version of GDK, in a format
|
||||
* that can be used by the C pre-processor.
|
||||
*
|
||||
* Since: 3.8
|
||||
*/
|
||||
#define GDK_VERSION_3_8 (G_ENCODE_VERSION (3, 8))
|
||||
|
||||
|
||||
/* evaluates to the current stable version; for development cycles,
|
||||
* this means the next stable target
|
||||
@@ -217,4 +227,18 @@
|
||||
# define GDK_AVAILABLE_IN_3_6
|
||||
#endif
|
||||
|
||||
#if GDK_VERSION_MIN_REQUIRED >= GDK_VERSION_3_8
|
||||
# define GDK_DEPRECATED_IN_3_8 GDK_DEPRECATED
|
||||
# define GDK_DEPRECATED_IN_3_8_FOR(f) GDK_DEPRECATED_FOR(f)
|
||||
#else
|
||||
# define GDK_DEPRECATED_IN_3_8
|
||||
# define GDK_DEPRECATED_IN_3_8_FOR(f)
|
||||
#endif
|
||||
|
||||
#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_3_8
|
||||
# define GDK_AVAILABLE_IN_3_8 GDK_UNAVAILABLE(3, 8)
|
||||
#else
|
||||
# define GDK_AVAILABLE_IN_3_8
|
||||
#endif
|
||||
|
||||
#endif /* __GDK_VERSION_MACROS_H__ */
|
||||
|
||||
@@ -65,25 +65,6 @@
|
||||
* <firstterm>composited</firstterm> window it is the responsibility of the
|
||||
* application to render the window contents at the right spot.
|
||||
* </para>
|
||||
* <example id="composited-window-example">
|
||||
* <title>Composited windows</title>
|
||||
* <programlisting>
|
||||
* <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" parse="text" href="../../../../examples/gdk/composited-window-example.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include>
|
||||
* </programlisting></example>
|
||||
* <para>
|
||||
* In the example <xref linkend="composited-window-example"/>, a button is
|
||||
* placed inside of an event box inside of a window. The event box is set as
|
||||
* composited and therefore is no longer automatically drawn to the screen.
|
||||
*
|
||||
* When the contents of the event box change, an expose event is generated on
|
||||
* its parent window (which, in this case, belongs to the toplevel #GtkWindow).
|
||||
* The expose handler for this widget is responsible for merging the changes
|
||||
* back on the screen in the way that it wishes.
|
||||
*
|
||||
* In our case, we merge the contents with a 50% transparency. We also set the
|
||||
* background colour of the window to red. The effect is that the background
|
||||
* shows through the button.
|
||||
* </para>
|
||||
* </refsect2>
|
||||
* <refsect2 id="OFFSCREEN-WINDOWS">
|
||||
* <title>Offscreen Windows</title>
|
||||
@@ -112,7 +93,7 @@
|
||||
* be it a toplevel window or a child window. In this setup the
|
||||
* GdkWindow (and other GdkDrawables) were platform independent classes,
|
||||
* and the actual platform specific implementation was in a delegate
|
||||
* object availible as "impl" in the window object.
|
||||
* object available as "impl" in the window object.
|
||||
*
|
||||
* With the addition of client side windows and offscreen windows this
|
||||
* changes a bit. The application-visible GdkWindow object behaves as
|
||||
@@ -687,6 +668,13 @@ gdk_window_has_no_impl (GdkWindow *window)
|
||||
return window->impl_window != window;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gdk_window_has_alpha (GdkWindow *window)
|
||||
{
|
||||
return !gdk_window_has_impl (window) &&
|
||||
window->has_alpha_background;
|
||||
}
|
||||
|
||||
static void
|
||||
remove_layered_child_area (GdkWindow *window,
|
||||
cairo_region_t *region)
|
||||
@@ -714,7 +702,7 @@ remove_layered_child_area (GdkWindow *window,
|
||||
continue;
|
||||
|
||||
/* Only non-impl children with alpha add to the layered region */
|
||||
if (!child->has_alpha_background && gdk_window_has_impl (child))
|
||||
if (!gdk_window_has_alpha (child))
|
||||
continue;
|
||||
|
||||
r.x = child->x;
|
||||
@@ -816,7 +804,7 @@ remove_child_area (GdkWindow *window,
|
||||
}
|
||||
}
|
||||
|
||||
if (child->has_alpha_background)
|
||||
if (gdk_window_has_alpha (child))
|
||||
{
|
||||
if (layered_region != NULL)
|
||||
cairo_region_union (layered_region, child_region);
|
||||
@@ -1382,6 +1370,11 @@ gdk_window_new (GdkWindow *parent,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (attributes_mask & GDK_WA_VISUAL)
|
||||
{
|
||||
g_return_val_if_fail (gdk_visual_get_screen (attributes->visual) == screen, NULL);
|
||||
}
|
||||
|
||||
display = gdk_screen_get_display (screen);
|
||||
|
||||
window = _gdk_display_create_window (display);
|
||||
@@ -3003,8 +2996,7 @@ gdk_window_begin_paint_region (GdkWindow *window,
|
||||
by being drawn in back to front order. However, if implicit paints are not used, for
|
||||
instance if it was flushed due to a non-double-buffered paint in the middle of the
|
||||
expose we need to copy in the existing data here. */
|
||||
if (!gdk_window_has_impl (window) &&
|
||||
window->has_alpha_background &&
|
||||
if (gdk_window_has_alpha (window) &&
|
||||
(!implicit_paint ||
|
||||
(implicit_paint && implicit_paint->flushed != NULL && !cairo_region_is_empty (implicit_paint->flushed))))
|
||||
{
|
||||
@@ -6175,7 +6167,7 @@ gdk_window_move_resize_internal (GdkWindow *window,
|
||||
* Everything in the old and new regions that is not copied must be
|
||||
* invalidated (including children) as this is newly exposed
|
||||
*/
|
||||
if (window->has_alpha_background)
|
||||
if (gdk_window_has_alpha (window))
|
||||
copy_area = cairo_region_create (); /* Copy nothing for alpha windows */
|
||||
else
|
||||
copy_area = cairo_region_copy (new_region);
|
||||
@@ -6399,7 +6391,7 @@ gdk_window_scroll (GdkWindow *window,
|
||||
impl_window = gdk_window_get_impl_window (window);
|
||||
|
||||
/* Calculate the area that can be gotten by copying the old area */
|
||||
if (window->has_alpha_background)
|
||||
if (gdk_window_has_alpha (window))
|
||||
copy_area = cairo_region_create (); /* Copy nothing for alpha windows */
|
||||
else
|
||||
copy_area = cairo_region_copy (window->clip_region);
|
||||
@@ -6487,7 +6479,7 @@ gdk_window_move_region (GdkWindow *window,
|
||||
impl_window = gdk_window_get_impl_window (window);
|
||||
|
||||
/* compute source regions */
|
||||
if (window->has_alpha_background)
|
||||
if (gdk_window_has_alpha (window))
|
||||
copy_area = cairo_region_create (); /* Copy nothing for alpha windows */
|
||||
else
|
||||
copy_area = cairo_region_copy (region);
|
||||
|
||||
@@ -141,6 +141,38 @@
|
||||
return inMove;
|
||||
}
|
||||
|
||||
-(void)checkSendEnterNotify
|
||||
{
|
||||
GdkWindow *window = [[self contentView] gdkWindow];
|
||||
GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
|
||||
|
||||
/* When a new window has been created, and the mouse
|
||||
* is in the window area, we will not receive an NSMouseEntered
|
||||
* event. Therefore, we synthesize an enter notify event manually.
|
||||
*/
|
||||
if (!initialPositionKnown)
|
||||
{
|
||||
initialPositionKnown = YES;
|
||||
|
||||
if (NSPointInRect ([NSEvent mouseLocation], [self frame]))
|
||||
{
|
||||
NSEvent *event;
|
||||
|
||||
event = [NSEvent enterExitEventWithType: NSMouseEntered
|
||||
location: [self mouseLocationOutsideOfEventStream]
|
||||
modifierFlags: 0
|
||||
timestamp: [[NSApp currentEvent] timestamp]
|
||||
windowNumber: [impl->toplevel windowNumber]
|
||||
context: NULL
|
||||
eventNumber: 0
|
||||
trackingNumber: [impl->view trackingRect]
|
||||
userData: nil];
|
||||
|
||||
[NSApp postEvent:event atStart:NO];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-(void)windowDidMove:(NSNotification *)aNotification
|
||||
{
|
||||
GdkWindow *window = [[self contentView] gdkWindow];
|
||||
@@ -157,6 +189,8 @@
|
||||
event->configure.height = window->height;
|
||||
|
||||
_gdk_event_queue_append (gdk_display_get_default (), event);
|
||||
|
||||
[self checkSendEnterNotify];
|
||||
}
|
||||
|
||||
-(void)windowDidResize:(NSNotification *)aNotification
|
||||
@@ -186,6 +220,8 @@
|
||||
event->configure.height = window->height;
|
||||
|
||||
_gdk_event_queue_append (gdk_display_get_default (), event);
|
||||
|
||||
[self checkSendEnterNotify];
|
||||
}
|
||||
|
||||
-(id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag screen:(NSScreen *)screen
|
||||
@@ -283,6 +319,8 @@
|
||||
[impl->toplevel orderFront:nil];
|
||||
|
||||
inShowOrHide = NO;
|
||||
|
||||
[self checkSendEnterNotify];
|
||||
}
|
||||
|
||||
- (void)hide
|
||||
@@ -293,6 +331,8 @@
|
||||
inShowOrHide = YES;
|
||||
[impl->toplevel orderOut:nil];
|
||||
inShowOrHide = NO;
|
||||
|
||||
initialPositionKnown = NO;
|
||||
}
|
||||
|
||||
- (BOOL)trackManualMove
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
@interface GdkQuartzNSWindow : NSWindow {
|
||||
BOOL inMove;
|
||||
BOOL inShowOrHide;
|
||||
BOOL initialPositionKnown;
|
||||
|
||||
/* Manually triggered move/resize (not by the window manager) */
|
||||
BOOL inManualMove;
|
||||
|
||||
@@ -81,6 +81,25 @@
|
||||
if (NSEqualRects (rect, NSZeroRect))
|
||||
return;
|
||||
|
||||
if (!GDK_WINDOW_IS_MAPPED (gdk_window))
|
||||
{
|
||||
/* If the window is not yet mapped, clip_region_with_children
|
||||
* will be empty causing the usual code below to draw nothing.
|
||||
* To not see garbage on the screen, we draw an aesthetic color
|
||||
* here. The garbage would be visible if any widget enabled
|
||||
* the NSView's CALayer in order to add sublayers for custom
|
||||
* native rendering.
|
||||
*/
|
||||
[NSGraphicsContext saveGraphicsState];
|
||||
|
||||
[[NSColor windowBackgroundColor] setFill];
|
||||
[NSBezierPath fillRect:rect];
|
||||
|
||||
[NSGraphicsContext restoreGraphicsState];
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Clear our own bookkeeping of regions that need display */
|
||||
if (impl->needs_display_region)
|
||||
{
|
||||
@@ -148,15 +167,6 @@
|
||||
owner:self
|
||||
userData:nil
|
||||
assumeInside:NO];
|
||||
|
||||
if (NSPointInRect ([[self window] convertScreenToBase:[NSEvent mouseLocation]], rect))
|
||||
{
|
||||
/* When a new window (and thus view) has been created, and the mouse
|
||||
* is in the window area, we will not receive an NSMouseEntered
|
||||
* event. Therefore, we synthesize an enter notify event manually.
|
||||
*/
|
||||
_gdk_quartz_events_send_enter_notify_event (gdk_window);
|
||||
}
|
||||
}
|
||||
|
||||
-(void)viewDidMoveToWindow
|
||||
|
||||
@@ -635,21 +635,6 @@ gdk_event_check (GSource *source)
|
||||
|
||||
gdk_threads_enter ();
|
||||
|
||||
/* Refresh the autorelease pool if we're at the base CFRunLoop level
|
||||
* (indicated by current_loop_level) and the base g_main_loop level
|
||||
* (indicated by g_main_depth()). Messing with the autorelease pool at
|
||||
* any level of nesting can cause access to deallocated memory because
|
||||
* autorelease_pool is static and releasing a pool will cause all pools
|
||||
* allocated inside of it to be released as well.
|
||||
*/
|
||||
if (current_loop_level == 0 && g_main_depth() == 0)
|
||||
{
|
||||
if (autorelease_pool)
|
||||
[autorelease_pool drain];
|
||||
|
||||
autorelease_pool = [[NSAutoreleasePool alloc] init];
|
||||
}
|
||||
|
||||
retval = (_gdk_event_queue_find_first (_gdk_display) != NULL ||
|
||||
_gdk_quartz_event_loop_check_pending ());
|
||||
|
||||
@@ -667,6 +652,21 @@ gdk_event_dispatch (GSource *source,
|
||||
|
||||
gdk_threads_enter ();
|
||||
|
||||
/* Refresh the autorelease pool if we're at the base CFRunLoop level
|
||||
* (indicated by current_loop_level) and the base g_main_loop level
|
||||
* (indicated by g_main_depth()). Messing with the autorelease pool at
|
||||
* any level of nesting can cause access to deallocated memory because
|
||||
* autorelease_pool is static and releasing a pool will cause all pools
|
||||
* allocated inside of it to be released as well.
|
||||
*/
|
||||
if (current_loop_level == 0 && g_main_depth() == 0)
|
||||
{
|
||||
if (autorelease_pool)
|
||||
[autorelease_pool drain];
|
||||
|
||||
autorelease_pool = [[NSAutoreleasePool alloc] init];
|
||||
}
|
||||
|
||||
_gdk_quartz_display_queue_events (_gdk_display);
|
||||
|
||||
event = _gdk_event_unqueue (_gdk_display);
|
||||
@@ -703,6 +703,10 @@ poll_func (GPollFD *ufds,
|
||||
NSDate *limit_date;
|
||||
gint n_ready;
|
||||
|
||||
static GPollFD *last_ufds;
|
||||
|
||||
last_ufds = ufds;
|
||||
|
||||
n_ready = select_thread_start_poll (ufds, nfds, timeout_);
|
||||
if (n_ready > 0)
|
||||
timeout_ = 0;
|
||||
@@ -721,7 +725,16 @@ poll_func (GPollFD *ufds,
|
||||
dequeue: YES];
|
||||
getting_events--;
|
||||
|
||||
if (n_ready < 0)
|
||||
/* We check if last_ufds did not change since the time this function was
|
||||
* called. It is possible that a recursive main loop (and thus recursive
|
||||
* invocation of this poll function) is triggered while in
|
||||
* nextEventMatchingMask:. If during that time new fds are added,
|
||||
* the cached fds array might be replaced in g_main_context_iterate().
|
||||
* So, we should avoid accessing the old fd array (still pointed at by
|
||||
* ufds) here in that case, since it might have been freed. We avoid this
|
||||
* by not calling the collect stage.
|
||||
*/
|
||||
if (last_ufds == ufds && n_ready < 0)
|
||||
n_ready = select_thread_collect_poll (ufds, nfds);
|
||||
|
||||
if (event &&
|
||||
|
||||
@@ -58,10 +58,62 @@ static GdkWindow *find_toplevel_under_pointer (GdkDisplay *display,
|
||||
gint *y);
|
||||
|
||||
|
||||
static void
|
||||
gdk_quartz_ns_notification_callback (CFNotificationCenterRef center,
|
||||
void *observer,
|
||||
CFStringRef name,
|
||||
const void *object,
|
||||
CFDictionaryRef userInfo)
|
||||
{
|
||||
GdkEvent new_event;
|
||||
|
||||
new_event.type = GDK_SETTING;
|
||||
new_event.setting.window = gdk_screen_get_root_window (_gdk_screen);
|
||||
new_event.setting.send_event = FALSE;
|
||||
new_event.setting.action = GDK_SETTING_ACTION_CHANGED;
|
||||
new_event.setting.name = NULL;
|
||||
|
||||
/* Translate name */
|
||||
if (CFStringCompare (name,
|
||||
CFSTR("AppleNoRedisplayAppearancePreferenceChanged"),
|
||||
0) == kCFCompareEqualTo)
|
||||
new_event.setting.name = "gtk-primary-button-warps-slider";
|
||||
|
||||
if (!new_event.setting.name)
|
||||
return;
|
||||
|
||||
gdk_event_put (&new_event);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_quartz_events_init_notifications (void)
|
||||
{
|
||||
static gboolean notifications_initialized = FALSE;
|
||||
|
||||
if (notifications_initialized)
|
||||
return;
|
||||
notifications_initialized = TRUE;
|
||||
|
||||
/* Initialize any handlers for notifications we want to push to GTK
|
||||
* through GdkEventSettings.
|
||||
*/
|
||||
|
||||
/* This is an undocumented *distributed* notification to listen for changes
|
||||
* in scrollbar jump behavior. It is used by LibreOffice and WebKit as well.
|
||||
*/
|
||||
CFNotificationCenterAddObserver (CFNotificationCenterGetDistributedCenter (),
|
||||
NULL,
|
||||
&gdk_quartz_ns_notification_callback,
|
||||
CFSTR ("AppleNoRedisplayAppearancePreferenceChanged"),
|
||||
NULL,
|
||||
CFNotificationSuspensionBehaviorDeliverImmediately);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_quartz_events_init (void)
|
||||
{
|
||||
_gdk_quartz_event_loop_init ();
|
||||
gdk_quartz_events_init_notifications ();
|
||||
|
||||
current_keyboard_window = g_object_ref (_gdk_root);
|
||||
}
|
||||
@@ -349,34 +401,89 @@ get_window_point_from_screen_point (GdkWindow *window,
|
||||
*y = window->height - point.y;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_mouse_button_press_event (NSEventType type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case NSLeftMouseDown:
|
||||
case NSRightMouseDown:
|
||||
case NSOtherMouseDown:
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static GdkWindow *
|
||||
get_toplevel_from_ns_event (NSEvent *nsevent,
|
||||
NSPoint *screen_point,
|
||||
gint *x,
|
||||
gint *y)
|
||||
{
|
||||
GdkWindow *toplevel;
|
||||
GdkWindow *toplevel = NULL;
|
||||
|
||||
if ([nsevent window])
|
||||
{
|
||||
GdkQuartzView *view;
|
||||
NSPoint point;
|
||||
NSPoint point, view_point;
|
||||
NSRect view_frame;
|
||||
|
||||
view = (GdkQuartzView *)[[nsevent window] contentView];
|
||||
|
||||
toplevel = [view gdkWindow];
|
||||
|
||||
point = [nsevent locationInWindow];
|
||||
*screen_point = [[nsevent window] convertBaseToScreen:point];
|
||||
view_point = [view convertPoint:point fromView:nil];
|
||||
view_frame = [view frame];
|
||||
|
||||
*x = point.x;
|
||||
*y = toplevel->height - point.y;
|
||||
/* NSEvents come in with a window set, but with window coordinates
|
||||
* out of window bounds. For e.g. moved events this is fine, we use
|
||||
* this information to properly handle enter/leave notify and motion
|
||||
* events. For mouse button press/release, we want to avoid forwarding
|
||||
* these events however, because the window they relate to is not the
|
||||
* window set in the event. This situation appears to occur when button
|
||||
* presses come in just before (or just after?) a window is resized and
|
||||
* also when a button press occurs on the OS X window titlebar.
|
||||
*
|
||||
* By setting toplevel to NULL, we do another attempt to get the right
|
||||
* toplevel window below.
|
||||
*/
|
||||
if (is_mouse_button_press_event ([nsevent type]) &&
|
||||
(view_point.x < view_frame.origin.x ||
|
||||
view_point.x >= view_frame.origin.x + view_frame.size.width ||
|
||||
view_point.y < view_frame.origin.y ||
|
||||
view_point.y >= view_frame.origin.y + view_frame.size.height))
|
||||
{
|
||||
toplevel = NULL;
|
||||
|
||||
/* This is a hack for button presses to break all grabs. E.g. if
|
||||
* a menu is open and one clicks on the title bar (or anywhere
|
||||
* out of window bounds), we really want to pop down the menu (by
|
||||
* breaking the grabs) before OS X handles the action of the title
|
||||
* bar button.
|
||||
*
|
||||
* Because we cannot ingest this event into GDK, we have to do it
|
||||
* here, not very nice.
|
||||
*/
|
||||
_gdk_quartz_events_break_all_grabs (get_time_from_ns_event (nsevent));
|
||||
}
|
||||
else
|
||||
{
|
||||
*screen_point = [[nsevent window] convertBaseToScreen:point];
|
||||
|
||||
*x = point.x;
|
||||
*y = toplevel->height - point.y;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
if (!toplevel)
|
||||
{
|
||||
/* Fallback used when no NSWindow set. This happens e.g. when
|
||||
* we allow motion events without a window set in gdk_event_translate()
|
||||
* that occur immediately after the main menu bar was clicked/used.
|
||||
* This fallback will not return coordinates contained in a window's
|
||||
* titlebar.
|
||||
*/
|
||||
*screen_point = [NSEvent mouseLocation];
|
||||
toplevel = find_toplevel_under_pointer (_gdk_display,
|
||||
@@ -423,7 +530,7 @@ generate_motion_event (GdkWindow *window)
|
||||
|
||||
event->any.type = GDK_MOTION_NOTIFY;
|
||||
event->motion.window = window;
|
||||
event->motion.time = GDK_CURRENT_TIME;
|
||||
event->motion.time = get_time_from_ns_event ([NSApp currentEvent]);
|
||||
event->motion.x = x;
|
||||
event->motion.y = y;
|
||||
event->motion.x_root = x_root;
|
||||
@@ -482,39 +589,6 @@ _gdk_quartz_events_update_focus_window (GdkWindow *window,
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_quartz_events_send_enter_notify_event (GdkWindow *window)
|
||||
{
|
||||
NSPoint screen_point;
|
||||
GdkEvent *event;
|
||||
gint x, y, x_root, y_root;
|
||||
|
||||
event = gdk_event_new (GDK_ENTER_NOTIFY);
|
||||
event->any.window = NULL;
|
||||
event->any.send_event = FALSE;
|
||||
|
||||
screen_point = [NSEvent mouseLocation];
|
||||
|
||||
_gdk_quartz_window_nspoint_to_gdk_xy (screen_point, &x_root, &y_root);
|
||||
get_window_point_from_screen_point (window, screen_point, &x, &y);
|
||||
|
||||
event->crossing.window = window;
|
||||
event->crossing.subwindow = NULL;
|
||||
event->crossing.time = GDK_CURRENT_TIME;
|
||||
event->crossing.x = x;
|
||||
event->crossing.y = y;
|
||||
event->crossing.x_root = x_root;
|
||||
event->crossing.y_root = y_root;
|
||||
event->crossing.mode = GDK_CROSSING_NORMAL;
|
||||
event->crossing.detail = GDK_NOTIFY_ANCESTOR;
|
||||
event->crossing.state = _gdk_quartz_events_get_current_keyboard_modifiers () |
|
||||
_gdk_quartz_events_get_current_mouse_modifiers ();
|
||||
|
||||
gdk_event_set_device (event, _gdk_display->core_pointer);
|
||||
|
||||
append_event (event, TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_quartz_events_send_map_event (GdkWindow *window)
|
||||
{
|
||||
@@ -548,6 +622,18 @@ find_toplevel_under_pointer (GdkDisplay *display,
|
||||
if (toplevel && WINDOW_IS_TOPLEVEL (toplevel))
|
||||
get_window_point_from_screen_point (toplevel, screen_point, x, y);
|
||||
|
||||
if (toplevel)
|
||||
{
|
||||
/* If the coordinates are out of window bounds, this toplevel is not
|
||||
* under the pointer and we thus return NULL. This can occur when
|
||||
* toplevel under pointer has not yet been updated due to a very recent
|
||||
* window resize. Alternatively, we should no longer be relying on
|
||||
* the toplevel_under_pointer value which is maintained in gdkwindow.c.
|
||||
*/
|
||||
if (*x < 0 || *y < 0 || *x >= toplevel->width || *y >= toplevel->height)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return toplevel;
|
||||
}
|
||||
|
||||
@@ -720,6 +806,8 @@ find_window_for_ns_event (NSEvent *nsevent,
|
||||
view = (GdkQuartzView *)[[nsevent window] contentView];
|
||||
|
||||
toplevel = get_toplevel_from_ns_event (nsevent, &screen_point, x, y);
|
||||
if (!toplevel)
|
||||
return NULL;
|
||||
_gdk_quartz_window_nspoint_to_gdk_xy (screen_point, x_root, y_root);
|
||||
|
||||
event_type = [nsevent type];
|
||||
@@ -1033,8 +1121,9 @@ synthesize_crossing_event (GdkWindow *window,
|
||||
switch ([nsevent type])
|
||||
{
|
||||
case NSMouseEntered:
|
||||
/* Enter events are considered always to be from the root window as we
|
||||
* can't know for sure from what window we enter.
|
||||
/* Enter events are considered always to be from another toplevel
|
||||
* window, this shouldn't negatively affect any app or gtk code,
|
||||
* and is the only way to make GtkMenu work. EEK EEK EEK.
|
||||
*/
|
||||
if (!(window->event_mask & GDK_ENTER_NOTIFY_MASK))
|
||||
return FALSE;
|
||||
@@ -1044,14 +1133,11 @@ synthesize_crossing_event (GdkWindow *window,
|
||||
x_root, y_root,
|
||||
GDK_ENTER_NOTIFY,
|
||||
GDK_CROSSING_NORMAL,
|
||||
GDK_NOTIFY_ANCESTOR);
|
||||
GDK_NOTIFY_NONLINEAR);
|
||||
return TRUE;
|
||||
|
||||
case NSMouseExited:
|
||||
/* Exited always is to the root window as far as we are concerned,
|
||||
* since there is no way to reliably get information about what new
|
||||
* window is entered when exiting one.
|
||||
*/
|
||||
/* See above */
|
||||
if (!(window->event_mask & GDK_LEAVE_NOTIFY_MASK))
|
||||
return FALSE;
|
||||
|
||||
@@ -1060,7 +1146,7 @@ synthesize_crossing_event (GdkWindow *window,
|
||||
x_root, y_root,
|
||||
GDK_LEAVE_NOTIFY,
|
||||
GDK_CROSSING_NORMAL,
|
||||
GDK_NOTIFY_ANCESTOR);
|
||||
GDK_NOTIFY_NONLINEAR);
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
@@ -1257,9 +1343,9 @@ gdk_event_translate (GdkEvent *event,
|
||||
}
|
||||
|
||||
/* Also when in a manual resize, we ignore events so that these are
|
||||
* pushed to GdkQuartzWindow's sendEvent handler.
|
||||
* pushed to GdkQuartzNSWindow's sendEvent handler.
|
||||
*/
|
||||
if ([(GdkQuartzWindow *)nswindow isInManualResize])
|
||||
if ([(GdkQuartzNSWindow *)nswindow isInManualResize])
|
||||
return FALSE;
|
||||
|
||||
/* Find the right GDK window to send the event to, taking grabs and
|
||||
@@ -1386,7 +1472,9 @@ gdk_event_translate (GdkEvent *event,
|
||||
|
||||
if (dx != 0.0 || dy != 0.0)
|
||||
{
|
||||
if ([nsevent hasPreciseScrollingDeltas])
|
||||
#ifdef AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER
|
||||
if (gdk_quartz_osx_version() >= GDK_OSX_LION &&
|
||||
[nsevent hasPreciseScrollingDeltas])
|
||||
{
|
||||
GdkEvent *emulated_event;
|
||||
|
||||
@@ -1398,6 +1486,7 @@ gdk_event_translate (GdkEvent *event,
|
||||
append_event (emulated_event, TRUE);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
fill_scroll_event (window, event, nsevent,
|
||||
x, y, x_root, y_root,
|
||||
dx, dy, direction);
|
||||
@@ -1548,6 +1637,19 @@ _gdk_quartz_screen_get_setting (GdkScreen *screen,
|
||||
|
||||
GDK_QUARTZ_RELEASE_POOL;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else if (strcmp (name, "gtk-primary-button-warps-slider") == 0)
|
||||
{
|
||||
GDK_QUARTZ_ALLOC_POOL;
|
||||
|
||||
BOOL setting = [[NSUserDefaults standardUserDefaults] boolForKey:@"AppleScrollerPagingBehavior"];
|
||||
|
||||
/* If the Apple property is YES, it means "warp" */
|
||||
g_value_set_boolean (value, setting == YES);
|
||||
|
||||
GDK_QUARTZ_RELEASE_POOL;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
@@ -176,7 +176,7 @@ const static struct {
|
||||
{ 67, GDK_KEY_asterisk, GDK_KEY_KP_Multiply },
|
||||
{ 69, GDK_KEY_plus, GDK_KEY_KP_Add },
|
||||
{ 75, GDK_KEY_slash, GDK_KEY_KP_Divide },
|
||||
{ 76, 0x01000003, GDK_KEY_KP_Enter },
|
||||
{ 76, GDK_KEY_Return, GDK_KEY_KP_Enter },
|
||||
{ 78, GDK_KEY_minus, GDK_KEY_KP_Subtract },
|
||||
{ 81, GDK_KEY_equal, GDK_KEY_KP_Equal },
|
||||
{ 82, GDK_KEY_0, GDK_KEY_KP_0 },
|
||||
|
||||
@@ -64,7 +64,6 @@ void _gdk_quartz_events_send_map_event (GdkWindow *window);
|
||||
GdkModifierType _gdk_quartz_events_get_current_keyboard_modifiers (void);
|
||||
GdkModifierType _gdk_quartz_events_get_current_mouse_modifiers (void);
|
||||
|
||||
void _gdk_quartz_events_send_enter_notify_event (GdkWindow *window);
|
||||
void _gdk_quartz_events_break_all_grabs (guint32 time);
|
||||
|
||||
/* Event loop */
|
||||
|
||||
@@ -2315,28 +2315,31 @@ gdk_quartz_window_focus (GdkWindow *window,
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
gint window_type_hint_to_level (GdkWindowTypeHint hint)
|
||||
static gint
|
||||
window_type_hint_to_level (GdkWindowTypeHint hint)
|
||||
{
|
||||
/* the order in this switch statement corresponds to the actual
|
||||
* stacking order: the first group is top, the last group is bottom
|
||||
*/
|
||||
switch (hint)
|
||||
{
|
||||
case GDK_WINDOW_TYPE_HINT_DOCK:
|
||||
case GDK_WINDOW_TYPE_HINT_UTILITY:
|
||||
return NSFloatingWindowLevel;
|
||||
case GDK_WINDOW_TYPE_HINT_POPUP_MENU:
|
||||
case GDK_WINDOW_TYPE_HINT_COMBO:
|
||||
case GDK_WINDOW_TYPE_HINT_DND:
|
||||
case GDK_WINDOW_TYPE_HINT_TOOLTIP:
|
||||
return NSPopUpMenuWindowLevel;
|
||||
|
||||
case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
|
||||
case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
|
||||
return NSStatusWindowLevel;
|
||||
|
||||
case GDK_WINDOW_TYPE_HINT_MENU: /* Torn-off menu */
|
||||
case GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU: /* Menu from menubar */
|
||||
return NSTornOffMenuWindowLevel;
|
||||
|
||||
case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
|
||||
case GDK_WINDOW_TYPE_HINT_TOOLTIP:
|
||||
return NSStatusWindowLevel;
|
||||
|
||||
case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
|
||||
case GDK_WINDOW_TYPE_HINT_POPUP_MENU:
|
||||
case GDK_WINDOW_TYPE_HINT_COMBO:
|
||||
case GDK_WINDOW_TYPE_HINT_DND:
|
||||
return NSPopUpMenuWindowLevel;
|
||||
case GDK_WINDOW_TYPE_HINT_DOCK:
|
||||
case GDK_WINDOW_TYPE_HINT_UTILITY:
|
||||
return NSFloatingWindowLevel;
|
||||
|
||||
case GDK_WINDOW_TYPE_HINT_NORMAL: /* Normal toplevel window */
|
||||
case GDK_WINDOW_TYPE_HINT_DIALOG: /* Dialog window */
|
||||
@@ -2351,7 +2354,7 @@ gint window_type_hint_to_level (GdkWindowTypeHint hint)
|
||||
return NSNormalWindowLevel;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
static gboolean
|
||||
window_type_hint_to_shadow (GdkWindowTypeHint hint)
|
||||
{
|
||||
switch (hint)
|
||||
@@ -2381,13 +2384,31 @@ window_type_hint_to_shadow (GdkWindowTypeHint hint)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
window_type_hint_to_hides_on_deactivate (GdkWindowTypeHint hint)
|
||||
{
|
||||
switch (hint)
|
||||
{
|
||||
case GDK_WINDOW_TYPE_HINT_UTILITY:
|
||||
case GDK_WINDOW_TYPE_HINT_MENU: /* Torn-off menu */
|
||||
case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
|
||||
case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
|
||||
case GDK_WINDOW_TYPE_HINT_TOOLTIP:
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_quartz_window_set_type_hint (GdkWindow *window,
|
||||
GdkWindowTypeHint hint)
|
||||
{
|
||||
GdkWindowImplQuartz *impl;
|
||||
|
||||
|
||||
if (GDK_WINDOW_DESTROYED (window) ||
|
||||
!WINDOW_IS_TOPLEVEL (window))
|
||||
return;
|
||||
@@ -2402,6 +2423,7 @@ gdk_quartz_window_set_type_hint (GdkWindow *window,
|
||||
|
||||
[impl->toplevel setHasShadow: window_type_hint_to_shadow (hint)];
|
||||
[impl->toplevel setLevel: window_type_hint_to_level (hint)];
|
||||
[impl->toplevel setHidesOnDeactivate: window_type_hint_to_hides_on_deactivate (hint)];
|
||||
}
|
||||
|
||||
static GdkWindowTypeHint
|
||||
@@ -2619,6 +2641,7 @@ gdk_quartz_window_set_decorations (GdkWindow *window,
|
||||
defer:NO];
|
||||
[impl->toplevel setHasShadow: window_type_hint_to_shadow (impl->type_hint)];
|
||||
[impl->toplevel setLevel: window_type_hint_to_level (impl->type_hint)];
|
||||
[impl->toplevel setHidesOnDeactivate: window_type_hint_to_hides_on_deactivate (impl->type_hint)];
|
||||
[impl->toplevel setContentView:old_view];
|
||||
}
|
||||
|
||||
|
||||
@@ -183,6 +183,7 @@ gdk_device_core_set_window_cursor (GdkDevice *device,
|
||||
x, y);
|
||||
wl_surface_attach (wd->pointer_surface, buffer, 0, 0);
|
||||
wl_surface_damage (wd->pointer_surface, 0, 0, w, h);
|
||||
wl_surface_commit(wd->pointer_surface);
|
||||
|
||||
g_object_unref (cursor);
|
||||
}
|
||||
@@ -1240,14 +1241,14 @@ static GdkModifierType
|
||||
get_modifier (struct xkb_state *state)
|
||||
{
|
||||
GdkModifierType modifiers = 0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_SHIFT, XKB_STATE_EFFECTIVE) > 0)?GDK_SHIFT_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_CAPS, XKB_STATE_EFFECTIVE) > 0)?GDK_LOCK_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_CTRL, XKB_STATE_EFFECTIVE) > 0)?GDK_CONTROL_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_ALT, XKB_STATE_EFFECTIVE) > 0)?GDK_MOD1_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, "Mod2", XKB_STATE_EFFECTIVE) > 0)?GDK_MOD2_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, "Mod3", XKB_STATE_EFFECTIVE) > 0)?GDK_MOD3_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_LOGO, XKB_STATE_EFFECTIVE) > 0)?GDK_MOD4_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, "Mod5", XKB_STATE_EFFECTIVE) > 0)?GDK_MOD5_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_SHIFT, XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_SHIFT_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_CAPS, XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_LOCK_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_CTRL, XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_CONTROL_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_ALT, XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_MOD1_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, "Mod2", XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_MOD2_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, "Mod3", XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_MOD3_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_LOGO, XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_MOD4_MASK:0;
|
||||
modifiers |= (xkb_state_mod_name_is_active (state, "Mod5", XKB_STATE_MODS_EFFECTIVE) > 0)?GDK_MOD5_MASK:0;
|
||||
|
||||
return modifiers;
|
||||
}
|
||||
@@ -1324,16 +1325,11 @@ deliver_key_event(GdkWaylandDevice *device,
|
||||
struct xkb_state *xkb_state;
|
||||
GdkKeymap *keymap;
|
||||
xkb_keysym_t sym;
|
||||
uint32_t num_syms;
|
||||
const xkb_keysym_t *syms;
|
||||
|
||||
keymap = device->keymap;
|
||||
xkb_state = _gdk_wayland_keymap_get_xkb_state (keymap);
|
||||
|
||||
num_syms = xkb_key_get_syms (xkb_state, key, &syms);
|
||||
sym = XKB_KEY_NoSymbol;
|
||||
if (num_syms == 1)
|
||||
sym = syms[0];
|
||||
sym = xkb_state_key_get_one_sym (xkb_state, key);
|
||||
|
||||
device->time = time;
|
||||
device->modifiers = get_modifier (xkb_state);
|
||||
|
||||
@@ -96,7 +96,8 @@ static void
|
||||
output_handle_geometry(void *data,
|
||||
struct wl_output *wl_output,
|
||||
int x, int y, int physical_width, int physical_height,
|
||||
int subpixel, const char *make, const char *model)
|
||||
int subpixel, const char *make, const char *model,
|
||||
int32_t transform)
|
||||
{
|
||||
/*
|
||||
g_signal_emit_by_name (screen, "monitors-changed");
|
||||
@@ -119,8 +120,8 @@ static const struct wl_output_listener output_listener = {
|
||||
};
|
||||
|
||||
static void
|
||||
gdk_display_handle_global(struct wl_display *display, uint32_t id,
|
||||
const char *interface, uint32_t version, void *data)
|
||||
gdk_registry_handle_global(void *data, struct wl_registry *registry, uint32_t id,
|
||||
const char *interface, uint32_t version)
|
||||
{
|
||||
GdkWaylandDisplay *display_wayland = data;
|
||||
GdkDisplay *gdk_display = GDK_DISPLAY_OBJECT (data);
|
||||
@@ -128,27 +129,29 @@ gdk_display_handle_global(struct wl_display *display, uint32_t id,
|
||||
|
||||
if (strcmp(interface, "wl_compositor") == 0) {
|
||||
display_wayland->compositor =
|
||||
wl_display_bind(display, id, &wl_compositor_interface);
|
||||
wl_registry_bind(display_wayland->wl_registry, id, &wl_compositor_interface, 1);
|
||||
} else if (strcmp(interface, "wl_shm") == 0) {
|
||||
display_wayland->shm = wl_display_bind(display, id, &wl_shm_interface);
|
||||
display_wayland->shm =
|
||||
wl_registry_bind(display_wayland->wl_registry, id, &wl_shm_interface, 1);
|
||||
|
||||
/* SHM interface is prerequisite */
|
||||
_gdk_wayland_display_load_cursor_theme(display_wayland);
|
||||
} else if (strcmp(interface, "wl_shell") == 0) {
|
||||
display_wayland->shell = wl_display_bind(display, id, &wl_shell_interface);
|
||||
display_wayland->shell =
|
||||
wl_registry_bind(display_wayland->wl_registry, id, &wl_shell_interface, 1);
|
||||
} else if (strcmp(interface, "wl_output") == 0) {
|
||||
display_wayland->output =
|
||||
wl_display_bind(display, id, &wl_output_interface);
|
||||
wl_registry_bind(display_wayland->wl_registry, id, &wl_output_interface, 1);
|
||||
wl_output_add_listener(display_wayland->output,
|
||||
&output_listener, display_wayland);
|
||||
} else if (strcmp(interface, "wl_seat") == 0) {
|
||||
seat = wl_display_bind (display, id, &wl_seat_interface);
|
||||
seat = wl_registry_bind(display_wayland->wl_registry, id, &wl_seat_interface, 1);
|
||||
_gdk_wayland_device_manager_add_device (gdk_display->device_manager,
|
||||
seat);
|
||||
} else if (strcmp(interface, "wl_data_device_manager") == 0) {
|
||||
display_wayland->data_device_manager =
|
||||
wl_display_bind(display, id,
|
||||
&wl_data_device_manager_interface);
|
||||
wl_registry_bind(display_wayland->wl_registry, id,
|
||||
&wl_data_device_manager_interface, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -210,6 +213,10 @@ gdk_display_init_egl(GdkDisplay *display)
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct wl_registry_listener registry_listener = {
|
||||
gdk_registry_handle_global
|
||||
};
|
||||
|
||||
GdkDisplay *
|
||||
_gdk_wayland_display_open (const gchar *display_name)
|
||||
{
|
||||
@@ -231,14 +238,13 @@ _gdk_wayland_display_open (const gchar *display_name)
|
||||
display->device_manager = _gdk_wayland_device_manager_new (display);
|
||||
|
||||
/* Set up listener so we'll catch all events. */
|
||||
wl_display_add_global_listener(display_wayland->wl_display,
|
||||
gdk_display_handle_global, display_wayland);
|
||||
display_wayland->wl_registry = wl_display_get_registry(display_wayland->wl_display);
|
||||
wl_registry_add_listener(display_wayland->wl_registry, ®istry_listener, display_wayland);
|
||||
|
||||
#ifdef GDK_WAYLAND_USE_EGL
|
||||
gdk_display_init_egl(display);
|
||||
#else
|
||||
wl_display_iterate(wl_display, WL_DISPLAY_READABLE);
|
||||
wl_display_roundtrip(wl_display);
|
||||
wl_display_dispatch(display_wayland->wl_display);
|
||||
#endif
|
||||
|
||||
display_wayland->event_source =
|
||||
@@ -351,8 +357,7 @@ gdk_wayland_display_flush (GdkDisplay *display)
|
||||
g_return_if_fail (GDK_IS_DISPLAY (display));
|
||||
|
||||
if (!display->closed)
|
||||
_gdk_wayland_display_flush (display,
|
||||
GDK_WAYLAND_DISPLAY (display)->event_source);
|
||||
wl_display_flush(GDK_WAYLAND_DISPLAY (display)->wl_display);;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
||||
@@ -76,6 +76,7 @@ struct _GdkWaylandDisplay
|
||||
|
||||
/* Wayland fields below */
|
||||
struct wl_display *wl_display;
|
||||
struct wl_registry *wl_registry;
|
||||
struct wl_compositor *compositor;
|
||||
struct wl_shm *shm;
|
||||
struct wl_shell *shell;
|
||||
|
||||
@@ -136,7 +136,7 @@ gdk_wayland_display_manager_lookup_keyval (GdkDisplayManager *manager,
|
||||
{
|
||||
g_return_val_if_fail (keyval_name != NULL, 0);
|
||||
|
||||
return xkb_keysym_from_name(keyval_name);
|
||||
return xkb_keysym_from_name (keyval_name, 0);
|
||||
}
|
||||
|
||||
static gchar *
|
||||
|
||||
@@ -44,8 +44,7 @@ gdk_event_source_prepare(GSource *base, gint *timeout)
|
||||
if (_gdk_event_queue_find_first (source->display) != NULL)
|
||||
return TRUE;
|
||||
|
||||
while (source->mask & WL_DISPLAY_WRITABLE)
|
||||
wl_display_iterate(display->wl_display, WL_DISPLAY_WRITABLE);
|
||||
wl_display_flush(display->wl_display);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@@ -97,16 +96,6 @@ static GSourceFuncs wl_glib_source_funcs = {
|
||||
gdk_event_source_finalize
|
||||
};
|
||||
|
||||
static int
|
||||
gdk_event_source_update(uint32_t mask, void *data)
|
||||
{
|
||||
GdkWaylandEventSource *source = data;
|
||||
|
||||
source->mask = mask;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_wayland_display_deliver_event (GdkDisplay *display, GdkEvent *event)
|
||||
{
|
||||
@@ -134,8 +123,7 @@ _gdk_wayland_display_event_source_new (GdkDisplay *display)
|
||||
|
||||
display_wayland = GDK_WAYLAND_DISPLAY (display);
|
||||
wl_source->display = display;
|
||||
wl_source->pfd.fd = wl_display_get_fd(display_wayland->wl_display,
|
||||
gdk_event_source_update, source);
|
||||
wl_source->pfd.fd = wl_display_get_fd(display_wayland->wl_display);
|
||||
wl_source->pfd.events = G_IO_IN | G_IO_ERR;
|
||||
g_source_add_poll(source, &wl_source->pfd);
|
||||
|
||||
@@ -148,16 +136,6 @@ _gdk_wayland_display_event_source_new (GdkDisplay *display)
|
||||
return source;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_wayland_display_flush (GdkDisplay *display, GSource *source)
|
||||
{
|
||||
GdkWaylandEventSource *wayland_source = (GdkWaylandEventSource *) source;
|
||||
|
||||
while (wayland_source->mask & WL_DISPLAY_WRITABLE)
|
||||
wl_display_iterate(GDK_WAYLAND_DISPLAY (display)->wl_display,
|
||||
WL_DISPLAY_WRITABLE);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_wayland_display_queue_events (GdkDisplay *display)
|
||||
{
|
||||
@@ -166,10 +144,9 @@ _gdk_wayland_display_queue_events (GdkDisplay *display)
|
||||
|
||||
display_wayland = GDK_WAYLAND_DISPLAY (display);
|
||||
source = (GdkWaylandEventSource *) display_wayland->event_source;
|
||||
|
||||
if (source->pfd.revents)
|
||||
{
|
||||
wl_display_iterate(display_wayland->wl_display, WL_DISPLAY_READABLE);
|
||||
source->pfd.revents = 0;
|
||||
wl_display_dispatch(display_wayland->wl_display);
|
||||
source->pfd.revents = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -221,7 +221,7 @@ _gdk_wayland_keymap_new ()
|
||||
names.layout = "us";
|
||||
names.variant = "";
|
||||
names.options = "";
|
||||
keymap->xkb_keymap = xkb_map_new_from_names(context, &names, XKB_MAP_COMPILE_PLACEHOLDER);
|
||||
keymap->xkb_keymap = xkb_keymap_new_from_names (context, &names, 0);
|
||||
keymap->xkb_state = xkb_state_new (keymap->xkb_keymap);
|
||||
xkb_context_unref (context);
|
||||
|
||||
@@ -246,7 +246,7 @@ _gdk_wayland_keymap_new_from_fd (uint32_t format,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
keymap->xkb_keymap = xkb_map_new_from_string (context, map_str, format, XKB_MAP_COMPILE_PLACEHOLDER);
|
||||
keymap->xkb_keymap = xkb_keymap_new_from_string (context, map_str, format, 0);
|
||||
munmap (map_str, size);
|
||||
close (fd);
|
||||
keymap->xkb_state = xkb_state_new (keymap->xkb_keymap);
|
||||
|
||||
@@ -137,7 +137,6 @@ GdkKeymap *_gdk_wayland_device_get_keymap (GdkDevice *device);
|
||||
void _gdk_wayland_display_deliver_event (GdkDisplay *display, GdkEvent *event);
|
||||
GSource *_gdk_wayland_display_event_source_new (GdkDisplay *display);
|
||||
void _gdk_wayland_display_queue_events (GdkDisplay *display);
|
||||
void _gdk_wayland_display_flush (GdkDisplay *display, GSource *source);
|
||||
|
||||
GdkAppLaunchContext *_gdk_wayland_display_get_app_launch_context (GdkDisplay *display);
|
||||
|
||||
|
||||
@@ -1563,6 +1563,7 @@ gdk_wayland_window_process_updates_recurse (GdkWindow *window,
|
||||
cairo_region_get_rectangle (region, i, &rect);
|
||||
wl_surface_damage (impl->surface,
|
||||
rect.x, rect.y, rect.width, rect.height);
|
||||
wl_surface_commit(impl->surface);
|
||||
}
|
||||
|
||||
_gdk_window_process_updates_recurse (window, region);
|
||||
|
||||
@@ -1459,7 +1459,6 @@ _gdk_x11_display_open (const gchar *display_name)
|
||||
_gdk_x11_screen_setup (display_x11->screens[i]);
|
||||
|
||||
g_signal_emit_by_name (display, "opened");
|
||||
g_signal_emit_by_name (gdk_display_manager_get (), "display-opened", display);
|
||||
|
||||
return display;
|
||||
}
|
||||
|
||||
@@ -51,8 +51,13 @@ gdk_x11_display_manager_open_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display;
|
||||
|
||||
display = _gdk_x11_display_open (name);
|
||||
if (manager_x11->default_display == NULL && display != NULL)
|
||||
gdk_display_manager_set_default_display (manager, display);
|
||||
if (display != NULL)
|
||||
{
|
||||
if (manager_x11->default_display == NULL)
|
||||
gdk_display_manager_set_default_display (manager, display);
|
||||
|
||||
g_signal_emit_by_name (manager, "display-opened", display);
|
||||
}
|
||||
|
||||
return display;
|
||||
}
|
||||
|
||||
@@ -1113,6 +1113,8 @@ MyEnhancedXkbTranslateKeyCode(register XkbDescPtr xkb,
|
||||
int found = 0;
|
||||
|
||||
for (i=0,entry=type->map;i<type->map_count;i++,entry++) {
|
||||
if (!entry->active || syms[col+entry->level] == syms[col])
|
||||
continue;
|
||||
if (mods_rtrn) {
|
||||
int bits = 0;
|
||||
unsigned long tmp = entry->mods.mask;
|
||||
@@ -1123,14 +1125,22 @@ MyEnhancedXkbTranslateKeyCode(register XkbDescPtr xkb,
|
||||
}
|
||||
/* We always add one-modifiers levels to mods_rtrn since
|
||||
* they can't wipe out bits in the state unless the
|
||||
* level would be triggered. But return other modifiers
|
||||
*
|
||||
* level would be triggered. But not if they don't change
|
||||
* the symbol (otherwise we can't discriminate Shift-F10
|
||||
* and F10 anymore). And don't add modifiers that are
|
||||
* explicitly marked as preserved, either.
|
||||
*/
|
||||
if (bits == 1 || (mods&type->mods.mask)==entry->mods.mask)
|
||||
*mods_rtrn |= entry->mods.mask;
|
||||
if (bits == 1 ||
|
||||
(mods&type->mods.mask) == entry->mods.mask)
|
||||
{
|
||||
if (type->preserve)
|
||||
*mods_rtrn |= (entry->mods.mask & ~type->preserve[i].mask);
|
||||
else
|
||||
*mods_rtrn |= entry->mods.mask;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found&&entry->active&&((mods&type->mods.mask)==entry->mods.mask)) {
|
||||
if (!found && ((mods&type->mods.mask) == entry->mods.mask)) {
|
||||
col+= entry->level;
|
||||
if (type->preserve)
|
||||
preserve= type->preserve[i].mask;
|
||||
|
||||
@@ -311,6 +311,10 @@ void _gdk_x11_cursor_display_finalize (GdkDisplay *display);
|
||||
|
||||
void _gdk_x11_window_register_dnd (GdkWindow *window);
|
||||
|
||||
GdkDragContext * _gdk_x11_window_drag_begin (GdkWindow *window,
|
||||
GdkDevice *device,
|
||||
GList *targets);
|
||||
|
||||
gboolean _gdk_x11_get_xft_setting (GdkScreen *screen,
|
||||
const gchar *name,
|
||||
GValue *value);
|
||||
|
||||
@@ -4858,6 +4858,11 @@ _gdk_x11_display_before_process_all_updates (GdkDisplay *display)
|
||||
void
|
||||
_gdk_x11_display_after_process_all_updates (GdkDisplay *display)
|
||||
{
|
||||
/* Sync after all drawing, otherwise the client can get "ahead" of
|
||||
the server rendering during animations, such that we fill up
|
||||
the Xserver pipes with sync rendering ops not letting other
|
||||
clients (including the VM) do anything. */
|
||||
XSync (GDK_DISPLAY_XDISPLAY (display), FALSE);
|
||||
}
|
||||
|
||||
static Bool
|
||||
@@ -4948,10 +4953,6 @@ gdk_x11_window_get_xid (GdkWindow *window)
|
||||
return GDK_WINDOW_IMPL_X11 (window->impl)->xid;
|
||||
}
|
||||
|
||||
extern GdkDragContext * _gdk_x11_window_drag_begin (GdkWindow *window,
|
||||
GdkDevice *device,
|
||||
GList *targets);
|
||||
|
||||
static void
|
||||
gdk_window_impl_x11_class_init (GdkWindowImplX11Class *klass)
|
||||
{
|
||||
|
||||
@@ -419,6 +419,7 @@ gtk_private_h_sources = \
|
||||
gtkboxprivate.h \
|
||||
gtkbuilderprivate.h \
|
||||
gtkbuttonprivate.h \
|
||||
gtkcairoblurprivate.h \
|
||||
gtkcellareaboxcontextprivate.h \
|
||||
gtkcolorswatchprivate.h \
|
||||
gtkcoloreditorprivate.h \
|
||||
@@ -426,10 +427,11 @@ gtk_private_h_sources = \
|
||||
gtkcolorscaleprivate.h \
|
||||
gtkcolorchooserprivate.h \
|
||||
gtkcontainerprivate.h \
|
||||
gtkcssanimatedvaluesprivate.h \
|
||||
gtkcssanimationprivate.h \
|
||||
gtkcssarrayvalueprivate.h \
|
||||
gtkcssbgsizevalueprivate.h \
|
||||
gtkcssbordervalueprivate.h \
|
||||
gtkcsscolorvalueprivate.h \
|
||||
gtkcsscomputedvaluesprivate.h \
|
||||
gtkcsscornervalueprivate.h \
|
||||
gtkcsscustompropertyprivate.h \
|
||||
@@ -445,6 +447,7 @@ gtk_private_h_sources = \
|
||||
gtkcssimagewin32private.h \
|
||||
gtkcssinheritvalueprivate.h \
|
||||
gtkcssinitialvalueprivate.h \
|
||||
gtkcsskeyframesprivate.h \
|
||||
gtkcsslookupprivate.h \
|
||||
gtkcssmatcherprivate.h \
|
||||
gtkcssnumbervalueprivate.h \
|
||||
@@ -475,6 +478,8 @@ gtk_private_h_sources = \
|
||||
gtkfilesystemmodel.h \
|
||||
gtkfontchooserprivate.h \
|
||||
gtkfontchooserutils.h \
|
||||
gtkgradientprivate.h \
|
||||
gtkhslaprivate.h \
|
||||
gtkiconcache.h \
|
||||
gtkiconhelperprivate.h \
|
||||
gtkiconviewprivate.h \
|
||||
@@ -489,7 +494,6 @@ gtk_private_h_sources = \
|
||||
gtkmenuitemprivate.h \
|
||||
gtkmenushellprivate.h \
|
||||
gtkmnemonichash.h \
|
||||
gtkmodelmenu.h \
|
||||
gtkmodelmenuitem.h \
|
||||
gtkmodifierstyle.h \
|
||||
gtkmodulesprivate.h \
|
||||
@@ -515,6 +519,7 @@ gtk_private_h_sources = \
|
||||
gtkselectionprivate.h \
|
||||
gtksettingsprivate.h \
|
||||
gtksizegroup-private.h \
|
||||
gtksizerequestcacheprivate.h \
|
||||
gtksocketprivate.h \
|
||||
gtkstyleanimationprivate.h \
|
||||
gtkstylecascadeprivate.h \
|
||||
@@ -615,6 +620,7 @@ gtk_base_c_sources = \
|
||||
gtkbuilderparser.c \
|
||||
gtkbuilder-menus.c \
|
||||
gtkbutton.c \
|
||||
gtkcairoblur.c \
|
||||
gtkcalendar.c \
|
||||
gtkcellarea.c \
|
||||
gtkcellareabox.c \
|
||||
@@ -646,10 +652,11 @@ gtk_base_c_sources = \
|
||||
gtkcombobox.c \
|
||||
gtkcomboboxtext.c \
|
||||
gtkcontainer.c \
|
||||
gtkcssanimatedvalues.c \
|
||||
gtkcssanimation.c \
|
||||
gtkcssarrayvalue.c \
|
||||
gtkcssbgsizevalue.c \
|
||||
gtkcssbordervalue.c \
|
||||
gtkcsscolorvalue.c \
|
||||
gtkcsscomputedvalues.c \
|
||||
gtkcsscornervalue.c \
|
||||
gtkcsscustomproperty.c \
|
||||
@@ -665,6 +672,7 @@ gtk_base_c_sources = \
|
||||
gtkcssimagewin32.c \
|
||||
gtkcssinheritvalue.c \
|
||||
gtkcssinitialvalue.c \
|
||||
gtkcsskeyframes.c \
|
||||
gtkcsslookup.c \
|
||||
gtkcssmatcher.c \
|
||||
gtkcssnumbervalue.c \
|
||||
@@ -715,6 +723,7 @@ gtk_base_c_sources = \
|
||||
gtkframe.c \
|
||||
gtkgradient.c \
|
||||
gtkgrid.c \
|
||||
gtkhsla.c \
|
||||
gtkiconcache.c \
|
||||
gtkiconcachevalidator.c \
|
||||
gtkiconfactory.c \
|
||||
@@ -800,6 +809,7 @@ gtk_base_c_sources = \
|
||||
gtksettings.c \
|
||||
gtksizegroup.c \
|
||||
gtksizerequest.c \
|
||||
gtksizerequestcache.c \
|
||||
gtkshow.c \
|
||||
gtkspinbutton.c \
|
||||
gtkspinner.c \
|
||||
@@ -903,6 +913,8 @@ gtk_private_h_sources += \
|
||||
gtkprinteroptionwidget.h \
|
||||
gtksearchenginetracker.h
|
||||
gtk_c_sources += $(gtk_os_unix_c_sources)
|
||||
else
|
||||
gtk_c_sources += $(gtk_dbus_built_sources)
|
||||
endif
|
||||
|
||||
gtk_os_win32_c_sources = \
|
||||
|
||||
@@ -6,7 +6,6 @@ gail_c_sources = \
|
||||
gail.c \
|
||||
gtkarrowaccessible.c \
|
||||
gtkbooleancellaccessible.c \
|
||||
gtkboxaccessible.c \
|
||||
gtkbuttonaccessible.c \
|
||||
gtkcellaccessible.c \
|
||||
gtkcellaccessibleparent.c \
|
||||
@@ -54,9 +53,9 @@ gail_c_sources = \
|
||||
gailmisc.c
|
||||
|
||||
gail_private_h_sources = \
|
||||
gail.h \
|
||||
gtkarrowaccessible.h \
|
||||
gtkbooleancellaccessible.h \
|
||||
gtkboxaccessible.h \
|
||||
gtkbuttonaccessible.h \
|
||||
gtkcellaccessible.h \
|
||||
gtkcellaccessibleparent.h \
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gail.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -76,6 +78,7 @@ static GtkWidget* focus_before_menu = NULL;
|
||||
static guint focus_notify_handler = 0;
|
||||
static guint focus_tracker_id = 0;
|
||||
static GQuark quark_focus_object = 0;
|
||||
static int initialized = FALSE;
|
||||
|
||||
static AtkObject*
|
||||
gail_get_accessible_for_widget (GtkWidget *widget,
|
||||
@@ -794,10 +797,25 @@ gail_set_focus_object (AtkObject *focus_obj,
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_accessibility_shutdown (void)
|
||||
{
|
||||
if (!initialized)
|
||||
return;
|
||||
|
||||
initialized = FALSE;
|
||||
|
||||
g_clear_object (&atk_misc_instance);
|
||||
|
||||
#ifdef GDK_WINDOWING_X11
|
||||
atk_bridge_adaptor_cleanup ();
|
||||
#endif
|
||||
_gail_util_uninstall ();
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_accessibility_init (void)
|
||||
{
|
||||
static int initialized = FALSE;
|
||||
|
||||
if (initialized)
|
||||
return;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
* Copyright 2004 Sun Microsystems Inc.
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -15,31 +15,16 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#ifndef __GTK_GAIL_H__
|
||||
#define __GTK_GAIL_H__
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkboxaccessible.h"
|
||||
#include <glib.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DEFINE_TYPE (GtkBoxAccessible, _gtk_box_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE)
|
||||
void _gtk_accessibility_shutdown (void);
|
||||
void _gtk_accessibility_init (void);
|
||||
|
||||
static void
|
||||
gtk_box_accessible_initialize (AtkObject *accessible,
|
||||
gpointer data)
|
||||
{
|
||||
ATK_OBJECT_CLASS (_gtk_box_accessible_parent_class)->initialize (accessible, data);
|
||||
accessible->role = ATK_ROLE_FILLER;
|
||||
}
|
||||
G_END_DECLS
|
||||
|
||||
static void
|
||||
_gtk_box_accessible_class_init (GtkBoxAccessibleClass *klass)
|
||||
{
|
||||
AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
|
||||
|
||||
class->initialize = gtk_box_accessible_initialize;
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_box_accessible_init (GtkBoxAccessible *scale)
|
||||
{
|
||||
}
|
||||
#endif /* __GTK_GAIL_H__ */
|
||||
@@ -206,6 +206,17 @@ do_window_event_initialization (void)
|
||||
(GCallback) window_removed, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
undo_window_event_initialization (void)
|
||||
{
|
||||
AtkObject *root;
|
||||
|
||||
root = atk_get_root ();
|
||||
|
||||
g_signal_handlers_disconnect_by_func (root, (GCallback) window_added, NULL);
|
||||
g_signal_handlers_disconnect_by_func (root, (GCallback) window_removed, NULL);
|
||||
}
|
||||
|
||||
static AtkKeyEventStruct *
|
||||
atk_key_event_from_gdk_event_key (GdkEventKey *key)
|
||||
{
|
||||
@@ -341,6 +352,12 @@ gail_util_get_toolkit_version (void)
|
||||
return GTK_VERSION;
|
||||
}
|
||||
|
||||
void
|
||||
_gail_util_uninstall (void)
|
||||
{
|
||||
undo_window_event_initialization ();
|
||||
}
|
||||
|
||||
void
|
||||
_gail_util_install (void)
|
||||
{
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
void _gail_util_install (void);
|
||||
void _gail_util_install (void);
|
||||
void _gail_util_uninstall (void);
|
||||
|
||||
gboolean _gail_util_key_snooper (GtkWidget *the_widget,
|
||||
GdkEventKey *event);
|
||||
|
||||
@@ -20,6 +20,10 @@
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkarrowaccessible.h"
|
||||
|
||||
struct _GtkArrowAccessiblePrivate
|
||||
{
|
||||
gchar *image_description;
|
||||
};
|
||||
|
||||
static void atk_image_interface_init (AtkImageIface *iface);
|
||||
|
||||
@@ -40,7 +44,7 @@ gtk_arrow_accessible_finalize (GObject *object)
|
||||
{
|
||||
GtkArrowAccessible *arrow = GTK_ARROW_ACCESSIBLE (object);
|
||||
|
||||
g_free (arrow->image_description);
|
||||
g_free (arrow->priv->image_description);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_arrow_accessible_parent_class)->finalize (object);
|
||||
}
|
||||
@@ -54,12 +58,16 @@ _gtk_arrow_accessible_class_init (GtkArrowAccessibleClass *klass)
|
||||
atk_object_class->initialize = gtk_arrow_accessible_initialize;
|
||||
|
||||
gobject_class->finalize = gtk_arrow_accessible_finalize;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkArrowAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_arrow_accessible_init (GtkArrowAccessible *arrow)
|
||||
{
|
||||
arrow->image_description = NULL;
|
||||
arrow->priv = G_TYPE_INSTANCE_GET_PRIVATE (arrow,
|
||||
GTK_TYPE_ARROW_ACCESSIBLE,
|
||||
GtkArrowAccessiblePrivate);
|
||||
}
|
||||
|
||||
static const gchar *
|
||||
@@ -67,7 +75,7 @@ gtk_arrow_accessible_get_image_description (AtkImage *obj)
|
||||
{
|
||||
GtkArrowAccessible *arrow = GTK_ARROW_ACCESSIBLE (obj);
|
||||
|
||||
return arrow->image_description;
|
||||
return arrow->priv->image_description;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -76,8 +84,8 @@ gtk_arrow_accessible_set_image_description (AtkImage *obj,
|
||||
{
|
||||
GtkArrowAccessible *arrow = GTK_ARROW_ACCESSIBLE (obj);
|
||||
|
||||
g_free (arrow->image_description);
|
||||
arrow->image_description = g_strdup (description);
|
||||
g_free (arrow->priv->image_description);
|
||||
arrow->priv->image_description = g_strdup (description);
|
||||
|
||||
return TRUE;
|
||||
|
||||
|
||||
@@ -29,14 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_ARROW_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ARROW_ACCESSIBLE))
|
||||
#define GTK_ARROW_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ARROW_ACCESSIBLE, GtkArrowAccessibleClass))
|
||||
|
||||
typedef struct _GtkArrowAccessible GtkArrowAccessible;
|
||||
typedef struct _GtkArrowAccessibleClass GtkArrowAccessibleClass;
|
||||
typedef struct _GtkArrowAccessible GtkArrowAccessible;
|
||||
typedef struct _GtkArrowAccessibleClass GtkArrowAccessibleClass;
|
||||
typedef struct _GtkArrowAccessiblePrivate GtkArrowAccessiblePrivate;
|
||||
|
||||
struct _GtkArrowAccessible
|
||||
{
|
||||
GtkWidgetAccessible parent;
|
||||
|
||||
gchar *image_description;
|
||||
GtkArrowAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkArrowAccessibleClass
|
||||
|
||||
@@ -20,6 +20,12 @@
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkbooleancellaccessible.h"
|
||||
|
||||
struct _GtkBooleanCellAccessiblePrivate
|
||||
{
|
||||
gboolean cell_value;
|
||||
gboolean cell_sensitive;
|
||||
};
|
||||
|
||||
static AtkActionIface *parent_action_iface;
|
||||
|
||||
static gint
|
||||
@@ -82,10 +88,10 @@ gtk_boolean_cell_accessible_ref_state_set (AtkObject *accessible)
|
||||
|
||||
state_set = ATK_OBJECT_CLASS (_gtk_boolean_cell_accessible_parent_class)->ref_state_set (accessible);
|
||||
|
||||
if (cell->cell_value)
|
||||
if (cell->priv->cell_value)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_CHECKED);
|
||||
|
||||
if (cell->cell_sensitive)
|
||||
if (cell->priv->cell_sensitive)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_SENSITIVE);
|
||||
else
|
||||
atk_state_set_remove_state (state_set, ATK_STATE_SENSITIVE);
|
||||
@@ -99,22 +105,25 @@ gtk_boolean_cell_accessible_update_cache (GtkCellAccessible *cell)
|
||||
GtkBooleanCellAccessible *boolean_cell = GTK_BOOLEAN_CELL_ACCESSIBLE (cell);
|
||||
gboolean active;
|
||||
gboolean sensitive;
|
||||
GtkCellRenderer *renderer;
|
||||
|
||||
g_object_get (G_OBJECT (GTK_RENDERER_CELL_ACCESSIBLE (cell)->renderer),
|
||||
g_object_get (cell, "renderer", &renderer, NULL);
|
||||
g_object_get (renderer,
|
||||
"active", &active,
|
||||
"sensitive", &sensitive,
|
||||
NULL);
|
||||
g_object_unref (renderer);
|
||||
|
||||
if (boolean_cell->cell_value != active)
|
||||
if (boolean_cell->priv->cell_value != active)
|
||||
{
|
||||
boolean_cell->cell_value = !boolean_cell->cell_value;
|
||||
boolean_cell->priv->cell_value = !boolean_cell->priv->cell_value;
|
||||
|
||||
atk_object_notify_state_change (ATK_OBJECT (cell), ATK_STATE_CHECKED, active);
|
||||
}
|
||||
|
||||
if (boolean_cell->cell_sensitive != sensitive)
|
||||
if (boolean_cell->priv->cell_sensitive != sensitive)
|
||||
{
|
||||
boolean_cell->cell_sensitive = !boolean_cell->cell_sensitive;
|
||||
boolean_cell->priv->cell_sensitive = !boolean_cell->priv->cell_sensitive;
|
||||
|
||||
atk_object_notify_state_change (ATK_OBJECT (cell), ATK_STATE_CHECKED, sensitive);
|
||||
}
|
||||
@@ -129,10 +138,15 @@ _gtk_boolean_cell_accessible_class_init (GtkBooleanCellAccessibleClass *klass)
|
||||
atkobject_class->ref_state_set = gtk_boolean_cell_accessible_ref_state_set;
|
||||
|
||||
cell_class->update_cache = gtk_boolean_cell_accessible_update_cache;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkBooleanCellAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_boolean_cell_accessible_init (GtkBooleanCellAccessible *cell)
|
||||
{
|
||||
cell->priv = G_TYPE_INSTANCE_GET_PRIVATE (cell,
|
||||
GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE,
|
||||
GtkBooleanCellAccessiblePrivate);
|
||||
}
|
||||
|
||||
|
||||
@@ -30,14 +30,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_BOOLEAN_CELL_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE))
|
||||
#define GTK_BOOLEAN_CELL_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE, GtkBooleanCellAccessibleClass))
|
||||
|
||||
typedef struct _GtkBooleanCellAccessible GtkBooleanCellAccessible;
|
||||
typedef struct _GtkBooleanCellAccessibleClass GtkBooleanCellAccessibleClass;
|
||||
typedef struct _GtkBooleanCellAccessible GtkBooleanCellAccessible;
|
||||
typedef struct _GtkBooleanCellAccessibleClass GtkBooleanCellAccessibleClass;
|
||||
typedef struct _GtkBooleanCellAccessiblePrivate GtkBooleanCellAccessiblePrivate;
|
||||
|
||||
struct _GtkBooleanCellAccessible
|
||||
{
|
||||
GtkRendererCellAccessible parent;
|
||||
gboolean cell_value;
|
||||
gboolean cell_sensitive;
|
||||
|
||||
GtkBooleanCellAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkBooleanCellAccessibleClass
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
* Copyright 2004 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_BOX_ACCESSIBLE_H__
|
||||
#define __GTK_BOX_ACCESSIBLE_H__
|
||||
|
||||
#include "gtkcontaineraccessible.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_BOX_ACCESSIBLE (_gtk_box_accessible_get_type ())
|
||||
#define GTK_BOX_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_BOX_ACCESSIBLE, GtkBoxAccessible))
|
||||
#define GTK_BOX_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_BOX_ACCESSIBLE, GtkBoxAccessibleClass))
|
||||
#define GTK_IS_BOX_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_BOX_ACCESSIBLE))
|
||||
#define GTK_IS_BOX_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_BOX_ACCESSIBLE))
|
||||
#define GTK_BOX_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_BOX_ACCESSIBLE, GtkBoxAccessibleClass))
|
||||
|
||||
typedef struct _GtkBoxAccessible GtkBoxAccessible;
|
||||
typedef struct _GtkBoxAccessibleClass GtkBoxAccessibleClass;
|
||||
|
||||
struct _GtkBoxAccessible
|
||||
{
|
||||
GtkContainerAccessible parent;
|
||||
};
|
||||
|
||||
struct _GtkBoxAccessibleClass
|
||||
{
|
||||
GtkContainerAccessibleClass parent_class;
|
||||
};
|
||||
|
||||
GType _gtk_box_accessible_get_type (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_BOX_ACCESSIBLE_H__ */
|
||||
@@ -29,12 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_BUTTON_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_BUTTON_ACCESSIBLE))
|
||||
#define GTK_BUTTON_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_BUTTON_ACCESSIBLE, GtkButtonAccessibleClass))
|
||||
|
||||
typedef struct _GtkButtonAccessible GtkButtonAccessible;
|
||||
typedef struct _GtkButtonAccessibleClass GtkButtonAccessibleClass;
|
||||
typedef struct _GtkButtonAccessible GtkButtonAccessible;
|
||||
typedef struct _GtkButtonAccessibleClass GtkButtonAccessibleClass;
|
||||
typedef struct _GtkButtonAccessiblePrivate GtkButtonAccessiblePrivate;
|
||||
|
||||
struct _GtkButtonAccessible
|
||||
{
|
||||
GtkContainerAccessible parent;
|
||||
|
||||
GtkButtonAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkButtonAccessibleClass
|
||||
|
||||
@@ -83,7 +83,7 @@ gtk_cell_accessible_get_index_in_parent (AtkObject *obj)
|
||||
|
||||
parent = atk_object_get_parent (obj);
|
||||
if (GTK_IS_CONTAINER_CELL_ACCESSIBLE (parent))
|
||||
return g_list_index (GTK_CONTAINER_CELL_ACCESSIBLE (parent)->children, obj);
|
||||
return g_list_index (_gtk_container_cell_accessible_get_children (GTK_CONTAINER_CELL_ACCESSIBLE (parent)), obj);
|
||||
|
||||
parent = gtk_widget_get_accessible (gtk_accessible_get_widget (GTK_ACCESSIBLE (cell)));
|
||||
if (parent == NULL)
|
||||
|
||||
@@ -30,12 +30,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_CELL_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CELL_ACCESSIBLE))
|
||||
#define GTK_CELL_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CELL_ACCESSIBLE, GtkCellAccessibleClass))
|
||||
|
||||
typedef struct _GtkCellAccessible GtkCellAccessible;
|
||||
typedef struct _GtkCellAccessibleClass GtkCellAccessibleClass;
|
||||
typedef struct _GtkCellAccessible GtkCellAccessible;
|
||||
typedef struct _GtkCellAccessibleClass GtkCellAccessibleClass;
|
||||
typedef struct _GtkCellAccessiblePrivate GtkCellAccessiblePrivate;
|
||||
|
||||
struct _GtkCellAccessible
|
||||
{
|
||||
GtkAccessible parent;
|
||||
|
||||
GtkCellAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkCellAccessibleClass
|
||||
|
||||
@@ -29,12 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_CHECK_MENU_ITEM_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CHECK_MENU_ITEM_ACCESSIBLE))
|
||||
#define GTK_CHECK_MENU_ITEM_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CHECK_MENU_ITEM_ACCESSIBLE, GtkCheckMenuItemAccessibleClass))
|
||||
|
||||
typedef struct _GtkCheckMenuItemAccessible GtkCheckMenuItemAccessible;
|
||||
typedef struct _GtkCheckMenuItemAccessibleClass GtkCheckMenuItemAccessibleClass;
|
||||
typedef struct _GtkCheckMenuItemAccessible GtkCheckMenuItemAccessible;
|
||||
typedef struct _GtkCheckMenuItemAccessibleClass GtkCheckMenuItemAccessibleClass;
|
||||
typedef struct _GtkCheckMenuItemAccessiblePrivate GtkCheckMenuItemAccessiblePrivate;
|
||||
|
||||
struct _GtkCheckMenuItemAccessible
|
||||
{
|
||||
GtkMenuItemAccessible parent;
|
||||
|
||||
GtkCheckMenuItemAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkCheckMenuItemAccessibleClass
|
||||
|
||||
@@ -29,12 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_COLOR_SWATCH_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_COLOR_SWATCH_ACCESSIBLE))
|
||||
#define GTK_COLOR_SWATCH_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_COLOR_SWATCH_ACCESSIBLE, GtkColorSwatchAccessibleClass))
|
||||
|
||||
typedef struct _GtkColorSwatchAccessible GtkColorSwatchAccessible;
|
||||
typedef struct _GtkColorSwatchAccessibleClass GtkColorSwatchAccessibleClass;
|
||||
typedef struct _GtkColorSwatchAccessible GtkColorSwatchAccessible;
|
||||
typedef struct _GtkColorSwatchAccessibleClass GtkColorSwatchAccessibleClass;
|
||||
typedef struct _GtkColorSwatchAccessiblePrivate GtkColorSwatchAccessiblePrivate;
|
||||
|
||||
struct _GtkColorSwatchAccessible
|
||||
{
|
||||
GtkWidgetAccessible parent;
|
||||
|
||||
GtkColorSwatchAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkColorSwatchAccessibleClass
|
||||
|
||||
@@ -20,6 +20,12 @@
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkcomboboxaccessible.h"
|
||||
|
||||
struct _GtkComboBoxAccessiblePrivate
|
||||
{
|
||||
gchar *name;
|
||||
gint old_selection;
|
||||
gboolean popup_set;
|
||||
};
|
||||
|
||||
static void atk_action_interface_init (AtkActionIface *iface);
|
||||
static void atk_selection_interface_init (AtkSelectionIface *iface);
|
||||
@@ -41,9 +47,9 @@ changed_cb (GtkWidget *widget)
|
||||
index = gtk_combo_box_get_active (combo_box);
|
||||
obj = gtk_widget_get_accessible (widget);
|
||||
accessible = GTK_COMBO_BOX_ACCESSIBLE (obj);
|
||||
if (accessible->old_selection != index)
|
||||
if (accessible->priv->old_selection != index)
|
||||
{
|
||||
accessible->old_selection = index;
|
||||
accessible->priv->old_selection = index;
|
||||
g_object_notify (G_OBJECT (obj), "accessible-name");
|
||||
g_signal_emit_by_name (obj, "selection-changed");
|
||||
}
|
||||
@@ -63,13 +69,13 @@ gtk_combo_box_accessible_initialize (AtkObject *obj,
|
||||
accessible = GTK_COMBO_BOX_ACCESSIBLE (obj);
|
||||
|
||||
g_signal_connect (combo_box, "changed", G_CALLBACK (changed_cb), NULL);
|
||||
accessible->old_selection = gtk_combo_box_get_active (combo_box);
|
||||
accessible->priv->old_selection = gtk_combo_box_get_active (combo_box);
|
||||
|
||||
popup = gtk_combo_box_get_popup_accessible (combo_box);
|
||||
if (popup)
|
||||
{
|
||||
atk_object_set_parent (popup, obj);
|
||||
accessible->popup_set = TRUE;
|
||||
accessible->priv->popup_set = TRUE;
|
||||
}
|
||||
if (gtk_combo_box_get_has_entry (combo_box))
|
||||
atk_object_set_parent (gtk_widget_get_accessible (gtk_bin_get_child (GTK_BIN (combo_box))), obj);
|
||||
@@ -82,7 +88,7 @@ gtk_combo_box_accessible_finalize (GObject *object)
|
||||
{
|
||||
GtkComboBoxAccessible *combo_box = GTK_COMBO_BOX_ACCESSIBLE (object);
|
||||
|
||||
g_free (combo_box->name);
|
||||
g_free (combo_box->priv->name);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_combo_box_accessible_parent_class)->finalize (object);
|
||||
}
|
||||
@@ -120,8 +126,8 @@ gtk_combo_box_accessible_get_name (AtkObject *obj)
|
||||
gtk_tree_model_get_value (model, &iter, i, &value);
|
||||
if (G_VALUE_HOLDS_STRING (&value))
|
||||
{
|
||||
g_free (accessible->name);
|
||||
accessible->name = g_strdup (g_value_get_string (&value));
|
||||
g_free (accessible->priv->name);
|
||||
accessible->priv->name = g_strdup (g_value_get_string (&value));
|
||||
g_value_unset (&value);
|
||||
break;
|
||||
}
|
||||
@@ -129,7 +135,7 @@ gtk_combo_box_accessible_get_name (AtkObject *obj)
|
||||
g_value_unset (&value);
|
||||
}
|
||||
}
|
||||
return accessible->name;
|
||||
return accessible->priv->name;
|
||||
}
|
||||
|
||||
static gint
|
||||
@@ -165,10 +171,10 @@ gtk_combo_box_accessible_ref_child (AtkObject *obj,
|
||||
{
|
||||
child = gtk_combo_box_get_popup_accessible (GTK_COMBO_BOX (widget));
|
||||
box = GTK_COMBO_BOX_ACCESSIBLE (obj);
|
||||
if (box->popup_set == FALSE)
|
||||
if (!box->priv->popup_set)
|
||||
{
|
||||
atk_object_set_parent (child, obj);
|
||||
box->popup_set = TRUE;
|
||||
box->priv->popup_set = TRUE;
|
||||
}
|
||||
}
|
||||
else if (i == 1 && gtk_combo_box_get_has_entry (GTK_COMBO_BOX (widget)))
|
||||
@@ -195,14 +201,19 @@ _gtk_combo_box_accessible_class_init (GtkComboBoxAccessibleClass *klass)
|
||||
class->get_n_children = gtk_combo_box_accessible_get_n_children;
|
||||
class->ref_child = gtk_combo_box_accessible_ref_child;
|
||||
class->initialize = gtk_combo_box_accessible_initialize;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkComboBoxAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_combo_box_accessible_init (GtkComboBoxAccessible *combo_box)
|
||||
{
|
||||
combo_box->old_selection = -1;
|
||||
combo_box->name = NULL;
|
||||
combo_box->popup_set = FALSE;
|
||||
combo_box->priv = G_TYPE_INSTANCE_GET_PRIVATE (combo_box,
|
||||
GTK_TYPE_COMBO_BOX_ACCESSIBLE,
|
||||
GtkComboBoxAccessiblePrivate);
|
||||
combo_box->priv->old_selection = -1;
|
||||
combo_box->priv->name = NULL;
|
||||
combo_box->priv->popup_set = FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
||||
@@ -29,16 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_COMBO_BOX_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_COMBO_BOX_ACCESSIBLE))
|
||||
#define GTK_COMBO_BOX_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_COMBO_BOX_ACCESSIBLE, GtkComboBoxAccessibleClass))
|
||||
|
||||
typedef struct _GtkComboBoxAccessible GtkComboBoxAccessible;
|
||||
typedef struct _GtkComboBoxAccessibleClass GtkComboBoxAccessibleClass;
|
||||
typedef struct _GtkComboBoxAccessible GtkComboBoxAccessible;
|
||||
typedef struct _GtkComboBoxAccessibleClass GtkComboBoxAccessibleClass;
|
||||
typedef struct _GtkComboBoxAccessiblePrivate GtkComboBoxAccessiblePrivate;
|
||||
|
||||
struct _GtkComboBoxAccessible
|
||||
{
|
||||
GtkContainerAccessible parent;
|
||||
|
||||
gchar *name;
|
||||
gint old_selection;
|
||||
gboolean popup_set;
|
||||
GtkComboBoxAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkComboBoxAccessibleClass
|
||||
|
||||
@@ -20,6 +20,10 @@
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkcontaineraccessible.h"
|
||||
|
||||
struct _GtkContainerAccessiblePrivate
|
||||
{
|
||||
GList *children;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (GtkContainerAccessible, _gtk_container_accessible, GTK_TYPE_WIDGET_ACCESSIBLE)
|
||||
|
||||
@@ -34,7 +38,7 @@ gtk_container_accessible_get_n_children (AtkObject* obj)
|
||||
if (widget == NULL)
|
||||
return 0;
|
||||
|
||||
children = gtk_container_get_children (GTK_CONTAINER(widget));
|
||||
children = gtk_container_get_children (GTK_CONTAINER (widget));
|
||||
count = g_list_length (children);
|
||||
g_list_free (children);
|
||||
|
||||
@@ -115,9 +119,9 @@ gtk_container_accessible_real_add_gtk (GtkContainer *container,
|
||||
accessible = GTK_CONTAINER_ACCESSIBLE (atk_parent);
|
||||
|
||||
g_object_notify (G_OBJECT (atk_child), "accessible-parent");
|
||||
g_list_free (accessible->children);
|
||||
accessible->children = gtk_container_get_children (container);
|
||||
index = g_list_index (accessible->children, widget);
|
||||
g_list_free (accessible->priv->children);
|
||||
accessible->priv->children = gtk_container_get_children (container);
|
||||
index = g_list_index (accessible->priv->children, widget);
|
||||
g_signal_emit_by_name (atk_parent, "children-changed::add", index, atk_child, NULL);
|
||||
|
||||
return 1;
|
||||
@@ -140,10 +144,10 @@ gtk_container_accessible_real_remove_gtk (GtkContainer *container,
|
||||
accessible = GTK_CONTAINER_ACCESSIBLE (atk_parent);
|
||||
|
||||
g_object_notify (G_OBJECT (atk_child), "accessible-parent");
|
||||
index = g_list_index (accessible->children, widget);
|
||||
g_list_free (accessible->children);
|
||||
accessible->children = gtk_container_get_children (container);
|
||||
if (index >= 0 && index <= g_list_length (accessible->children))
|
||||
index = g_list_index (accessible->priv->children, widget);
|
||||
g_list_free (accessible->priv->children);
|
||||
accessible->priv->children = gtk_container_get_children (container);
|
||||
if (index >= 0 && index <= g_list_length (accessible->priv->children))
|
||||
g_signal_emit_by_name (atk_parent, "children-changed::remove", index, atk_child, NULL);
|
||||
|
||||
return 1;
|
||||
@@ -157,7 +161,7 @@ gtk_container_accessible_real_initialize (AtkObject *obj,
|
||||
|
||||
ATK_OBJECT_CLASS (_gtk_container_accessible_parent_class)->initialize (obj, data);
|
||||
|
||||
accessible->children = gtk_container_get_children (GTK_CONTAINER (data));
|
||||
accessible->priv->children = gtk_container_get_children (GTK_CONTAINER (data));
|
||||
|
||||
g_signal_connect (data, "add", G_CALLBACK (gtk_container_accessible_add_gtk), obj);
|
||||
g_signal_connect (data, "remove", G_CALLBACK (gtk_container_accessible_remove_gtk), obj);
|
||||
@@ -170,7 +174,7 @@ gtk_container_accessible_finalize (GObject *object)
|
||||
{
|
||||
GtkContainerAccessible *accessible = GTK_CONTAINER_ACCESSIBLE (object);
|
||||
|
||||
g_list_free (accessible->children);
|
||||
g_list_free (accessible->priv->children);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_container_accessible_parent_class)->finalize (object);
|
||||
}
|
||||
@@ -189,10 +193,14 @@ _gtk_container_accessible_class_init (GtkContainerAccessibleClass *klass)
|
||||
|
||||
klass->add_gtk = gtk_container_accessible_real_add_gtk;
|
||||
klass->remove_gtk = gtk_container_accessible_real_remove_gtk;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkContainerAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_container_accessible_init (GtkContainerAccessible *container)
|
||||
{
|
||||
container->priv = G_TYPE_INSTANCE_GET_PRIVATE (container,
|
||||
GTK_TYPE_CONTAINER_ACCESSIBLE,
|
||||
GtkContainerAccessiblePrivate);
|
||||
}
|
||||
|
||||
|
||||
@@ -30,14 +30,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_CONTAINER_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CONTAINER_ACCESSIBLE))
|
||||
#define GTK_CONTAINER_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CONTAINER_ACCESSIBLE, GtkContainerAccessibleClass))
|
||||
|
||||
typedef struct _GtkContainerAccessible GtkContainerAccessible;
|
||||
typedef struct _GtkContainerAccessibleClass GtkContainerAccessibleClass;
|
||||
typedef struct _GtkContainerAccessible GtkContainerAccessible;
|
||||
typedef struct _GtkContainerAccessibleClass GtkContainerAccessibleClass;
|
||||
typedef struct _GtkContainerAccessiblePrivate GtkContainerAccessiblePrivate;
|
||||
|
||||
struct _GtkContainerAccessible
|
||||
{
|
||||
GtkWidgetAccessible parent;
|
||||
|
||||
GList *children;
|
||||
GtkContainerAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkContainerAccessibleClass
|
||||
|
||||
@@ -20,6 +20,11 @@
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkcontainercellaccessible.h"
|
||||
|
||||
struct _GtkContainerCellAccessiblePrivate
|
||||
{
|
||||
GList *children;
|
||||
gint n_children;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (GtkContainerCellAccessible, _gtk_container_cell_accessible, GTK_TYPE_CELL_ACCESSIBLE)
|
||||
|
||||
@@ -29,7 +34,7 @@ gtk_container_cell_accessible_finalize (GObject *obj)
|
||||
{
|
||||
GtkContainerCellAccessible *container = GTK_CONTAINER_CELL_ACCESSIBLE (obj);
|
||||
|
||||
g_list_free_full (container->children, g_object_unref);
|
||||
g_list_free_full (container->priv->children, g_object_unref);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_container_cell_accessible_parent_class)->finalize (obj);
|
||||
}
|
||||
@@ -40,7 +45,7 @@ gtk_container_cell_accessible_get_n_children (AtkObject *obj)
|
||||
{
|
||||
GtkContainerCellAccessible *cell = GTK_CONTAINER_CELL_ACCESSIBLE (obj);
|
||||
|
||||
return cell->NChildren;
|
||||
return cell->priv->n_children;
|
||||
}
|
||||
|
||||
static AtkObject *
|
||||
@@ -50,7 +55,7 @@ gtk_container_cell_accessible_ref_child (AtkObject *obj,
|
||||
GtkContainerCellAccessible *cell = GTK_CONTAINER_CELL_ACCESSIBLE (obj);
|
||||
GList *l;
|
||||
|
||||
l = g_list_nth (cell->children, child);
|
||||
l = g_list_nth (cell->priv->children, child);
|
||||
if (l == NULL)
|
||||
return NULL;
|
||||
|
||||
@@ -63,7 +68,7 @@ gtk_container_cell_accessible_update_cache (GtkCellAccessible *cell)
|
||||
GtkContainerCellAccessible *container = GTK_CONTAINER_CELL_ACCESSIBLE (cell);
|
||||
GList *l;
|
||||
|
||||
for (l = container->children; l; l = l->next)
|
||||
for (l = container->priv->children; l; l = l->next)
|
||||
{
|
||||
_gtk_cell_accessible_update_cache (l->data);
|
||||
}
|
||||
@@ -75,7 +80,7 @@ gtk_container_cell_widget_set (GtkAccessible *accessible)
|
||||
GtkContainerCellAccessible *container = GTK_CONTAINER_CELL_ACCESSIBLE (accessible);
|
||||
GList *l;
|
||||
|
||||
for (l = container->children; l; l = l->next)
|
||||
for (l = container->priv->children; l; l = l->next)
|
||||
{
|
||||
gtk_accessible_set_widget (l->data, gtk_accessible_get_widget (accessible));
|
||||
}
|
||||
@@ -89,7 +94,7 @@ gtk_container_cell_widget_unset (GtkAccessible *accessible)
|
||||
GtkContainerCellAccessible *container = GTK_CONTAINER_CELL_ACCESSIBLE (accessible);
|
||||
GList *l;
|
||||
|
||||
for (l = container->children; l; l = l->next)
|
||||
for (l = container->priv->children; l; l = l->next)
|
||||
{
|
||||
gtk_accessible_set_widget (l->data, NULL);
|
||||
}
|
||||
@@ -114,31 +119,28 @@ _gtk_container_cell_accessible_class_init (GtkContainerCellAccessibleClass *klas
|
||||
accessible_class->widget_unset = gtk_container_cell_widget_unset;
|
||||
|
||||
cell_class->update_cache = gtk_container_cell_accessible_update_cache;
|
||||
|
||||
g_type_class_add_private (g_object_class, sizeof (GtkContainerCellAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_container_cell_accessible_init (GtkContainerCellAccessible *cell)
|
||||
{
|
||||
cell->priv = G_TYPE_INSTANCE_GET_PRIVATE (cell,
|
||||
GTK_TYPE_CONTAINER_CELL_ACCESSIBLE,
|
||||
GtkContainerCellAccessiblePrivate);
|
||||
}
|
||||
|
||||
GtkContainerCellAccessible *
|
||||
_gtk_container_cell_accessible_new (void)
|
||||
{
|
||||
GObject *object;
|
||||
AtkObject *atk_object;
|
||||
GtkContainerCellAccessible *container;
|
||||
|
||||
object = g_object_new (GTK_TYPE_CONTAINER_CELL_ACCESSIBLE, NULL);
|
||||
|
||||
g_return_val_if_fail (object != NULL, NULL);
|
||||
ATK_OBJECT (object)->role = ATK_ROLE_TABLE_CELL;
|
||||
|
||||
atk_object = ATK_OBJECT (object);
|
||||
atk_object->role = ATK_ROLE_TABLE_CELL;
|
||||
|
||||
container = GTK_CONTAINER_CELL_ACCESSIBLE (object);
|
||||
container->children = NULL;
|
||||
container->NChildren = 0;
|
||||
return container;
|
||||
return GTK_CONTAINER_CELL_ACCESSIBLE (object);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -148,8 +150,8 @@ _gtk_container_cell_accessible_add_child (GtkContainerCellAccessible *container,
|
||||
g_return_if_fail (GTK_IS_CONTAINER_CELL_ACCESSIBLE (container));
|
||||
g_return_if_fail (GTK_IS_CELL_ACCESSIBLE (child));
|
||||
|
||||
container->NChildren++;
|
||||
container->children = g_list_append (container->children, child);
|
||||
container->priv->n_children++;
|
||||
container->priv->children = g_list_append (container->priv->children, child);
|
||||
atk_object_set_parent (ATK_OBJECT (child), ATK_OBJECT (container));
|
||||
}
|
||||
|
||||
@@ -159,8 +161,16 @@ _gtk_container_cell_accessible_remove_child (GtkContainerCellAccessible *contain
|
||||
{
|
||||
g_return_if_fail (GTK_IS_CONTAINER_CELL_ACCESSIBLE (container));
|
||||
g_return_if_fail (GTK_IS_CELL_ACCESSIBLE (child));
|
||||
g_return_if_fail (container->NChildren > 0);
|
||||
g_return_if_fail (container->priv->n_children > 0);
|
||||
|
||||
container->children = g_list_remove (container->children, child);
|
||||
container->NChildren--;
|
||||
container->priv->children = g_list_remove (container->priv->children, child);
|
||||
container->priv->n_children--;
|
||||
}
|
||||
|
||||
GList *
|
||||
_gtk_container_cell_accessible_get_children (GtkContainerCellAccessible *container)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_CONTAINER_CELL_ACCESSIBLE (container), NULL);
|
||||
|
||||
return container->priv->children;
|
||||
}
|
||||
|
||||
@@ -30,14 +30,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_CONTAINER_CELL_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CONTAINER_CELL_ACCESSIBLE))
|
||||
#define GTK_CONTAINER_CELL_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CONTAINER_CELL_ACCESSIBLE, GtkContainerCellAccessibleClass))
|
||||
|
||||
typedef struct _GtkContainerCellAccessible GtkContainerCellAccessible;
|
||||
typedef struct _GtkContainerCellAccessibleClass GtkContainerCellAccessibleClass;
|
||||
typedef struct _GtkContainerCellAccessible GtkContainerCellAccessible;
|
||||
typedef struct _GtkContainerCellAccessibleClass GtkContainerCellAccessibleClass;
|
||||
typedef struct _GtkContainerCellAccessiblePrivate GtkContainerCellAccessiblePrivate;
|
||||
|
||||
struct _GtkContainerCellAccessible
|
||||
{
|
||||
GtkCellAccessible parent;
|
||||
GList *children;
|
||||
gint NChildren;
|
||||
|
||||
GtkContainerCellAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkContainerCellAccessibleClass
|
||||
@@ -52,6 +53,7 @@ void _gtk_container_cell_accessible_add_child (GtkCont
|
||||
GtkCellAccessible *child);
|
||||
void _gtk_container_cell_accessible_remove_child (GtkContainerCellAccessible *container,
|
||||
GtkCellAccessible *child);
|
||||
GList *_gtk_container_cell_accessible_get_children (GtkContainerCellAccessible *container);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
||||
@@ -17,12 +17,351 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkpango.h"
|
||||
#include "gtkentryaccessible.h"
|
||||
#include "gtkentryprivate.h"
|
||||
#include "gtkcomboboxaccessible.h"
|
||||
|
||||
#define GTK_TYPE_ENTRY_ICON_ACCESSIBLE (_gtk_entry_icon_accessible_get_type ())
|
||||
#define GTK_ENTRY_ICON_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_ENTRY_ICON_ACCESSIBLE, GtkEntryIconAccessible))
|
||||
#define GTK_IS_ENTRY_ICON_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_ENTRY_ICON_ACCESSIBLE))
|
||||
|
||||
struct _GtkEntryAccessiblePrivate
|
||||
{
|
||||
gint cursor_position;
|
||||
gint selection_bound;
|
||||
AtkObject *icons[2];
|
||||
};
|
||||
|
||||
typedef struct _GtkEntryIconAccessible GtkEntryIconAccessible;
|
||||
typedef struct _GtkEntryIconAccessibleClass GtkEntryIconAccessibleClass;
|
||||
|
||||
struct _GtkEntryIconAccessible
|
||||
{
|
||||
AtkObject parent;
|
||||
|
||||
GtkEntryAccessible *entry;
|
||||
GtkEntryIconPosition pos;
|
||||
};
|
||||
|
||||
struct _GtkEntryIconAccessibleClass
|
||||
{
|
||||
AtkObjectClass parent_class;
|
||||
};
|
||||
|
||||
static void atk_action_interface_init (AtkActionIface *iface);
|
||||
|
||||
static void icon_atk_action_interface_init (AtkActionIface *iface);
|
||||
static void icon_atk_component_interface_init (AtkComponentIface *iface);
|
||||
|
||||
GType _gtk_entry_icon_accessible_get_type (void);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkEntryIconAccessible, _gtk_entry_icon_accessible, ATK_TYPE_OBJECT,
|
||||
G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, icon_atk_action_interface_init)
|
||||
G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, icon_atk_component_interface_init))
|
||||
|
||||
static void
|
||||
gtk_entry_icon_accessible_remove_entry (gpointer data, GObject *obj)
|
||||
{
|
||||
GtkEntryIconAccessible *icon = data;
|
||||
|
||||
if (icon->entry)
|
||||
{
|
||||
icon->entry = NULL;
|
||||
g_object_notify (G_OBJECT (icon), "accessible-parent");
|
||||
atk_object_notify_state_change (ATK_OBJECT (icon), ATK_STATE_DEFUNCT, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
static AtkObject *
|
||||
gtk_entry_icon_accessible_new (GtkEntryAccessible *entry,
|
||||
GtkEntryIconPosition pos)
|
||||
{
|
||||
GtkEntryIconAccessible *icon;
|
||||
AtkObject *accessible;
|
||||
|
||||
icon = g_object_new (_gtk_entry_icon_accessible_get_type (), NULL);
|
||||
icon->entry = entry;
|
||||
g_object_weak_ref (G_OBJECT (entry),
|
||||
gtk_entry_icon_accessible_remove_entry,
|
||||
icon);
|
||||
icon->pos = pos;
|
||||
|
||||
accessible = ATK_OBJECT (icon);
|
||||
atk_object_initialize (accessible, NULL);
|
||||
return accessible;
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_entry_icon_accessible_init (GtkEntryIconAccessible *icon)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_entry_icon_accessible_initialize (AtkObject *obj,
|
||||
gpointer data)
|
||||
{
|
||||
GtkEntryIconAccessible *icon = GTK_ENTRY_ICON_ACCESSIBLE (obj);
|
||||
GtkWidget *widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (icon->entry));
|
||||
GtkEntry *gtk_entry = GTK_ENTRY (widget);
|
||||
const gchar *name;
|
||||
gchar *text;
|
||||
|
||||
ATK_OBJECT_CLASS (_gtk_entry_icon_accessible_parent_class)->initialize (obj, data);
|
||||
atk_object_set_role (obj, ATK_ROLE_ICON);
|
||||
|
||||
name = gtk_entry_get_icon_name (gtk_entry, icon->pos);
|
||||
if (name)
|
||||
atk_object_set_name (obj, name);
|
||||
|
||||
text = gtk_entry_get_icon_tooltip_text (gtk_entry, icon->pos);
|
||||
if (text)
|
||||
{
|
||||
atk_object_set_description (obj, text);
|
||||
g_free (text);
|
||||
}
|
||||
|
||||
atk_object_set_parent (obj, ATK_OBJECT (icon->entry));
|
||||
}
|
||||
|
||||
static AtkObject *
|
||||
gtk_entry_icon_accessible_get_parent (AtkObject *accessible)
|
||||
{
|
||||
GtkEntryIconAccessible *icon = GTK_ENTRY_ICON_ACCESSIBLE (accessible);
|
||||
|
||||
return ATK_OBJECT (icon->entry);
|
||||
}
|
||||
|
||||
static AtkStateSet *
|
||||
gtk_entry_icon_accessible_ref_state_set (AtkObject *accessible)
|
||||
{
|
||||
GtkEntryIconAccessible *icon = GTK_ENTRY_ICON_ACCESSIBLE (accessible);
|
||||
AtkStateSet *set = atk_state_set_new ();
|
||||
AtkStateSet *entry_set;
|
||||
GtkWidget *widget;
|
||||
GtkEntry *gtk_entry;
|
||||
|
||||
if (!icon->entry)
|
||||
{
|
||||
atk_state_set_add_state (set, ATK_STATE_DEFUNCT);
|
||||
return set;
|
||||
}
|
||||
|
||||
entry_set = atk_object_ref_state_set (ATK_OBJECT (icon->entry));
|
||||
if (!entry_set || atk_state_set_contains_state (entry_set, ATK_STATE_DEFUNCT))
|
||||
{
|
||||
atk_state_set_add_state (set, ATK_STATE_DEFUNCT);
|
||||
g_clear_object (&entry_set);
|
||||
return set;
|
||||
}
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (icon->entry));
|
||||
gtk_entry = GTK_ENTRY (widget);
|
||||
|
||||
if (atk_state_set_contains_state (entry_set, ATK_STATE_ENABLED))
|
||||
atk_state_set_add_state (set, ATK_STATE_ENABLED);
|
||||
if (atk_state_set_contains_state (entry_set, ATK_STATE_SENSITIVE))
|
||||
atk_state_set_add_state (set, ATK_STATE_SENSITIVE);
|
||||
if (atk_state_set_contains_state (entry_set, ATK_STATE_SHOWING))
|
||||
atk_state_set_add_state (set, ATK_STATE_SHOWING);
|
||||
if (atk_state_set_contains_state (entry_set, ATK_STATE_VISIBLE))
|
||||
atk_state_set_add_state (set, ATK_STATE_VISIBLE);
|
||||
|
||||
if (!gtk_entry_get_icon_sensitive (gtk_entry, icon->pos))
|
||||
atk_state_set_remove_state (set, ATK_STATE_SENSITIVE);
|
||||
if (!gtk_entry_get_icon_activatable (gtk_entry, icon->pos))
|
||||
atk_state_set_remove_state (set, ATK_STATE_ENABLED);
|
||||
|
||||
g_object_unref (entry_set);
|
||||
return set;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_entry_icon_accessible_invalidate (GtkEntryIconAccessible *icon)
|
||||
{
|
||||
if (!icon->entry)
|
||||
return;
|
||||
g_object_weak_unref (G_OBJECT (icon->entry),
|
||||
gtk_entry_icon_accessible_remove_entry,
|
||||
icon);
|
||||
gtk_entry_icon_accessible_remove_entry (icon, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_entry_icon_accessible_finalize (GObject *object)
|
||||
{
|
||||
GtkEntryIconAccessible *icon = GTK_ENTRY_ICON_ACCESSIBLE (object);
|
||||
|
||||
gtk_entry_icon_accessible_invalidate (icon);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_entry_icon_accessible_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_entry_icon_accessible_class_init (GtkEntryIconAccessibleClass *klass)
|
||||
{
|
||||
AtkObjectClass *atk_class = ATK_OBJECT_CLASS (klass);
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
atk_class->initialize = gtk_entry_icon_accessible_initialize;
|
||||
atk_class->get_parent = gtk_entry_icon_accessible_get_parent;
|
||||
atk_class->ref_state_set = gtk_entry_icon_accessible_ref_state_set;
|
||||
|
||||
gobject_class->finalize = gtk_entry_icon_accessible_finalize;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_entry_icon_accessible_do_action (AtkAction *action,
|
||||
gint i)
|
||||
{
|
||||
GtkEntryIconAccessible *icon = (GtkEntryIconAccessible *)action;
|
||||
GtkWidget *widget;
|
||||
GtkEntry *gtk_entry;
|
||||
GdkEvent event;
|
||||
GdkRectangle icon_area;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (icon->entry));
|
||||
if (widget == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (i != 0)
|
||||
return FALSE;
|
||||
|
||||
if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_visible (widget))
|
||||
return FALSE;
|
||||
|
||||
gtk_entry = GTK_ENTRY (widget);
|
||||
|
||||
if (!gtk_entry_get_icon_sensitive (gtk_entry, icon->pos) ||
|
||||
!gtk_entry_get_icon_activatable (gtk_entry, icon->pos))
|
||||
return FALSE;
|
||||
|
||||
gtk_entry_get_icon_area (gtk_entry, icon->pos, &icon_area);
|
||||
memset (&event, 0, sizeof (event));
|
||||
event.button.type = GDK_BUTTON_PRESS;
|
||||
event.button.window = gtk_widget_get_window (widget);
|
||||
event.button.button = 1;
|
||||
event.button.send_event = TRUE;
|
||||
event.button.time = GDK_CURRENT_TIME;
|
||||
event.button.x = icon_area.x;
|
||||
event.button.y = icon_area.y;
|
||||
|
||||
g_signal_emit_by_name (widget, "icon-press", 0, icon->pos, &event);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gint
|
||||
gtk_entry_icon_accessible_get_n_actions (AtkAction *action)
|
||||
{
|
||||
GtkEntryIconAccessible *icon = GTK_ENTRY_ICON_ACCESSIBLE (action);
|
||||
GtkWidget *widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (icon->entry));
|
||||
GtkEntry *gtk_entry = GTK_ENTRY (widget);
|
||||
|
||||
return (gtk_entry_get_icon_activatable (gtk_entry, icon->pos) ? 1 : 0);
|
||||
}
|
||||
|
||||
static const gchar *
|
||||
gtk_entry_icon_accessible_get_name (AtkAction *action,
|
||||
gint i)
|
||||
{
|
||||
GtkEntryIconAccessible *icon = GTK_ENTRY_ICON_ACCESSIBLE (action);
|
||||
GtkWidget *widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (icon->entry));
|
||||
GtkEntry *gtk_entry = GTK_ENTRY (widget);
|
||||
|
||||
if (i != 0)
|
||||
return NULL;
|
||||
if (!gtk_entry_get_icon_activatable (gtk_entry, icon->pos))
|
||||
return NULL;
|
||||
|
||||
return "activate";
|
||||
}
|
||||
|
||||
static void
|
||||
icon_atk_action_interface_init (AtkActionIface *iface)
|
||||
{
|
||||
iface->do_action = gtk_entry_icon_accessible_do_action;
|
||||
iface->get_n_actions = gtk_entry_icon_accessible_get_n_actions;
|
||||
iface->get_name = gtk_entry_icon_accessible_get_name;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_entry_icon_accessible_get_extents (AtkComponent *component,
|
||||
gint *x,
|
||||
gint *y,
|
||||
gint *width,
|
||||
gint *height,
|
||||
AtkCoordType coord_type)
|
||||
{
|
||||
GtkEntryIconAccessible *icon = GTK_ENTRY_ICON_ACCESSIBLE (component);
|
||||
GdkRectangle icon_area;
|
||||
GtkEntry *gtk_entry;
|
||||
GtkWidget *widget;
|
||||
|
||||
*x = G_MININT;
|
||||
atk_component_get_extents (ATK_COMPONENT (icon->entry), x, y, width, height,
|
||||
coord_type);
|
||||
if (*x == G_MININT)
|
||||
return;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (icon->entry));
|
||||
gtk_entry = GTK_ENTRY (widget);
|
||||
gtk_entry_get_icon_area (gtk_entry, icon->pos, &icon_area);
|
||||
*width = icon_area.width;
|
||||
*height = icon_area.height;
|
||||
*x += icon_area.x;
|
||||
*y += icon_area.y;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_entry_icon_accessible_get_position (AtkComponent *component,
|
||||
gint *x,
|
||||
gint *y,
|
||||
AtkCoordType coord_type)
|
||||
{
|
||||
GtkEntryIconAccessible *icon = GTK_ENTRY_ICON_ACCESSIBLE (component);
|
||||
GdkRectangle icon_area;
|
||||
GtkEntry *gtk_entry;
|
||||
GtkWidget *widget;
|
||||
|
||||
*x = G_MININT;
|
||||
atk_component_get_position (ATK_COMPONENT (icon->entry), x, y, coord_type);
|
||||
if (*x == G_MININT)
|
||||
return;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (icon->entry));
|
||||
gtk_entry = GTK_ENTRY (widget);
|
||||
gtk_entry_get_icon_area (gtk_entry, icon->pos, &icon_area);
|
||||
*x += icon_area.x;
|
||||
*y += icon_area.y;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_entry_icon_accessible_get_size (AtkComponent *component,
|
||||
gint *width,
|
||||
gint *height)
|
||||
{
|
||||
GtkEntryIconAccessible *icon = GTK_ENTRY_ICON_ACCESSIBLE (component);
|
||||
GdkRectangle icon_area;
|
||||
GtkEntry *gtk_entry;
|
||||
GtkWidget *widget;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (icon->entry));
|
||||
gtk_entry = GTK_ENTRY (widget);
|
||||
gtk_entry_get_icon_area (gtk_entry, icon->pos, &icon_area);
|
||||
*width = icon_area.width;
|
||||
*height = icon_area.height;
|
||||
}
|
||||
|
||||
static void
|
||||
icon_atk_component_interface_init (AtkComponentIface *iface)
|
||||
{
|
||||
iface->get_extents = gtk_entry_icon_accessible_get_extents;
|
||||
iface->get_size = gtk_entry_icon_accessible_get_size;
|
||||
iface->get_position = gtk_entry_icon_accessible_get_position;
|
||||
}
|
||||
|
||||
/* Callbacks */
|
||||
|
||||
static void insert_text_cb (GtkEditable *editable,
|
||||
@@ -109,10 +448,9 @@ gtk_entry_accessible_initialize (AtkObject *obj,
|
||||
gtk_entry_accessible = GTK_ENTRY_ACCESSIBLE (obj);
|
||||
|
||||
entry = GTK_ENTRY (data);
|
||||
gtk_editable_get_selection_bounds (GTK_EDITABLE (entry),
|
||||
&start_pos, &end_pos);
|
||||
gtk_entry_accessible->cursor_position = end_pos;
|
||||
gtk_entry_accessible->selection_bound = start_pos;
|
||||
gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start_pos, &end_pos);
|
||||
gtk_entry_accessible->priv->cursor_position = end_pos;
|
||||
gtk_entry_accessible->priv->selection_bound = start_pos;
|
||||
|
||||
/* Set up signal callbacks */
|
||||
g_signal_connect (entry, "insert-text", G_CALLBACK (insert_text_cb), NULL);
|
||||
@@ -132,11 +470,13 @@ gtk_entry_accessible_notify_gtk (GObject *obj,
|
||||
AtkObject* atk_obj;
|
||||
GtkEntry* gtk_entry;
|
||||
GtkEntryAccessible* entry;
|
||||
GtkEntryAccessiblePrivate *priv;
|
||||
|
||||
widget = GTK_WIDGET (obj);
|
||||
atk_obj = gtk_widget_get_accessible (widget);
|
||||
gtk_entry = GTK_ENTRY (widget);
|
||||
entry = GTK_ENTRY_ACCESSIBLE (atk_obj);
|
||||
priv = entry->priv;
|
||||
|
||||
if (g_strcmp0 (pspec->name, "cursor-position") == 0)
|
||||
{
|
||||
@@ -146,7 +486,7 @@ gtk_entry_accessible_notify_gtk (GObject *obj,
|
||||
* The entry cursor position has moved so generate the signal.
|
||||
*/
|
||||
g_signal_emit_by_name (atk_obj, "text-caret-moved",
|
||||
entry->cursor_position);
|
||||
entry->priv->cursor_position);
|
||||
}
|
||||
else if (g_strcmp0 (pspec->name, "selection-bound") == 0)
|
||||
{
|
||||
@@ -169,6 +509,119 @@ gtk_entry_accessible_notify_gtk (GObject *obj,
|
||||
new_role = visibility ? ATK_ROLE_TEXT : ATK_ROLE_PASSWORD_TEXT;
|
||||
atk_object_set_role (atk_obj, new_role);
|
||||
}
|
||||
else if (g_strcmp0 (pspec->name, "primary-icon-storage-type") == 0)
|
||||
{
|
||||
if (gtk_entry_get_icon_storage_type (gtk_entry, GTK_ENTRY_ICON_PRIMARY) != GTK_IMAGE_EMPTY && !priv->icons[GTK_ENTRY_ICON_PRIMARY])
|
||||
{
|
||||
priv->icons[GTK_ENTRY_ICON_PRIMARY] = gtk_entry_icon_accessible_new (entry, GTK_ENTRY_ICON_PRIMARY);
|
||||
g_signal_emit_by_name (entry, "children-changed::add", 0,
|
||||
priv->icons[GTK_ENTRY_ICON_PRIMARY], NULL);
|
||||
}
|
||||
else if (gtk_entry_get_icon_storage_type (gtk_entry, GTK_ENTRY_ICON_PRIMARY) == GTK_IMAGE_EMPTY && priv->icons[GTK_ENTRY_ICON_PRIMARY])
|
||||
{
|
||||
gtk_entry_icon_accessible_invalidate (GTK_ENTRY_ICON_ACCESSIBLE (priv->icons[GTK_ENTRY_ICON_PRIMARY]));
|
||||
g_signal_emit_by_name (entry, "children-changed::remove", 0,
|
||||
priv->icons[GTK_ENTRY_ICON_PRIMARY], NULL);
|
||||
g_clear_object (&priv->icons[GTK_ENTRY_ICON_PRIMARY]);
|
||||
}
|
||||
}
|
||||
else if (g_strcmp0 (pspec->name, "secondary-icon-storage-type") == 0)
|
||||
{
|
||||
gint index = (priv->icons[GTK_ENTRY_ICON_PRIMARY] ? 1 : 0);
|
||||
if (gtk_entry_get_icon_storage_type (gtk_entry, GTK_ENTRY_ICON_SECONDARY) != GTK_IMAGE_EMPTY && !priv->icons[GTK_ENTRY_ICON_SECONDARY])
|
||||
{
|
||||
priv->icons[GTK_ENTRY_ICON_SECONDARY] = gtk_entry_icon_accessible_new (entry, GTK_ENTRY_ICON_SECONDARY);
|
||||
g_signal_emit_by_name (entry, "children-changed::add", index,
|
||||
priv->icons[GTK_ENTRY_ICON_SECONDARY], NULL);
|
||||
}
|
||||
else if (gtk_entry_get_icon_storage_type (gtk_entry, GTK_ENTRY_ICON_SECONDARY) == GTK_IMAGE_EMPTY && priv->icons[GTK_ENTRY_ICON_SECONDARY])
|
||||
{
|
||||
gtk_entry_icon_accessible_invalidate (GTK_ENTRY_ICON_ACCESSIBLE (priv->icons[GTK_ENTRY_ICON_SECONDARY]));
|
||||
g_signal_emit_by_name (entry, "children-changed::remove", index,
|
||||
priv->icons[GTK_ENTRY_ICON_SECONDARY], NULL);
|
||||
g_clear_object (&priv->icons[GTK_ENTRY_ICON_SECONDARY]);
|
||||
}
|
||||
}
|
||||
else if (g_strcmp0 (pspec->name, "primary-icon-name") == 0)
|
||||
{
|
||||
if (priv->icons[GTK_ENTRY_ICON_PRIMARY])
|
||||
{
|
||||
const gchar *name;
|
||||
name = gtk_entry_get_icon_name (gtk_entry,
|
||||
GTK_ENTRY_ICON_PRIMARY);
|
||||
atk_object_set_name (priv->icons[GTK_ENTRY_ICON_PRIMARY], name);
|
||||
}
|
||||
}
|
||||
else if (g_strcmp0 (pspec->name, "secondary-icon-name") == 0)
|
||||
{
|
||||
if (priv->icons[GTK_ENTRY_ICON_SECONDARY])
|
||||
{
|
||||
const gchar *name;
|
||||
name = gtk_entry_get_icon_name (gtk_entry,
|
||||
GTK_ENTRY_ICON_SECONDARY);
|
||||
atk_object_set_name (priv->icons[GTK_ENTRY_ICON_SECONDARY], name);
|
||||
}
|
||||
}
|
||||
else if (g_strcmp0 (pspec->name, "primary-icon-tooltip-text") == 0)
|
||||
{
|
||||
if (priv->icons[GTK_ENTRY_ICON_PRIMARY])
|
||||
{
|
||||
gchar *text;
|
||||
text = gtk_entry_get_icon_tooltip_text (gtk_entry,
|
||||
GTK_ENTRY_ICON_PRIMARY);
|
||||
atk_object_set_description (priv->icons[GTK_ENTRY_ICON_PRIMARY],
|
||||
text);
|
||||
g_free (text);
|
||||
}
|
||||
}
|
||||
else if (g_strcmp0 (pspec->name, "secondary-icon-tooltip-text") == 0)
|
||||
{
|
||||
if (priv->icons[GTK_ENTRY_ICON_SECONDARY])
|
||||
{
|
||||
gchar *text;
|
||||
text = gtk_entry_get_icon_tooltip_text (gtk_entry,
|
||||
GTK_ENTRY_ICON_SECONDARY);
|
||||
atk_object_set_description (priv->icons[GTK_ENTRY_ICON_SECONDARY],
|
||||
text);
|
||||
g_free (text);
|
||||
}
|
||||
}
|
||||
else if (g_strcmp0 (pspec->name, "primary-icon-activatable") == 0)
|
||||
{
|
||||
if (priv->icons[GTK_ENTRY_ICON_PRIMARY])
|
||||
{
|
||||
gboolean on = gtk_entry_get_icon_activatable (gtk_entry, GTK_ENTRY_ICON_PRIMARY);
|
||||
atk_object_notify_state_change (priv->icons[GTK_ENTRY_ICON_PRIMARY],
|
||||
ATK_STATE_ENABLED, on);
|
||||
}
|
||||
}
|
||||
else if (g_strcmp0 (pspec->name, "secondary-icon-activatable") == 0)
|
||||
{
|
||||
if (priv->icons[GTK_ENTRY_ICON_SECONDARY])
|
||||
{
|
||||
gboolean on = gtk_entry_get_icon_activatable (gtk_entry, GTK_ENTRY_ICON_SECONDARY);
|
||||
atk_object_notify_state_change (priv->icons[GTK_ENTRY_ICON_SECONDARY],
|
||||
ATK_STATE_ENABLED, on);
|
||||
}
|
||||
}
|
||||
else if (g_strcmp0 (pspec->name, "primary-icon-sensitive") == 0)
|
||||
{
|
||||
if (priv->icons[GTK_ENTRY_ICON_PRIMARY])
|
||||
{
|
||||
gboolean on = gtk_entry_get_icon_sensitive (gtk_entry, GTK_ENTRY_ICON_PRIMARY);
|
||||
atk_object_notify_state_change (priv->icons[GTK_ENTRY_ICON_PRIMARY],
|
||||
ATK_STATE_SENSITIVE, on);
|
||||
}
|
||||
}
|
||||
else if (g_strcmp0 (pspec->name, "secondary-icon-sensitive") == 0)
|
||||
{
|
||||
if (priv->icons[GTK_ENTRY_ICON_SECONDARY])
|
||||
{
|
||||
gboolean on = gtk_entry_get_icon_sensitive (gtk_entry, GTK_ENTRY_ICON_SECONDARY);
|
||||
atk_object_notify_state_change (priv->icons[GTK_ENTRY_ICON_SECONDARY],
|
||||
ATK_STATE_SENSITIVE, on);
|
||||
}
|
||||
}
|
||||
else
|
||||
GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_entry_accessible_parent_class)->notify_gtk (obj, pspec);
|
||||
}
|
||||
@@ -187,25 +640,109 @@ gtk_entry_accessible_get_index_in_parent (AtkObject *accessible)
|
||||
return ATK_OBJECT_CLASS (_gtk_entry_accessible_parent_class)->get_index_in_parent (accessible);
|
||||
}
|
||||
|
||||
static gint
|
||||
gtk_entry_accessible_get_n_children (AtkObject* obj)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
GtkEntry *entry;
|
||||
gint count = 0;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
|
||||
if (widget == NULL)
|
||||
return 0;
|
||||
|
||||
entry = GTK_ENTRY (widget);
|
||||
|
||||
if (gtk_entry_get_icon_storage_type (entry, GTK_ENTRY_ICON_PRIMARY) != GTK_IMAGE_EMPTY)
|
||||
count++;
|
||||
if (gtk_entry_get_icon_storage_type (entry, GTK_ENTRY_ICON_SECONDARY) != GTK_IMAGE_EMPTY)
|
||||
count++;
|
||||
return count;
|
||||
}
|
||||
|
||||
static AtkObject *
|
||||
gtk_entry_accessible_ref_child (AtkObject *obj,
|
||||
gint i)
|
||||
{
|
||||
GtkEntryAccessible *accessible = GTK_ENTRY_ACCESSIBLE (obj);
|
||||
GtkEntryAccessiblePrivate *priv = accessible->priv;
|
||||
GtkWidget *widget;
|
||||
GtkEntry *entry;
|
||||
GtkEntryIconPosition pos;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
|
||||
if (widget == NULL)
|
||||
return NULL;
|
||||
|
||||
entry = GTK_ENTRY (widget);
|
||||
|
||||
switch (i)
|
||||
{
|
||||
case 0:
|
||||
if (gtk_entry_get_icon_storage_type (entry, GTK_ENTRY_ICON_PRIMARY) != GTK_IMAGE_EMPTY)
|
||||
pos = GTK_ENTRY_ICON_PRIMARY;
|
||||
else if (gtk_entry_get_icon_storage_type (entry, GTK_ENTRY_ICON_SECONDARY) != GTK_IMAGE_EMPTY)
|
||||
pos = GTK_ENTRY_ICON_SECONDARY;
|
||||
else
|
||||
return NULL;
|
||||
break;
|
||||
case 1:
|
||||
if (gtk_entry_get_icon_storage_type (entry, GTK_ENTRY_ICON_PRIMARY) == GTK_IMAGE_EMPTY)
|
||||
return NULL;
|
||||
if (gtk_entry_get_icon_storage_type (entry, GTK_ENTRY_ICON_SECONDARY) == GTK_IMAGE_EMPTY)
|
||||
return NULL;
|
||||
pos = GTK_ENTRY_ICON_SECONDARY;
|
||||
break;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!priv->icons[pos])
|
||||
priv->icons[pos] = gtk_entry_icon_accessible_new (accessible, pos);
|
||||
return g_object_ref (priv->icons[pos]);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_entry_accessible_finalize (GObject *object)
|
||||
{
|
||||
GtkEntryAccessible *entry = GTK_ENTRY_ACCESSIBLE (object);
|
||||
GtkEntryAccessiblePrivate *priv = entry->priv;
|
||||
|
||||
g_clear_object (&priv->icons[GTK_ENTRY_ICON_PRIMARY]);
|
||||
g_clear_object (&priv->icons[GTK_ENTRY_ICON_SECONDARY]);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_entry_accessible_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_entry_accessible_class_init (GtkEntryAccessibleClass *klass)
|
||||
{
|
||||
AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
|
||||
GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass;
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
class->ref_state_set = gtk_entry_accessible_ref_state_set;
|
||||
class->get_index_in_parent = gtk_entry_accessible_get_index_in_parent;
|
||||
class->initialize = gtk_entry_accessible_initialize;
|
||||
class->get_attributes = gtk_entry_accessible_get_attributes;
|
||||
class->get_n_children = gtk_entry_accessible_get_n_children;
|
||||
class->ref_child = gtk_entry_accessible_ref_child;
|
||||
|
||||
widget_class->notify_gtk = gtk_entry_accessible_notify_gtk;
|
||||
|
||||
gobject_class->finalize = gtk_entry_accessible_finalize;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkEntryAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_entry_accessible_init (GtkEntryAccessible *entry)
|
||||
{
|
||||
entry->cursor_position = 0;
|
||||
entry->selection_bound = 0;
|
||||
entry->priv = G_TYPE_INSTANCE_GET_PRIVATE (entry,
|
||||
GTK_TYPE_ENTRY_ACCESSIBLE,
|
||||
GtkEntryAccessiblePrivate);
|
||||
entry->priv->cursor_position = 0;
|
||||
entry->priv->selection_bound = 0;
|
||||
}
|
||||
|
||||
static gchar *
|
||||
@@ -889,8 +1426,8 @@ check_for_selection_change (GtkEntryAccessible *accessible,
|
||||
|
||||
if (gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start, &end))
|
||||
{
|
||||
if (end != accessible->cursor_position ||
|
||||
start != accessible->selection_bound)
|
||||
if (end != accessible->priv->cursor_position ||
|
||||
start != accessible->priv->selection_bound)
|
||||
/*
|
||||
* This check is here as this function can be called
|
||||
* for notification of selection_bound and current_pos.
|
||||
@@ -903,11 +1440,11 @@ check_for_selection_change (GtkEntryAccessible *accessible,
|
||||
else
|
||||
{
|
||||
/* We had a selection */
|
||||
ret_val = (accessible->cursor_position != accessible->selection_bound);
|
||||
ret_val = (accessible->priv->cursor_position != accessible->priv->selection_bound);
|
||||
}
|
||||
|
||||
accessible->cursor_position = end;
|
||||
accessible->selection_bound = start;
|
||||
accessible->priv->cursor_position = end;
|
||||
accessible->priv->selection_bound = start;
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
@@ -29,15 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_ENTRY_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ENTRY_ACCESSIBLE))
|
||||
#define GTK_ENTRY_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ENTRY_ACCESSIBLE, GtkEntryAccessibleClass))
|
||||
|
||||
typedef struct _GtkEntryAccessible GtkEntryAccessible;
|
||||
typedef struct _GtkEntryAccessibleClass GtkEntryAccessibleClass;
|
||||
typedef struct _GtkEntryAccessible GtkEntryAccessible;
|
||||
typedef struct _GtkEntryAccessibleClass GtkEntryAccessibleClass;
|
||||
typedef struct _GtkEntryAccessiblePrivate GtkEntryAccessiblePrivate;
|
||||
|
||||
struct _GtkEntryAccessible
|
||||
{
|
||||
GtkWidgetAccessible parent;
|
||||
|
||||
gint cursor_position;
|
||||
gint selection_bound;
|
||||
GtkEntryAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkEntryAccessibleClass
|
||||
|
||||
@@ -29,12 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_EXPANDER_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_EXPANDER_ACCESSIBLE))
|
||||
#define GTK_EXPANDER_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_EXPANDER_ACCESSIBLE, GtkExpanderAccessibleClass))
|
||||
|
||||
typedef struct _GtkExpanderAccessible GtkExpanderAccessible;
|
||||
typedef struct _GtkExpanderAccessibleClass GtkExpanderAccessibleClass;
|
||||
typedef struct _GtkExpanderAccessible GtkExpanderAccessible;
|
||||
typedef struct _GtkExpanderAccessibleClass GtkExpanderAccessibleClass;
|
||||
typedef struct _GtkExpanderAccessiblePrivate GtkExpanderAccessiblePrivate;
|
||||
|
||||
struct _GtkExpanderAccessible
|
||||
{
|
||||
GtkContainerAccessible parent;
|
||||
|
||||
GtkExpanderAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkExpanderAccessibleClass
|
||||
|
||||
@@ -29,12 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_FRAME_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_FRAME_ACCESSIBLE))
|
||||
#define GTK_FRAME_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_FRAME_ACCESSIBLE, GtkFrameAccessibleClass))
|
||||
|
||||
typedef struct _GtkFrameAccessible GtkFrameAccessible;
|
||||
typedef struct _GtkFrameAccessibleClass GtkFrameAccessibleClass;
|
||||
typedef struct _GtkFrameAccessible GtkFrameAccessible;
|
||||
typedef struct _GtkFrameAccessibleClass GtkFrameAccessibleClass;
|
||||
typedef struct _GtkFrameAccessiblePrivate GtkFrameAccessiblePrivate;
|
||||
|
||||
struct _GtkFrameAccessible
|
||||
{
|
||||
GtkContainerAccessible parent;
|
||||
|
||||
GtkFrameAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkFrameAccessibleClass
|
||||
|
||||
@@ -32,6 +32,12 @@
|
||||
#define GTK_ICON_VIEW_ITEM_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_ICON_VIEW_ITEM_ACCESSIBLE, GtkIconViewItemAccessible))
|
||||
#define GTK_IS_ICON_VIEW_ITEM_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_ICON_VIEW_ITEM_ACCESSIBLE))
|
||||
|
||||
struct _GtkIconViewAccessiblePrivate
|
||||
{
|
||||
GList *items;
|
||||
GtkTreeModel *model;
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
AtkObject parent;
|
||||
@@ -51,6 +57,8 @@ typedef struct
|
||||
|
||||
} GtkIconViewItemAccessibleClass;
|
||||
|
||||
GType _gtk_icon_view_item_accessible_get_type (void);
|
||||
|
||||
static gboolean gtk_icon_view_item_accessible_is_showing (GtkIconViewItemAccessible *item);
|
||||
|
||||
static void atk_component_item_interface_init (AtkComponentIface *iface);
|
||||
@@ -866,7 +874,7 @@ gtk_icon_view_item_accessible_info_new (AtkObject *accessible,
|
||||
info->item = item;
|
||||
info->index = index;
|
||||
|
||||
items = view->items;
|
||||
items = view->priv->items;
|
||||
while (items)
|
||||
{
|
||||
tmp_info = items->data;
|
||||
@@ -874,7 +882,7 @@ gtk_icon_view_item_accessible_info_new (AtkObject *accessible,
|
||||
break;
|
||||
items = items->next;
|
||||
}
|
||||
view->items = g_list_insert_before (view->items, items, info);
|
||||
view->priv->items = g_list_insert_before (view->priv->items, items, info);
|
||||
}
|
||||
|
||||
static gint
|
||||
@@ -900,7 +908,7 @@ gtk_icon_view_accessible_find_child (AtkObject *accessible,
|
||||
GtkIconViewItemAccessibleInfo *info;
|
||||
GList *items;
|
||||
|
||||
items = view->items;
|
||||
items = view->priv->items;
|
||||
|
||||
while (items)
|
||||
{
|
||||
@@ -964,7 +972,7 @@ gtk_icon_view_accessible_traverse_items (GtkIconViewAccessible *view,
|
||||
GtkIconViewItemAccessible *item;
|
||||
GList *items;
|
||||
|
||||
if (view->items)
|
||||
if (view->priv->items)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
gboolean act_on_item;
|
||||
@@ -973,7 +981,7 @@ gtk_icon_view_accessible_traverse_items (GtkIconViewAccessible *view,
|
||||
if (widget == NULL)
|
||||
return;
|
||||
|
||||
items = view->items;
|
||||
items = view->priv->items;
|
||||
|
||||
act_on_item = (list == NULL);
|
||||
|
||||
@@ -1062,7 +1070,7 @@ gtk_icon_view_accessible_model_row_inserted (GtkTreeModel *tree_model,
|
||||
atk_obj = gtk_widget_get_accessible (GTK_WIDGET (user_data));
|
||||
view = GTK_ICON_VIEW_ACCESSIBLE (atk_obj);
|
||||
|
||||
items = view->items;
|
||||
items = view->priv->items;
|
||||
tmp_list = NULL;
|
||||
while (items)
|
||||
{
|
||||
@@ -1105,7 +1113,7 @@ gtk_icon_view_accessible_model_row_deleted (GtkTreeModel *tree_model,
|
||||
atk_obj = gtk_widget_get_accessible (GTK_WIDGET (user_data));
|
||||
view = GTK_ICON_VIEW_ACCESSIBLE (atk_obj);
|
||||
|
||||
items = view->items;
|
||||
items = view->priv->items;
|
||||
tmp_list = NULL;
|
||||
deleted_item = NULL;
|
||||
info = NULL;
|
||||
@@ -1134,7 +1142,7 @@ gtk_icon_view_accessible_model_row_deleted (GtkTreeModel *tree_model,
|
||||
gtk_icon_view_item_accessible_add_state (GTK_ICON_VIEW_ITEM_ACCESSIBLE (info->item), ATK_STATE_DEFUNCT, TRUE);
|
||||
g_signal_emit_by_name (atk_obj, "children-changed::remove",
|
||||
index, NULL, NULL);
|
||||
view->items = g_list_remove_link (view->items, deleted_item);
|
||||
view->priv->items = g_list_remove_link (view->priv->items, deleted_item);
|
||||
g_free (info);
|
||||
}
|
||||
|
||||
@@ -1174,7 +1182,7 @@ gtk_icon_view_accessible_model_rows_reordered (GtkTreeModel *tree_model,
|
||||
for (i = 0; i < length; i++)
|
||||
order [new_order[i]] = i;
|
||||
|
||||
items = view->items;
|
||||
items = view->priv->items;
|
||||
while (items)
|
||||
{
|
||||
info = items->data;
|
||||
@@ -1184,8 +1192,8 @@ gtk_icon_view_accessible_model_rows_reordered (GtkTreeModel *tree_model,
|
||||
items = items->next;
|
||||
}
|
||||
g_free (order);
|
||||
view->items = g_list_sort (view->items,
|
||||
(GCompareFunc)gtk_icon_view_accessible_item_compare);
|
||||
view->priv->items = g_list_sort (view->priv->items,
|
||||
(GCompareFunc)gtk_icon_view_accessible_item_compare);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -1229,7 +1237,7 @@ gtk_icon_view_accessible_clear_cache (GtkIconViewAccessible *view)
|
||||
GtkIconViewItemAccessibleInfo *info;
|
||||
GList *items;
|
||||
|
||||
items = view->items;
|
||||
items = view->priv->items;
|
||||
while (items)
|
||||
{
|
||||
info = (GtkIconViewItemAccessibleInfo *) items->data;
|
||||
@@ -1237,8 +1245,8 @@ gtk_icon_view_accessible_clear_cache (GtkIconViewAccessible *view)
|
||||
g_free (items->data);
|
||||
items = items->next;
|
||||
}
|
||||
g_list_free (view->items);
|
||||
view->items = NULL;
|
||||
g_list_free (view->priv->items);
|
||||
view->priv->items = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1255,20 +1263,20 @@ gtk_icon_view_accessible_notify_gtk (GObject *obj,
|
||||
widget = GTK_WIDGET (obj);
|
||||
atk_obj = gtk_widget_get_accessible (widget);
|
||||
view = (GtkIconViewAccessible*)atk_obj;
|
||||
if (view->model)
|
||||
if (view->priv->model)
|
||||
{
|
||||
g_object_remove_weak_pointer (G_OBJECT (view->model),
|
||||
(gpointer *)&view->model);
|
||||
gtk_icon_view_accessible_disconnect_model_signals (view->model, widget);
|
||||
g_object_remove_weak_pointer (G_OBJECT (view->priv->model),
|
||||
(gpointer *)&view->priv->model);
|
||||
gtk_icon_view_accessible_disconnect_model_signals (view->priv->model, widget);
|
||||
}
|
||||
gtk_icon_view_accessible_clear_cache (view);
|
||||
|
||||
icon_view = GTK_ICON_VIEW (obj);
|
||||
view->model = icon_view->priv->model;
|
||||
view->priv->model = icon_view->priv->model;
|
||||
/* If there is no model the GtkIconView is probably being destroyed */
|
||||
if (view->model)
|
||||
if (view->priv->model)
|
||||
{
|
||||
g_object_add_weak_pointer (G_OBJECT (view->model), (gpointer *)&view->model);
|
||||
g_object_add_weak_pointer (G_OBJECT (view->priv->model), (gpointer *)&view->priv->model);
|
||||
gtk_icon_view_accessible_connect_model_signals (icon_view);
|
||||
}
|
||||
}
|
||||
@@ -1292,10 +1300,10 @@ gtk_icon_view_accessible_initialize (AtkObject *accessible,
|
||||
g_signal_connect (data, "notify",
|
||||
G_CALLBACK (gtk_icon_view_accessible_notify_gtk), NULL);
|
||||
|
||||
view->model = icon_view->priv->model;
|
||||
if (view->model)
|
||||
view->priv->model = icon_view->priv->model;
|
||||
if (view->priv->model)
|
||||
{
|
||||
g_object_add_weak_pointer (G_OBJECT (view->model), (gpointer *)&view->model);
|
||||
g_object_add_weak_pointer (G_OBJECT (view->priv->model), (gpointer *)&view->priv->model);
|
||||
gtk_icon_view_accessible_connect_model_signals (icon_view);
|
||||
}
|
||||
|
||||
@@ -1326,11 +1334,16 @@ _gtk_icon_view_accessible_class_init (GtkIconViewAccessibleClass *klass)
|
||||
atk_class->get_n_children = gtk_icon_view_accessible_get_n_children;
|
||||
atk_class->ref_child = gtk_icon_view_accessible_ref_child;
|
||||
atk_class->initialize = gtk_icon_view_accessible_initialize;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkIconViewAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_icon_view_accessible_init (GtkIconViewAccessible *accessible)
|
||||
{
|
||||
accessible->priv = G_TYPE_INSTANCE_GET_PRIVATE (accessible,
|
||||
GTK_TYPE_ICON_VIEW_ACCESSIBLE,
|
||||
GtkIconViewAccessiblePrivate);
|
||||
}
|
||||
|
||||
static AtkObject*
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user