Compare commits
1587 Commits
wip/toolti
...
arraystore
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d233b10559 | ||
|
|
b4f9f252d7 | ||
|
|
373c06b148 | ||
|
|
c84cd97fbc | ||
|
|
6b7d295cfe | ||
|
|
481d438380 | ||
|
|
f4e1057431 | ||
|
|
fa0166180e | ||
|
|
13d84c202b | ||
|
|
5846794075 | ||
|
|
201da90e23 | ||
|
|
8d4fcabf01 | ||
|
|
3f8735a488 | ||
|
|
a4dc248512 | ||
|
|
ef451b056a | ||
|
|
59aaabb161 | ||
|
|
663ca21328 | ||
|
|
77435d31fa | ||
|
|
6edb8f096f | ||
|
|
c4dfee8860 | ||
|
|
8ac1e77c9a | ||
|
|
65ceb6c15a | ||
|
|
f70d10f6ac | ||
|
|
0bbd083d79 | ||
|
|
102d2986c6 | ||
|
|
c74201ca87 | ||
|
|
b09019a5b4 | ||
|
|
1dd08ad8db | ||
|
|
eb0704855f | ||
|
|
c4c1d4a1b3 | ||
|
|
e6756f605e | ||
|
|
1f4b8e089e | ||
|
|
c0e08db739 | ||
|
|
1c337d350d | ||
|
|
81e675dfbf | ||
|
|
8556221429 | ||
|
|
1b4109a7fd | ||
|
|
df0786be7a | ||
|
|
3f545da08d | ||
|
|
7170fdebb9 | ||
|
|
7ccf32db57 | ||
|
|
520c2116a3 | ||
|
|
e818685921 | ||
|
|
6ddd9793f3 | ||
|
|
6bdca276a2 | ||
|
|
d4ff275002 | ||
|
|
2b6f243578 | ||
|
|
8770584bfb | ||
|
|
4f7f15700c | ||
|
|
cab6808673 | ||
|
|
b77110c35a | ||
|
|
c4e8218f49 | ||
|
|
c8b57154cb | ||
|
|
c4b2112f16 | ||
|
|
3132353ec5 | ||
|
|
3dc6267146 | ||
|
|
6a6146a9e0 | ||
|
|
01fbf8444b | ||
|
|
1f8c79eca1 | ||
|
|
5229069101 | ||
|
|
a6752bd3e0 | ||
|
|
93a51f77c4 | ||
|
|
9f2926dde3 | ||
|
|
d31bb8b503 | ||
|
|
d46b04631e | ||
|
|
30eca5a523 | ||
|
|
4fa71fd82a | ||
|
|
6819c7c792 | ||
|
|
0c9a0dfed1 | ||
|
|
5d9bcfb64a | ||
|
|
7047d68404 | ||
|
|
334f95479b | ||
|
|
9dff4d6ff3 | ||
|
|
4d7d031ee0 | ||
|
|
7c98af6358 | ||
|
|
ddcba4d33f | ||
|
|
59fe4a3a09 | ||
|
|
6774f36636 | ||
|
|
608cbc28af | ||
|
|
117c71faeb | ||
|
|
24d6a190af | ||
|
|
6a4b5ead86 | ||
|
|
674ede8665 | ||
|
|
8a269de89a | ||
|
|
ace4eac25a | ||
|
|
66bce08d10 | ||
|
|
65902367c6 | ||
|
|
8f0b92e42d | ||
|
|
f3d5f6628d | ||
|
|
4d687366ed | ||
|
|
3aa5019e70 | ||
|
|
4fb495d0fe | ||
|
|
c447fa8442 | ||
|
|
3a70ca9d03 | ||
|
|
5d11e9812d | ||
|
|
0d10982379 | ||
|
|
c20a966f06 | ||
|
|
64db05d3dd | ||
|
|
913cd91df0 | ||
|
|
2c5533589d | ||
|
|
cfdc81af02 | ||
|
|
7fa8a69fdc | ||
|
|
fd2861d683 | ||
|
|
cd9f5733b3 | ||
|
|
8b4560cbfb | ||
|
|
2d914d52be | ||
|
|
a26865e741 | ||
|
|
3558beaa61 | ||
|
|
9b9a9f14e2 | ||
|
|
0ce4f66976 | ||
|
|
b81bbde7c8 | ||
|
|
3f55bfe2cb | ||
|
|
4185ba242b | ||
|
|
e04191a5ea | ||
|
|
f07d304f19 | ||
|
|
1d1f618a13 | ||
|
|
e20610cdc6 | ||
|
|
721396b6d6 | ||
|
|
dc1dbe6158 | ||
|
|
30488e60e2 | ||
|
|
a5949960bc | ||
|
|
ec4a489093 | ||
|
|
7c52e03815 | ||
|
|
724c9361f3 | ||
|
|
147388e69a | ||
|
|
64aa281c97 | ||
|
|
c2b0330c56 | ||
|
|
de4803bb21 | ||
|
|
e574dcb091 | ||
|
|
488b0cbb69 | ||
|
|
6ceab55148 | ||
|
|
3d8b6f6b79 | ||
|
|
58d3213eef | ||
|
|
006dfdc55a | ||
|
|
a38c423ddb | ||
|
|
fa0295629b | ||
|
|
8395698090 | ||
|
|
277a91dbf8 | ||
|
|
ff36cfb5be | ||
|
|
db452f0c45 | ||
|
|
5b1195f874 | ||
|
|
d830724d4f | ||
|
|
0ef0edfa9a | ||
|
|
0ec868bd69 | ||
|
|
30e79e8412 | ||
|
|
c9b032acab | ||
|
|
1f410faccb | ||
|
|
d0e56106fe | ||
|
|
3d3d7dbc59 | ||
|
|
c0cbf9db5f | ||
|
|
db82eaec0a | ||
|
|
f4e200708d | ||
|
|
ba1944ded2 | ||
|
|
8eeef54b2e | ||
|
|
8e549d73a0 | ||
|
|
102d2a36f3 | ||
|
|
f046e27bb4 | ||
|
|
1c5cf17f1c | ||
|
|
ddb3a4be3e | ||
|
|
994f32704b | ||
|
|
1f798643c8 | ||
|
|
2f8d5e2dcd | ||
|
|
df30741535 | ||
|
|
762748028a | ||
|
|
f7c5cf137c | ||
|
|
455d91b0fc | ||
|
|
e834e51c0f | ||
|
|
bce518b214 | ||
|
|
3656994f82 | ||
|
|
fd5f6ef57f | ||
|
|
386b63b85d | ||
|
|
803103640a | ||
|
|
469a4a73f9 | ||
|
|
f401b05e7b | ||
|
|
42ed8a2748 | ||
|
|
f872eb64b5 | ||
|
|
29d054c421 | ||
|
|
7be6afe84d | ||
|
|
cf1fbdf8b5 | ||
|
|
6d2860efb7 | ||
|
|
5f29b8fcec | ||
|
|
59a8106373 | ||
|
|
c1d90273ca | ||
|
|
31b95ce47f | ||
|
|
4fe608e423 | ||
|
|
2cfeb1048c | ||
|
|
e8210d5865 | ||
|
|
fff981b220 | ||
|
|
a3f4caa291 | ||
|
|
ec54399d89 | ||
|
|
83f22fcce2 | ||
|
|
34a12f47f1 | ||
|
|
518462d882 | ||
|
|
1912513d7a | ||
|
|
1643e81c47 | ||
|
|
7ff427b456 | ||
|
|
91a96d27f1 | ||
|
|
a0f6ff101e | ||
|
|
9bcf401ef7 | ||
|
|
67a7ad069f | ||
|
|
367d24be7f | ||
|
|
1791c637d0 | ||
|
|
c6fe8818ed | ||
|
|
53a30eaa12 | ||
|
|
692cc42e10 | ||
|
|
9faaa5e8be | ||
|
|
418bbb2685 | ||
|
|
fb148027d9 | ||
|
|
05736afaf8 | ||
|
|
8a91d1d1ce | ||
|
|
2df139cf40 | ||
|
|
9f1208b595 | ||
|
|
9fd3212241 | ||
|
|
293f2e6b1c | ||
|
|
f83aa16f59 | ||
|
|
c73dd9ecaf | ||
|
|
607f08e79b | ||
|
|
511e5f39fa | ||
|
|
7d409dd2e0 | ||
|
|
9b8c0f3c7f | ||
|
|
727a78a74f | ||
|
|
a928ea6c57 | ||
|
|
d3f7dea624 | ||
|
|
456b7628ee | ||
|
|
f149beb474 | ||
|
|
1b0451761a | ||
|
|
1d26341b03 | ||
|
|
8348a113c6 | ||
|
|
bfdede7acc | ||
|
|
70894b48af | ||
|
|
b0c6b282fd | ||
|
|
393054dd3f | ||
|
|
97b10df723 | ||
|
|
62b214ffdf | ||
|
|
3549f43902 | ||
|
|
45167d5c0d | ||
|
|
0214b98c5e | ||
|
|
19c38158fc | ||
|
|
7ff35340ca | ||
|
|
a10340859d | ||
|
|
8475d88af0 | ||
|
|
79b1d24128 | ||
|
|
ad98e72884 | ||
|
|
3fab2b55cc | ||
|
|
2842030e59 | ||
|
|
7c2d21892f | ||
|
|
677bfe6857 | ||
|
|
b7ddf0b2e5 | ||
|
|
eb25fc1d5a | ||
|
|
395d40485d | ||
|
|
17af979b24 | ||
|
|
8511f25b97 | ||
|
|
290611f9ce | ||
|
|
6280066207 | ||
|
|
f054c317ee | ||
|
|
9555e611e1 | ||
|
|
5629ac3c63 | ||
|
|
110c316810 | ||
|
|
470a1aabdd | ||
|
|
b299d62a73 | ||
|
|
02b293b59c | ||
|
|
c659a231d6 | ||
|
|
4e56581222 | ||
|
|
e8ba16d9c2 | ||
|
|
4a43c77f66 | ||
|
|
55936087e0 | ||
|
|
3141eaecd0 | ||
|
|
69e14ba02f | ||
|
|
dffbcd8fdf | ||
|
|
ff3b03c5e2 | ||
|
|
32f4aa12cd | ||
|
|
fbb7948c13 | ||
|
|
d81a5a8338 | ||
|
|
652323a4bf | ||
|
|
e45518fb5f | ||
|
|
424e46849a | ||
|
|
68886ba847 | ||
|
|
da85815399 | ||
|
|
3bd648e72e | ||
|
|
2ae8ace784 | ||
|
|
1f89f21ca9 | ||
|
|
c6921cdc9d | ||
|
|
7c9f2949ce | ||
|
|
0b13e68bca | ||
|
|
5dde4c0a39 | ||
|
|
b2875d7b19 | ||
|
|
0c1cfbbad1 | ||
|
|
ddacf8cc43 | ||
|
|
395d13d5f1 | ||
|
|
1e6e522a93 | ||
|
|
f49a02e5b5 | ||
|
|
1e4dc90d62 | ||
|
|
2c3a41a81a | ||
|
|
203bb42cc1 | ||
|
|
461497e8d4 | ||
|
|
a974c83423 | ||
|
|
5eb181281a | ||
|
|
9eaeb04863 | ||
|
|
5e6c316603 | ||
|
|
77b4f6d68e | ||
|
|
a614716d0f | ||
|
|
1c856a208f | ||
|
|
c7916c8e48 | ||
|
|
0c023bb5bb | ||
|
|
df73bf38c2 | ||
|
|
7a1df3f914 | ||
|
|
3f78199cd5 | ||
|
|
0a55d4c981 | ||
|
|
7e03288724 | ||
|
|
979bf5c6fb | ||
|
|
a7f5b2e8fc | ||
|
|
94f246240d | ||
|
|
bd5fcf2998 | ||
|
|
c0cf839729 | ||
|
|
2a51d4fba8 | ||
|
|
cd1078563d | ||
|
|
a9943922d5 | ||
|
|
b46bfcafd1 | ||
|
|
6141c139e6 | ||
|
|
0fb83d7619 | ||
|
|
f64d0d8cbf | ||
|
|
e5d6bb68ce | ||
|
|
74899599a6 | ||
|
|
12c38c1d57 | ||
|
|
d243c6d7f9 | ||
|
|
c5481a125e | ||
|
|
68d80babce | ||
|
|
981c71c497 | ||
|
|
10bcbae68c | ||
|
|
1b265a7971 | ||
|
|
29c0dfb1d2 | ||
|
|
dbec5a8ce5 | ||
|
|
53eb85ba64 | ||
|
|
73fdefd65c | ||
|
|
86562a6c5a | ||
|
|
ceb63b83f2 | ||
|
|
7373e73067 | ||
|
|
985ba832fb | ||
|
|
de729e936d | ||
|
|
019f4b6b34 | ||
|
|
5bcb01e182 | ||
|
|
25c2059abb | ||
|
|
2a9c92f8e2 | ||
|
|
d468ea3efa | ||
|
|
d2cfe9f69a | ||
|
|
8dbe9e975b | ||
|
|
dd6174c496 | ||
|
|
7c1cf7781b | ||
|
|
9b363a62fe | ||
|
|
2cc39fe282 | ||
|
|
6255bd6c08 | ||
|
|
ab50d2090d | ||
|
|
c8843d0730 | ||
|
|
687da2ca6b | ||
|
|
990a87fd79 | ||
|
|
c4215a2bec | ||
|
|
342400d155 | ||
|
|
1ca308a5fd | ||
|
|
37eb0496b6 | ||
|
|
6a13bbbfef | ||
|
|
c175a7a470 | ||
|
|
937317e674 | ||
|
|
4248835ba1 | ||
|
|
180f7e4861 | ||
|
|
b526722000 | ||
|
|
b25bba4862 | ||
|
|
02ce417279 | ||
|
|
b0d2ae612f | ||
|
|
23e3d48eb9 | ||
|
|
14f26d2345 | ||
|
|
7c357423a3 | ||
|
|
cf2d6f6ec5 | ||
|
|
1443ef85be | ||
|
|
887aa2abdd | ||
|
|
9c5d6eaa71 | ||
|
|
c49318e973 | ||
|
|
131cc6497a | ||
|
|
d9d591ff7a | ||
|
|
f16b34f286 | ||
|
|
85d822b2e8 | ||
|
|
4e5689abeb | ||
|
|
b046c8d4ad | ||
|
|
72c72d0b37 | ||
|
|
5e69181d8d | ||
|
|
9c5a9fb100 | ||
|
|
ceb2349823 | ||
|
|
818b7c44be | ||
|
|
044026d330 | ||
|
|
66882f3825 | ||
|
|
1d0235780c | ||
|
|
770d6cb2bd | ||
|
|
106e1080ae | ||
|
|
07ecb3cb78 | ||
|
|
74ac435ae6 | ||
|
|
c80ba49a60 | ||
|
|
404d79153e | ||
|
|
ed9941ec2c | ||
|
|
c3b43f2ad2 | ||
|
|
86718439be | ||
|
|
933e373b07 | ||
|
|
e6dcd55480 | ||
|
|
0d901ef174 | ||
|
|
716e0db690 | ||
|
|
90b78132d4 | ||
|
|
c2285d923d | ||
|
|
4a79ac4473 | ||
|
|
2a3e5422ad | ||
|
|
e0c39dbf7e | ||
|
|
8c670b3b5d | ||
|
|
5dddec4dd9 | ||
|
|
93017bb8db | ||
|
|
059c45a85b | ||
|
|
63692a491d | ||
|
|
bbe79c1ef9 | ||
|
|
4b241f8da2 | ||
|
|
bdd6ae3252 | ||
|
|
24a3ff3aef | ||
|
|
ba988cd899 | ||
|
|
1bf1646d25 | ||
|
|
2c82151d65 | ||
|
|
d2235b71f3 | ||
|
|
ecc6c255ef | ||
|
|
57135acd2d | ||
|
|
54c098761f | ||
|
|
2f98400b80 | ||
|
|
ea7c9b93ea | ||
|
|
4317c008f0 | ||
|
|
d605d9ae73 | ||
|
|
c9fad25131 | ||
|
|
693200f1eb | ||
|
|
5f087a9dff | ||
|
|
b9cde6f8ea | ||
|
|
86eece78b1 | ||
|
|
8cb50ac6e9 | ||
|
|
997fbbde8f | ||
|
|
805ddc3c3a | ||
|
|
da9b3a9256 | ||
|
|
876560924f | ||
|
|
ca1c89c5bd | ||
|
|
7875e28d9f | ||
|
|
bd2f2a6f65 | ||
|
|
541aaa2392 | ||
|
|
d294b01cee | ||
|
|
5d9dc25115 | ||
|
|
c8988ec784 | ||
|
|
071dbc1115 | ||
|
|
80c5e4a156 | ||
|
|
6eac3063fa | ||
|
|
27925fcb0e | ||
|
|
5f4d21422a | ||
|
|
b0bb413faa | ||
|
|
37633985bd | ||
|
|
6ff8f1b2fd | ||
|
|
d13a3c7540 | ||
|
|
0a469d7bd6 | ||
|
|
115edc5fd1 | ||
|
|
a28c75f215 | ||
|
|
b9d7dab329 | ||
|
|
bb7500e984 | ||
|
|
e94268944b | ||
|
|
3225b487e8 | ||
|
|
e35c0e043e | ||
|
|
b251893030 | ||
|
|
15257e3922 | ||
|
|
180a5a1ad7 | ||
|
|
11f971d870 | ||
|
|
7c382c6b47 | ||
|
|
087f42d998 | ||
|
|
2abb5b6419 | ||
|
|
f2259adcdc | ||
|
|
a73457237d | ||
|
|
9f335d3ee6 | ||
|
|
856c8950ff | ||
|
|
61ccf4e719 | ||
|
|
1567db1f02 | ||
|
|
8316d5e366 | ||
|
|
8fca040163 | ||
|
|
c0fe1a7ffe | ||
|
|
e72c243aca | ||
|
|
14605d4b92 | ||
|
|
d1509971d8 | ||
|
|
951c9c5d73 | ||
|
|
3e6e247e56 | ||
|
|
27ce68b74a | ||
|
|
b0cf7a95b0 | ||
|
|
fd7f19c934 | ||
|
|
8090e213de | ||
|
|
de6327a885 | ||
|
|
8699c0f340 | ||
|
|
bda5454549 | ||
|
|
c3a6e35070 | ||
|
|
71c29bfcff | ||
|
|
647ed59d11 | ||
|
|
a0c489048a | ||
|
|
0f9def660d | ||
|
|
9fa65eadae | ||
|
|
facfff0022 | ||
|
|
f8b4083f47 | ||
|
|
b047b7838d | ||
|
|
b1c00ecee6 | ||
|
|
93abd8da59 | ||
|
|
3412f0554f | ||
|
|
61c83f9ffe | ||
|
|
3d7c1f8950 | ||
|
|
b0e81acc12 | ||
|
|
a682d97663 | ||
|
|
0e5137ae61 | ||
|
|
005a3da18f | ||
|
|
be6bcf882d | ||
|
|
fb344e8108 | ||
|
|
b99389bcb8 | ||
|
|
0fefdc99b2 | ||
|
|
e63419fbf4 | ||
|
|
428bb09a35 | ||
|
|
7c2c795681 | ||
|
|
165f352c58 | ||
|
|
3d6e702f63 | ||
|
|
597e9a96b4 | ||
|
|
6f4ed6c105 | ||
|
|
c3eafed472 | ||
|
|
7480fb703e | ||
|
|
24e8b484e0 | ||
|
|
d60f7f2e7a | ||
|
|
0dcffe7c33 | ||
|
|
9f09cfcfbd | ||
|
|
7373cd962c | ||
|
|
ac3f0df083 | ||
|
|
f95d54a13d | ||
|
|
fc512f0b9f | ||
|
|
f5ed59b7f2 | ||
|
|
9d51aa1443 | ||
|
|
f0bdc865b9 | ||
|
|
eda1703f9d | ||
|
|
51fc382582 | ||
|
|
6e52ef96a4 | ||
|
|
9606c1eee9 | ||
|
|
959c101400 | ||
|
|
6b096e5c5b | ||
|
|
9ac1eacdc8 | ||
|
|
8e7395a7e3 | ||
|
|
80fbc1b72d | ||
|
|
17ea03eee2 | ||
|
|
985b5a052e | ||
|
|
ed1872f0a8 | ||
|
|
34841c3a5f | ||
|
|
185f0181ac | ||
|
|
60d6a0f2d5 | ||
|
|
99a1d10bf1 | ||
|
|
2f1028ed79 | ||
|
|
f631e0e1e0 | ||
|
|
6df489d5a9 | ||
|
|
15c6ad88c0 | ||
|
|
40f6a9d830 | ||
|
|
bd06c00f3a | ||
|
|
f6d23f0c29 | ||
|
|
2a24459b92 | ||
|
|
f6da324670 | ||
|
|
11a18bd61a | ||
|
|
972134abe4 | ||
|
|
f8770b78ea | ||
|
|
10f2b11fda | ||
|
|
ea1cc4b991 | ||
|
|
8bee3e2fe0 | ||
|
|
1f7adfd9ff | ||
|
|
9e55cd68e4 | ||
|
|
2a6dc67fd7 | ||
|
|
1061ad289a | ||
|
|
0f81b58545 | ||
|
|
2437c5a0ae | ||
|
|
669a6ddeaa | ||
|
|
f5de46670b | ||
|
|
91af8a705b | ||
|
|
82c314f1af | ||
|
|
672413f1f6 | ||
|
|
843bf23f84 | ||
|
|
eeb2d2cc38 | ||
|
|
c370b8f309 | ||
|
|
acd9c12667 | ||
|
|
5535b26395 | ||
|
|
20611cf68c | ||
|
|
06c34ce02f | ||
|
|
4fb50c7408 | ||
|
|
c37bea1676 | ||
|
|
ed985640e8 | ||
|
|
2bd938952d | ||
|
|
623a56391c | ||
|
|
1b7fb10361 | ||
|
|
f6b6688186 | ||
|
|
99453e937c | ||
|
|
d3e0a1f68c | ||
|
|
76ff1a2a49 | ||
|
|
51c6ce1734 | ||
|
|
1998b673f4 | ||
|
|
627497f942 | ||
|
|
f9287941b4 | ||
|
|
5059854a2e | ||
|
|
aa8a061a83 | ||
|
|
3f2d44d517 | ||
|
|
b4af23be23 | ||
|
|
8ddf1f1ea5 | ||
|
|
475d8c4c11 | ||
|
|
fc823eb610 | ||
|
|
8707bab450 | ||
|
|
612955f2b7 | ||
|
|
36314c3ff7 | ||
|
|
33fb38d8de | ||
|
|
38e2a910df | ||
|
|
ef32df77be | ||
|
|
5154693ea4 | ||
|
|
4b68362981 | ||
|
|
658e4c5357 | ||
|
|
ce0dd650d7 | ||
|
|
77b65ada4f | ||
|
|
fa37225a42 | ||
|
|
78a06859b9 | ||
|
|
3ec8f4e84e | ||
|
|
f13a596d15 | ||
|
|
94f14778a3 | ||
|
|
7312284e4f | ||
|
|
ebc07d1458 | ||
|
|
510f719975 | ||
|
|
03c2202942 | ||
|
|
b3a97cb755 | ||
|
|
a9273e1c73 | ||
|
|
14d11ebcab | ||
|
|
7dc458d925 | ||
|
|
a0f04bdcf3 | ||
|
|
28f6e27276 | ||
|
|
5ef427bd65 | ||
|
|
03c1fa43f4 | ||
|
|
3b9f0ab866 | ||
|
|
9617a00ae3 | ||
|
|
1408199957 | ||
|
|
067df8d4dd | ||
|
|
2ab1b13092 | ||
|
|
964d0c219a | ||
|
|
c58eb9c276 | ||
|
|
5d4893b3f0 | ||
|
|
11b4e0d4c0 | ||
|
|
e637693131 | ||
|
|
c9d5b77403 | ||
|
|
574595993c | ||
|
|
50f4e53aef | ||
|
|
ac082e5504 | ||
|
|
f65f9591a1 | ||
|
|
a1eadde25b | ||
|
|
66e5027756 | ||
|
|
aa2d339508 | ||
|
|
d43aacefc9 | ||
|
|
f0a0e20b2f | ||
|
|
befdd8bb66 | ||
|
|
27ed2cc009 | ||
|
|
a60c866a12 | ||
|
|
a84f6228ca | ||
|
|
19da93b675 | ||
|
|
aa38fc712f | ||
|
|
0b1c91dc7c | ||
|
|
ab2c8de4de | ||
|
|
00f2b134e3 | ||
|
|
0b8cebd6ef | ||
|
|
53a9b7f6c0 | ||
|
|
667fd927ee | ||
|
|
a8956838d3 | ||
|
|
e7c9e2060c | ||
|
|
f6be407e33 | ||
|
|
2bf9b37e59 | ||
|
|
d2e0ada794 | ||
|
|
c07ae5806e | ||
|
|
5afe6f7825 | ||
|
|
d02c48f987 | ||
|
|
c835214540 | ||
|
|
cb2901ec40 | ||
|
|
f27bd061fb | ||
|
|
572386e4ce | ||
|
|
67a972182e | ||
|
|
5955e11a5a | ||
|
|
8daaafc864 | ||
|
|
ebaa96c0fa | ||
|
|
fb3d08c651 | ||
|
|
9d15e64f0b | ||
|
|
b62564fd98 | ||
|
|
0266bcab7a | ||
|
|
6652e14662 | ||
|
|
7a50f86f3f | ||
|
|
59218d02c8 | ||
|
|
fe73730d21 | ||
|
|
b814970bdd | ||
|
|
8dfbef5e6f | ||
|
|
0b9a3fc160 | ||
|
|
79105962a7 | ||
|
|
a36e2bc764 | ||
|
|
cc878160bd | ||
|
|
382153e82d | ||
|
|
e195341e30 | ||
|
|
c6c8263704 | ||
|
|
ed02bea20d | ||
|
|
f89a1b05fe | ||
|
|
af65b7e6d7 | ||
|
|
1995ad6d63 | ||
|
|
83c0937a46 | ||
|
|
f5cc2c0d20 | ||
|
|
931d68bc92 | ||
|
|
06946c35d3 | ||
|
|
cbe81fd443 | ||
|
|
173e919d2a | ||
|
|
73fdb8f7b0 | ||
|
|
8e0ba37866 | ||
|
|
8780f50e7e | ||
|
|
06dc357ea0 | ||
|
|
fb587cb529 | ||
|
|
a026677849 | ||
|
|
1c389b1f24 | ||
|
|
55b9aa0309 | ||
|
|
2d5cf2b4c4 | ||
|
|
4877bb5b5c | ||
|
|
b9269d5644 | ||
|
|
1a4723988e | ||
|
|
93353888ca | ||
|
|
c3a90b76d0 | ||
|
|
43e5ca9a1b | ||
|
|
c5829bd0e2 | ||
|
|
2a9d2cc7e9 | ||
|
|
0d9873d8bc | ||
|
|
23bc38ed06 | ||
|
|
42d26b4b05 | ||
|
|
04700789e1 | ||
|
|
e23baa59f0 | ||
|
|
e8e28b61db | ||
|
|
b766707f28 | ||
|
|
0787f262a0 | ||
|
|
d833f4a632 | ||
|
|
ce1e364ab8 | ||
|
|
adb5b299c9 | ||
|
|
fc9462d49e | ||
|
|
9c849d2084 | ||
|
|
336b30c532 | ||
|
|
b331e29e43 | ||
|
|
54cdafdd67 | ||
|
|
30541201b6 | ||
|
|
6346fa960c | ||
|
|
99c98d0736 | ||
|
|
496e673d77 | ||
|
|
d3aad3b574 | ||
|
|
371dab51bb | ||
|
|
3ea2258ce9 | ||
|
|
c7feae65f1 | ||
|
|
b087948933 | ||
|
|
f611d55f16 | ||
|
|
12b1007046 | ||
|
|
4a4c15b2ac | ||
|
|
8804427677 | ||
|
|
d717971f41 | ||
|
|
f33df84eff | ||
|
|
7910271b6c | ||
|
|
e3ce99988f | ||
|
|
fb78f1ef8e | ||
|
|
1ba1eda8ab | ||
|
|
2945430ad7 | ||
|
|
66500a6882 | ||
|
|
2c4c07c96d | ||
|
|
69c86ae385 | ||
|
|
21eac434c3 | ||
|
|
2f21003064 | ||
|
|
58b65d1bf6 | ||
|
|
542829ee81 | ||
|
|
b43c8ae646 | ||
|
|
22e6fa3a64 | ||
|
|
c337887e29 | ||
|
|
650688c635 | ||
|
|
2787e916b2 | ||
|
|
e72119e9bb | ||
|
|
efcb3a9d67 | ||
|
|
9f19699806 | ||
|
|
326cb1148b | ||
|
|
767e7cb06f | ||
|
|
084725e280 | ||
|
|
6e3b6980de | ||
|
|
9927d9bda2 | ||
|
|
34c6ef5332 | ||
|
|
8af3e407c2 | ||
|
|
8736343544 | ||
|
|
9caca0b127 | ||
|
|
9d86020d4c | ||
|
|
32eedec565 | ||
|
|
1af004361c | ||
|
|
b33c56819b | ||
|
|
30f09ea10b | ||
|
|
db3e225f09 | ||
|
|
a44c06b264 | ||
|
|
f5f9f70dd0 | ||
|
|
03e5c6e32d | ||
|
|
ca9e0c0e68 | ||
|
|
0e1632d002 | ||
|
|
f4eb026c86 | ||
|
|
e46fa81927 | ||
|
|
33c6b428f7 | ||
|
|
12331e3376 | ||
|
|
dd5e6d47db | ||
|
|
2541037ec2 | ||
|
|
9d6aa7d88e | ||
|
|
0bd16308d6 | ||
|
|
0011ce949c | ||
|
|
cc987b31ae | ||
|
|
c092d0a616 | ||
|
|
ea390a4a73 | ||
|
|
6b98948f9a | ||
|
|
f57afe51af | ||
|
|
bc22d04737 | ||
|
|
093677b0f8 | ||
|
|
c38e050cc7 | ||
|
|
ba0122fd02 | ||
|
|
affd2737d5 | ||
|
|
cc68073af0 | ||
|
|
cb2948eda6 | ||
|
|
1b105cdbef | ||
|
|
dd436e8fe6 | ||
|
|
a8d2bb6b22 | ||
|
|
fcdc5030bd | ||
|
|
aad9adf8c3 | ||
|
|
48a223abdf | ||
|
|
12e720fb23 | ||
|
|
042e13a932 | ||
|
|
2b9481ecdc | ||
|
|
933c0c678a | ||
|
|
2539828eac | ||
|
|
4b6f3e0f2c | ||
|
|
b9eb818b57 | ||
|
|
eda547fc4e | ||
|
|
1dbd017766 | ||
|
|
08d9a57c6e | ||
|
|
d7b5966fa7 | ||
|
|
bb44120ae3 | ||
|
|
8b1f034242 | ||
|
|
bb7968ba77 | ||
|
|
7451e51619 | ||
|
|
ea93e18081 | ||
|
|
443e44853a | ||
|
|
b73e95655d | ||
|
|
e8bb84e0e2 | ||
|
|
626c525706 | ||
|
|
2ef2148fb5 | ||
|
|
86ad1bec16 | ||
|
|
360a728d77 | ||
|
|
cfcf0a7a8a | ||
|
|
f57fca7a00 | ||
|
|
7c38ac1954 | ||
|
|
dbe802f685 | ||
|
|
cfb293d396 | ||
|
|
2227fb957f | ||
|
|
824326a029 | ||
|
|
10b967ae1f | ||
|
|
0174bf4345 | ||
|
|
1acfae8df2 | ||
|
|
ce489f21fb | ||
|
|
368f04e06b | ||
|
|
dc91782165 | ||
|
|
86a75abe51 | ||
|
|
70aaecc937 | ||
|
|
057effc5d6 | ||
|
|
d8c116f20a | ||
|
|
01386aef29 | ||
|
|
b3fb80c608 | ||
|
|
5b69fd535d | ||
|
|
7831980c1d | ||
|
|
fbfc7dc690 | ||
|
|
d8eec549f0 | ||
|
|
7389e704dc | ||
|
|
b64da6d268 | ||
|
|
2ba2a216ca | ||
|
|
e5add36a17 | ||
|
|
fe14181d4e | ||
|
|
378a573cf4 | ||
|
|
ec8684e87d | ||
|
|
54042029d3 | ||
|
|
e1fa627158 | ||
|
|
9d5bb875b1 | ||
|
|
b3c150e929 | ||
|
|
d03a55599b | ||
|
|
ed8fe6c219 | ||
|
|
c835ae2a02 | ||
|
|
e20c207a22 | ||
|
|
e19c4a3372 | ||
|
|
934bfc8887 | ||
|
|
713a6676ff | ||
|
|
448a88e4f5 | ||
|
|
ed22af50bc | ||
|
|
d3dc9c41b4 | ||
|
|
d1b2ded7e2 | ||
|
|
ee3faf24b9 | ||
|
|
16ab648093 | ||
|
|
11a1f8f36a | ||
|
|
1eda9884a0 | ||
|
|
ae4bb2d914 | ||
|
|
6d68c536f3 | ||
|
|
e74a9d09e6 | ||
|
|
b2b847f365 | ||
|
|
cb15ec0257 | ||
|
|
115923b2d9 | ||
|
|
ad60efb5d7 | ||
|
|
b7efe4eb4f | ||
|
|
92c359ca09 | ||
|
|
ec742f9373 | ||
|
|
fde75aa9f6 | ||
|
|
2df3c39e50 | ||
|
|
22659afd00 | ||
|
|
410e7dcf5d | ||
|
|
bd8655fdee | ||
|
|
e9f1ee5aab | ||
|
|
4abdf695e3 | ||
|
|
b1090ac8e2 | ||
|
|
1ab081b584 | ||
|
|
1df17f2fea | ||
|
|
682e97826c | ||
|
|
805fea20cb | ||
|
|
415bfeb950 | ||
|
|
2f20a40922 | ||
|
|
5235a4c48a | ||
|
|
bb7f6ed544 | ||
|
|
f1d6a0a4ed | ||
|
|
3c1cca13b7 | ||
|
|
1ef805328f | ||
|
|
fd73f8d972 | ||
|
|
3a8ebf4c9f | ||
|
|
b482b7d8af | ||
|
|
0d69c42320 | ||
|
|
011f5afe4e | ||
|
|
8bab7b237c | ||
|
|
821a458393 | ||
|
|
66120cff4b | ||
|
|
8ce1034e87 | ||
|
|
a39d708859 | ||
|
|
98df0be43d | ||
|
|
4125eb01ba | ||
|
|
346bba6592 | ||
|
|
0bd039a524 | ||
|
|
f4705bab1e | ||
|
|
c7a9d7b56b | ||
|
|
4d4b836976 | ||
|
|
506d73cf32 | ||
|
|
d71ad3539e | ||
|
|
266a3a5267 | ||
|
|
48f8affb2c | ||
|
|
2503251576 | ||
|
|
a27fed47e0 | ||
|
|
56030a7a81 | ||
|
|
fee3aaae94 | ||
|
|
20f15f5111 | ||
|
|
9ef3e70040 | ||
|
|
f1215d2d77 | ||
|
|
0ad73da68a | ||
|
|
e2a4be0243 | ||
|
|
2d80b105ce | ||
|
|
1f4130b927 | ||
|
|
bdf40943db | ||
|
|
4c9357aaef | ||
|
|
01bd4cc4e1 | ||
|
|
92bc78c12f | ||
|
|
8e427b7d69 | ||
|
|
2ad127d290 | ||
|
|
2c80691be6 | ||
|
|
1cd71203b8 | ||
|
|
9c5fc0fb7a | ||
|
|
1927a8af71 | ||
|
|
fe40e674c5 | ||
|
|
194b0be8bf | ||
|
|
c42219cd5b | ||
|
|
637186976c | ||
|
|
175d4ef03e | ||
|
|
85af410b8b | ||
|
|
347cb94c43 | ||
|
|
c5485cd6b1 | ||
|
|
e30c974646 | ||
|
|
6b6c76e3a2 | ||
|
|
25a8fa73f8 | ||
|
|
7f2e3c44b3 | ||
|
|
a2aa25d28e | ||
|
|
9f4da7dfd1 | ||
|
|
646a1c2b88 | ||
|
|
c47553e319 | ||
|
|
45f162fc50 | ||
|
|
a20291f235 | ||
|
|
3468b2fc44 | ||
|
|
aa0d0dc510 | ||
|
|
9c82946e45 | ||
|
|
e5a9255555 | ||
|
|
e14322137f | ||
|
|
f27d855c68 | ||
|
|
0553b10214 | ||
|
|
105fc16a9a | ||
|
|
efbc661620 | ||
|
|
7fb5b970f5 | ||
|
|
5f9bcd0409 | ||
|
|
bd3f4599ed | ||
|
|
ddf6138d07 | ||
|
|
8c6bbcdc2e | ||
|
|
a55d179215 | ||
|
|
ec39ddee63 | ||
|
|
0f096d6ad9 | ||
|
|
92d42d4b67 | ||
|
|
17b5cfc924 | ||
|
|
5590e2f6f2 | ||
|
|
ae2e548b4b | ||
|
|
4dbf73d9aa | ||
|
|
86f8be41d0 | ||
|
|
f60149cd9e | ||
|
|
aca8090a09 | ||
|
|
84437ee0e0 | ||
|
|
dc858c9686 | ||
|
|
581b39a38d | ||
|
|
a37b9d7578 | ||
|
|
5a3fe9e5f5 | ||
|
|
f44d611f77 | ||
|
|
29fb9ae2d6 | ||
|
|
2595cd5a93 | ||
|
|
bf14d75cad | ||
|
|
b99511ee55 | ||
|
|
3bf90b4218 | ||
|
|
9873d983ed | ||
|
|
3338d24da4 | ||
|
|
10cd539104 | ||
|
|
e4623fd0c4 | ||
|
|
9fa3742c09 | ||
|
|
5317e4bc07 | ||
|
|
2127cc1943 | ||
|
|
04b7dd802a | ||
|
|
7de9eb005e | ||
|
|
d68e312c2b | ||
|
|
0cf5b66e7b | ||
|
|
d5bf3c2cd1 | ||
|
|
094788f1a3 | ||
|
|
23e68c0988 | ||
|
|
60902484fd | ||
|
|
48c9c86626 | ||
|
|
2e27a76edd | ||
|
|
be8fc8f26b | ||
|
|
f1e3581347 | ||
|
|
0606dd511a | ||
|
|
3e68c694b9 | ||
|
|
ffa5334a2d | ||
|
|
5e25ba6c5a | ||
|
|
5f6d072459 | ||
|
|
1038b9b8a1 | ||
|
|
0dc384265c | ||
|
|
133461581f | ||
|
|
79d6a77d58 | ||
|
|
d5da3b9199 | ||
|
|
a8df81b27c | ||
|
|
6c31092c69 | ||
|
|
ca1c570c21 | ||
|
|
33b836af7f | ||
|
|
e7a420c40e | ||
|
|
962c4d6a69 | ||
|
|
0f053d1804 | ||
|
|
930d779eb3 | ||
|
|
f3ca814f3d | ||
|
|
7fac6b37db | ||
|
|
d2f979ffaf | ||
|
|
e54060bac2 | ||
|
|
965483eb67 | ||
|
|
dff5986ec2 | ||
|
|
028bccc188 | ||
|
|
78b427c99d | ||
|
|
aec0a49e91 | ||
|
|
e60ea00e8b | ||
|
|
01df133401 | ||
|
|
56a6120136 | ||
|
|
340a8e11b0 | ||
|
|
2da14da32c | ||
|
|
641f2f72cd | ||
|
|
e8a120e5af | ||
|
|
e9872d52d8 | ||
|
|
3b8bd265a3 | ||
|
|
af162b70c5 | ||
|
|
061f257e83 | ||
|
|
c58d9446f4 | ||
|
|
e4d684b116 | ||
|
|
8f5444c75b | ||
|
|
96c0fbf209 | ||
|
|
98178d8823 | ||
|
|
3f6dd34b18 | ||
|
|
aaed61de66 | ||
|
|
1aa86d23f4 | ||
|
|
c4607f72d1 | ||
|
|
f5f4c3cdfc | ||
|
|
9a1b4a766f | ||
|
|
87d2e86429 | ||
|
|
ee2c55379c | ||
|
|
be8a831496 | ||
|
|
2ce8c82846 | ||
|
|
7d57f978c5 | ||
|
|
22e7d11583 | ||
|
|
9cc6ddf80d | ||
|
|
ee9d99cba3 | ||
|
|
5c458e3061 | ||
|
|
dfbcd475f3 | ||
|
|
018efdb8eb | ||
|
|
ec594f80dc | ||
|
|
131837087b | ||
|
|
7eec162502 | ||
|
|
8c884e94c2 | ||
|
|
7659d8af3d | ||
|
|
a5e7e72dd8 | ||
|
|
8e8e869853 | ||
|
|
b41838a7fd | ||
|
|
5ebabd7cf6 | ||
|
|
388733fe77 | ||
|
|
e1007e6c2b | ||
|
|
2c2092e7b8 | ||
|
|
2579f66150 | ||
|
|
077692a8e1 | ||
|
|
5b77d3fde3 | ||
|
|
6d8153d8fd | ||
|
|
ae711d8301 | ||
|
|
00d889b4b6 | ||
|
|
401e2d16a8 | ||
|
|
4b5a8c45b4 | ||
|
|
ae54517b33 | ||
|
|
ebaeb9f3b8 | ||
|
|
a21d97db2e | ||
|
|
ebc8b01718 | ||
|
|
cf5e923d84 | ||
|
|
fa08d848ca | ||
|
|
d29d59d1f9 | ||
|
|
edf6f9e108 | ||
|
|
98f376a19e | ||
|
|
de68925f0c | ||
|
|
b890e87818 | ||
|
|
e0f4e44044 | ||
|
|
edf85cb1b3 | ||
|
|
841e9b3f0e | ||
|
|
93f9138c9b | ||
|
|
1ace77b923 | ||
|
|
dd4d6930b5 | ||
|
|
db76b52744 | ||
|
|
7235472a58 | ||
|
|
99871639fe | ||
|
|
eebc2f20fa | ||
|
|
b92f4177aa | ||
|
|
20b906cee8 | ||
|
|
7a768a2581 | ||
|
|
17c7662a6c | ||
|
|
14c3bc542d | ||
|
|
dd370db62a | ||
|
|
43ba86b7af | ||
|
|
2425d61516 | ||
|
|
3bf4c5687c | ||
|
|
7fc2d9adc0 | ||
|
|
17dd32da88 | ||
|
|
ec2aac5b61 | ||
|
|
15f7d2a27d | ||
|
|
3dafdcbab0 | ||
|
|
383fa6b0b0 | ||
|
|
f637ab57f1 | ||
|
|
615b4d8c65 | ||
|
|
9be5c7b0c8 | ||
|
|
670b102553 | ||
|
|
9bd9a11de4 | ||
|
|
ec26e4f6b4 | ||
|
|
538ab75002 | ||
|
|
1c99dbc70e | ||
|
|
afd56517d1 | ||
|
|
3c7ba21a6a | ||
|
|
4b655ecd36 | ||
|
|
028942c8c3 | ||
|
|
55b171c986 | ||
|
|
a4416e389a | ||
|
|
d6818475d7 | ||
|
|
287c40276a | ||
|
|
5916ae5ec4 | ||
|
|
03829e191e | ||
|
|
f958a6ecf7 | ||
|
|
71bad81aff | ||
|
|
75d9310986 | ||
|
|
93d4253c93 | ||
|
|
c0faf0c6b6 | ||
|
|
b63690aa6b | ||
|
|
1e8a58e367 | ||
|
|
34d7e25a1f | ||
|
|
b353221185 | ||
|
|
eb6edac4bd | ||
|
|
f316fe0f58 | ||
|
|
12854f1428 | ||
|
|
309a7aa253 | ||
|
|
363c88cef7 | ||
|
|
74a1c60dd4 | ||
|
|
a4bb81b61c | ||
|
|
01c0acb707 | ||
|
|
afbc1d5b66 | ||
|
|
1d9e68245a | ||
|
|
9b98641ddd | ||
|
|
2c1d218749 | ||
|
|
716485113a | ||
|
|
d70feb9165 | ||
|
|
38af49d4fd | ||
|
|
007de568c9 | ||
|
|
d2913b81cb | ||
|
|
c90078fd4a | ||
|
|
428e647238 | ||
|
|
4c7914dc49 | ||
|
|
5e35a4b69a | ||
|
|
9a30019268 | ||
|
|
972276436f | ||
|
|
e81a1db48c | ||
|
|
33a4442988 | ||
|
|
3035bf1e39 | ||
|
|
14bf58ec5d | ||
|
|
a2a3aab94d | ||
|
|
7ff9a3f3a0 | ||
|
|
8070bac06c | ||
|
|
d4731a4ab4 | ||
|
|
0c6266fd1a | ||
|
|
5b0e91844b | ||
|
|
c4363e2706 | ||
|
|
ccaacfc8c3 | ||
|
|
2e9d772e66 | ||
|
|
bac6e79614 | ||
|
|
2fd86ef80c | ||
|
|
f9370d7e83 | ||
|
|
bc75965053 | ||
|
|
77107f70c4 | ||
|
|
b41aeabbec | ||
|
|
c0ae36e943 | ||
|
|
5851415fca | ||
|
|
36b4b39619 | ||
|
|
d7bf3605b9 | ||
|
|
15211556df | ||
|
|
13f8583934 | ||
|
|
350110ad9d | ||
|
|
d771aa6fee | ||
|
|
4acb56d8c5 | ||
|
|
afaa9810d1 | ||
|
|
6aa68fcfee | ||
|
|
b2b2070415 | ||
|
|
c5b2bbf01b | ||
|
|
f4d3d8e27c | ||
|
|
4f6fa87f00 | ||
|
|
01bd6cfd17 | ||
|
|
000487c36c | ||
|
|
5870f1c90a | ||
|
|
30ef48143f | ||
|
|
0232218100 | ||
|
|
31cf894092 | ||
|
|
509db01319 | ||
|
|
ff4552c842 | ||
|
|
c22af88235 | ||
|
|
6719616c36 | ||
|
|
18c7284817 | ||
|
|
8912a6eb75 | ||
|
|
9b7a73268e | ||
|
|
d4d9644409 | ||
|
|
80473ccd69 | ||
|
|
b51a5446ba | ||
|
|
d7e6fbf8a2 | ||
|
|
acae90cc6e | ||
|
|
dcfb4690c3 | ||
|
|
9e8d845a61 | ||
|
|
1e2b5a9c19 | ||
|
|
4079b782d6 | ||
|
|
dca142d5d2 | ||
|
|
52c630d994 | ||
|
|
aadd9ae201 | ||
|
|
3df0f95ee3 | ||
|
|
5dc6194b98 | ||
|
|
c025a569a9 | ||
|
|
dd61c248c1 | ||
|
|
a6c1aef78b | ||
|
|
9f761feb93 | ||
|
|
38f09ac38e | ||
|
|
fed071ca96 | ||
|
|
4629f206c5 | ||
|
|
aba6371ea5 | ||
|
|
bca4af360d | ||
|
|
32f58e6c0b | ||
|
|
4ce65f019e | ||
|
|
707229ce17 | ||
|
|
e702d42597 | ||
|
|
64db8be7d5 | ||
|
|
7eaa10dd8e | ||
|
|
102e7d0838 | ||
|
|
9f4e7b1249 | ||
|
|
378cca75ea | ||
|
|
69ab403d78 | ||
|
|
33011ccdff | ||
|
|
7915e998e2 | ||
|
|
7ef51da1c1 | ||
|
|
ce949c0f25 | ||
|
|
e9d966488b | ||
|
|
4c8688b846 | ||
|
|
cea66139ae | ||
|
|
c1658903b7 | ||
|
|
15e7bf50df | ||
|
|
e87bc3d33d | ||
|
|
10be40a8b1 | ||
|
|
8e6ec0b8a3 | ||
|
|
25577e4fbf | ||
|
|
dc8c37120e | ||
|
|
a375c41510 | ||
|
|
b8e905eae7 | ||
|
|
d1134e7616 | ||
|
|
b0fcf64544 | ||
|
|
604f4cf8bf | ||
|
|
1420e846b5 | ||
|
|
c3aeac19bc | ||
|
|
deef018c68 | ||
|
|
aae0770b82 | ||
|
|
51ec0f1348 | ||
|
|
4ed062ec2a | ||
|
|
69ee1e1b86 | ||
|
|
3bf6bdae73 | ||
|
|
d0c54c1286 | ||
|
|
cbc2493315 | ||
|
|
fa784aaa06 | ||
|
|
ab148c0135 | ||
|
|
10813ddc23 | ||
|
|
8dfdd682cc | ||
|
|
9149c79f25 | ||
|
|
a50bf27cf2 | ||
|
|
ddaf50dfcc | ||
|
|
8a7fb4b133 | ||
|
|
a02c588b19 | ||
|
|
fede7cd81c | ||
|
|
fcbc972c2a | ||
|
|
9e0bf35941 | ||
|
|
f78c167476 | ||
|
|
b9ed957af3 | ||
|
|
949eb8d17a | ||
|
|
167c6119eb | ||
|
|
ef2af521b1 | ||
|
|
aedc956f6c | ||
|
|
d9c0d98871 | ||
|
|
dd7d76f389 | ||
|
|
bc88f01165 | ||
|
|
7ff69e9356 | ||
|
|
188e28e196 | ||
|
|
3536bdd7a6 | ||
|
|
c0c8e93d90 | ||
|
|
8d9a3de65a | ||
|
|
c66f2ca9eb | ||
|
|
9c13bf70a7 | ||
|
|
a4debecfb1 | ||
|
|
b230ea2140 | ||
|
|
a37dc29850 | ||
|
|
fe6238d1c4 | ||
|
|
e7bf4a3de8 | ||
|
|
c133db4364 | ||
|
|
694daa1d20 | ||
|
|
f858a269dd | ||
|
|
c916221f59 | ||
|
|
80539811c0 | ||
|
|
09ea880a43 | ||
|
|
58774eea72 | ||
|
|
68682dda89 | ||
|
|
6ae01f9815 | ||
|
|
3b9a8194a5 | ||
|
|
fdc9bfa2e9 | ||
|
|
9103fd6687 | ||
|
|
ffcffcd773 | ||
|
|
450879b1da | ||
|
|
c6cdd36586 | ||
|
|
717d4abebb | ||
|
|
e8c4b8338f | ||
|
|
d54b7dec94 | ||
|
|
0a6848d70b | ||
|
|
b8988be4b5 | ||
|
|
45eec06500 | ||
|
|
2090dbb27d | ||
|
|
96856527e6 | ||
|
|
f81e6042be | ||
|
|
5d272a12cb | ||
|
|
3212b07cf1 | ||
|
|
f573a1f3f2 | ||
|
|
fbd0c8dc34 | ||
|
|
e33af5895f | ||
|
|
f7d2985f89 | ||
|
|
2bd8124b5d | ||
|
|
5e765eaac4 | ||
|
|
4d09bf3b9b | ||
|
|
6df8bf7dde | ||
|
|
d8db984890 | ||
|
|
072adbf079 | ||
|
|
1ef6a35f3e | ||
|
|
91f0fcde96 | ||
|
|
82823dac97 | ||
|
|
848a8a792e | ||
|
|
7ef173aa34 | ||
|
|
f72d672434 | ||
|
|
5ebd42d402 | ||
|
|
e706d4860e | ||
|
|
5573a3465c | ||
|
|
5f642f8096 | ||
|
|
6bc4446e3e | ||
|
|
6c78eeebe4 | ||
|
|
58a88a88b8 | ||
|
|
537d21155f | ||
|
|
2a24b8c653 | ||
|
|
665edcba53 | ||
|
|
a0437628e3 | ||
|
|
0daa1f3daa | ||
|
|
c7b7d78ae1 | ||
|
|
abfa4d4a5c | ||
|
|
d59d9d4bd5 | ||
|
|
3d100abea8 | ||
|
|
6f170a0cf7 | ||
|
|
c55aa7e590 | ||
|
|
88141103cd | ||
|
|
ff91ce9eb4 | ||
|
|
7af15ae277 | ||
|
|
001d62381a | ||
|
|
47139bc506 | ||
|
|
bf543e0367 | ||
|
|
5c34b30819 | ||
|
|
ddcc9db568 | ||
|
|
3bff7d3a37 | ||
|
|
2f7f6e6a37 | ||
|
|
5907ecebfc | ||
|
|
a7769c9c88 | ||
|
|
b490800949 | ||
|
|
ee5587d516 | ||
|
|
01c3e2ce0d | ||
|
|
5e0c1e6a86 | ||
|
|
741a9cb320 | ||
|
|
0d57abfe65 | ||
|
|
96d707444d | ||
|
|
3852661865 | ||
|
|
c0657297d1 | ||
|
|
932aa58237 | ||
|
|
5cda824784 | ||
|
|
1a33278703 | ||
|
|
bd843acde9 | ||
|
|
12ca08c382 | ||
|
|
78d20b9301 | ||
|
|
bc6643f3c2 | ||
|
|
fc9873e9ef | ||
|
|
253a39c6e9 | ||
|
|
825e98dcca | ||
|
|
1afc749443 | ||
|
|
6b80d90db5 | ||
|
|
e2b23e8fde | ||
|
|
c0f090627a | ||
|
|
3697c57e56 | ||
|
|
52b1a347d8 | ||
|
|
aeef59fda9 | ||
|
|
84632b0901 | ||
|
|
e516616cca | ||
|
|
d62ad4e6df | ||
|
|
a7abb394e8 | ||
|
|
501eda2956 | ||
|
|
7fac7c2d28 | ||
|
|
295c5594ce | ||
|
|
a65f70ac23 | ||
|
|
2e615d8c20 | ||
|
|
ce5b51b017 | ||
|
|
cca73c436d | ||
|
|
840a5e35f4 | ||
|
|
af19c7275b | ||
|
|
d7b1ecdf52 | ||
|
|
ba0579c670 | ||
|
|
757c9675b0 | ||
|
|
cc28a7b0ef | ||
|
|
58fd969b2d | ||
|
|
495b9caf63 | ||
|
|
aece8bab17 | ||
|
|
ea53b445a8 | ||
|
|
70d14f60b2 | ||
|
|
6451250b2e | ||
|
|
076b2f11d2 | ||
|
|
7ae1d9d796 | ||
|
|
c8a96d08a0 | ||
|
|
6d969d1026 | ||
|
|
177c0eb9e2 | ||
|
|
1306727fb1 | ||
|
|
e5d6b493c0 | ||
|
|
0f10b170f4 | ||
|
|
6aebedb8bc | ||
|
|
025375ff5f | ||
|
|
cd0081d08a | ||
|
|
48821a64d0 | ||
|
|
81340da8b6 | ||
|
|
466d2a84de | ||
|
|
ddebf07236 | ||
|
|
0ba1aad4e3 | ||
|
|
4b144855b9 | ||
|
|
b6bfeb786f | ||
|
|
573b20a8f8 | ||
|
|
8f9c3ed44a | ||
|
|
9ce7b16dd8 | ||
|
|
597665517c | ||
|
|
228b3fc622 | ||
|
|
ea9cea9be7 | ||
|
|
56f56e6352 | ||
|
|
2323e8d77d | ||
|
|
531468cab6 | ||
|
|
58fcd09cff | ||
|
|
2940b17a8e | ||
|
|
b8c5bf8af8 | ||
|
|
d061bcad52 | ||
|
|
1d2af907fc | ||
|
|
329994291a | ||
|
|
b2da99fd4e | ||
|
|
2d97357136 | ||
|
|
4361a884bf | ||
|
|
14dc92c747 | ||
|
|
c9760ed456 | ||
|
|
7c148bebef | ||
|
|
7aeb504652 | ||
|
|
e0d36d1f2d | ||
|
|
68fb643a7e | ||
|
|
fb0dcaf066 | ||
|
|
4277eeee1b | ||
|
|
9f3fb69dce | ||
|
|
0e18e52f00 | ||
|
|
d2430c70bd | ||
|
|
4de4957aa3 | ||
|
|
0fc1a290e2 | ||
|
|
1b8a025a5f | ||
|
|
d798527290 | ||
|
|
6140dafecf | ||
|
|
3a5cf61a4d | ||
|
|
a11119d317 | ||
|
|
756720fde4 | ||
|
|
2b920b22c1 | ||
|
|
bb8fa045c2 | ||
|
|
4cc21f1fa1 | ||
|
|
5c4ca1424d | ||
|
|
6372a33838 | ||
|
|
b93631164f | ||
|
|
46bad5d513 | ||
|
|
edc31a264c | ||
|
|
99704248b7 | ||
|
|
7a09143519 | ||
|
|
25295d1e17 | ||
|
|
6920fc3625 | ||
|
|
b2f2b3f169 | ||
|
|
466e8a70e5 | ||
|
|
f2542e95f9 | ||
|
|
02b27775d8 | ||
|
|
9af4a420a3 | ||
|
|
9efdf3c65c | ||
|
|
e162b3ee19 | ||
|
|
1fd75d0fa2 | ||
|
|
de5939f319 | ||
|
|
31e3c1e362 | ||
|
|
1c03745ee4 | ||
|
|
778d3884e2 | ||
|
|
0f57e6c3c0 | ||
|
|
edfaa5fc36 | ||
|
|
b7bfb29ae8 | ||
|
|
caab6ac6e7 | ||
|
|
9d4b01fff8 | ||
|
|
10921aa237 | ||
|
|
3f548327b5 | ||
|
|
f6a4e68973 | ||
|
|
eae4a194b8 | ||
|
|
f693da148e | ||
|
|
386b36a625 | ||
|
|
52ae384bfd | ||
|
|
b98ad549c2 | ||
|
|
d015b1b29e | ||
|
|
343d294bfb | ||
|
|
6566fdc1e3 | ||
|
|
bcdd6d5425 | ||
|
|
cbbbf44dd4 | ||
|
|
2455978c78 | ||
|
|
343707e0a2 | ||
|
|
1b10020b6e | ||
|
|
57444f77f7 | ||
|
|
06460ea50c | ||
|
|
e12c9de5df | ||
|
|
f38bbb9bc2 | ||
|
|
75cfe3c6ae | ||
|
|
24608d5c23 | ||
|
|
b25f93e24c | ||
|
|
df08387e35 | ||
|
|
90b3105d99 | ||
|
|
0fdcc3778d | ||
|
|
78343ef61a | ||
|
|
d83df5a928 | ||
|
|
fc42a0696e | ||
|
|
0cd0ef2d26 | ||
|
|
c4514e7eb4 | ||
|
|
8d24711567 | ||
|
|
f4538839d4 | ||
|
|
8ca1e0ddc3 | ||
|
|
4135276252 | ||
|
|
8bd44cb3eb | ||
|
|
6c636642df | ||
|
|
13506e36aa |
132
.gitlab-ci.yml
132
.gitlab-ci.yml
@@ -17,7 +17,12 @@ stages:
|
|||||||
# Common variables
|
# Common variables
|
||||||
variables:
|
variables:
|
||||||
COMMON_MESON_FLAGS: "--fatal-meson-warnings --werror"
|
COMMON_MESON_FLAGS: "--fatal-meson-warnings --werror"
|
||||||
|
BACKEND_FLAGS: "-Dx11-backend=true -Dwayland-backend=true -Dbroadway-backend=true -Dvulkan=yes"
|
||||||
|
FEATURE_FLAGS: "-Dcloudproviders=true"
|
||||||
MESON_TEST_TIMEOUT_MULTIPLIER: 2
|
MESON_TEST_TIMEOUT_MULTIPLIER: 2
|
||||||
|
FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v17"
|
||||||
|
FLATPAK_IMAGE: "registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:master"
|
||||||
|
DOCS_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora-docs:v19"
|
||||||
|
|
||||||
.only-default:
|
.only-default:
|
||||||
only:
|
only:
|
||||||
@@ -27,76 +32,65 @@ variables:
|
|||||||
|
|
||||||
style-check-diff:
|
style-check-diff:
|
||||||
extends: .only-default
|
extends: .only-default
|
||||||
image: registry.gitlab.gnome.org/gnome/gtk/fedora:v16
|
image: $FEDORA_IMAGE
|
||||||
stage: .pre
|
stage: .pre
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
script:
|
script:
|
||||||
- .gitlab-ci/run-style-check-diff.sh
|
- .gitlab-ci/run-style-check-diff.sh
|
||||||
|
|
||||||
|
.build-fedora-default:
|
||||||
|
image: $FEDORA_IMAGE
|
||||||
|
artifacts:
|
||||||
|
when: always
|
||||||
|
reports:
|
||||||
|
junit:
|
||||||
|
- "${CI_PROJECT_DIR}/_build/report-x11.xml"
|
||||||
|
- "${CI_PROJECT_DIR}/_build/report-wayland.xml"
|
||||||
|
- "${CI_PROJECT_DIR}/_build/report-broadway.xml"
|
||||||
|
name: "gtk-${CI_COMMIT_REF_NAME}"
|
||||||
|
paths:
|
||||||
|
- "${CI_PROJECT_DIR}/_build/meson-logs"
|
||||||
|
- "${CI_PROJECT_DIR}/_build/report*.xml"
|
||||||
|
- "${CI_PROJECT_DIR}/_build/report*.html"
|
||||||
|
- "${CI_PROJECT_DIR}/_build/testsuite/reftests/output/*/*.png"
|
||||||
|
- "${CI_PROJECT_DIR}/_build/testsuite/gsk/compare/*/*/*.png"
|
||||||
|
- "${CI_PROJECT_DIR}/_build/testsuite/css/output/*/*.syscap"
|
||||||
|
cache:
|
||||||
|
key: "$CI_JOB_NAME"
|
||||||
|
paths:
|
||||||
|
- _ccache/
|
||||||
|
- subprojects/gdk-pixbuf/
|
||||||
|
- subprojects/glib/
|
||||||
|
- subprojects/graphene/
|
||||||
|
- subprojects/libepoxy/
|
||||||
|
- subprojects/pango/
|
||||||
|
|
||||||
fedora-x86_64:
|
fedora-x86_64:
|
||||||
image: registry.gitlab.gnome.org/gnome/gtk/fedora:v16
|
extends: .build-fedora-default
|
||||||
stage: build
|
stage: build
|
||||||
variables:
|
variables:
|
||||||
EXTRA_MESON_FLAGS: "--buildtype=debug --default-library=both"
|
EXTRA_MESON_FLAGS: "--buildtype=debug --default-library=both"
|
||||||
script:
|
script:
|
||||||
- meson ${COMMON_MESON_FLAGS} ${EXTRA_MESON_FLAGS}
|
- meson ${COMMON_MESON_FLAGS} ${EXTRA_MESON_FLAGS} ${BACKEND_FLAGS} ${FEATURE_FLAGS}
|
||||||
-Dx11-backend=true
|
|
||||||
-Dwayland-backend=true
|
|
||||||
-Dbroadway-backend=true
|
|
||||||
-Dvulkan=yes
|
|
||||||
-Dprofiler=true
|
-Dprofiler=true
|
||||||
_build
|
_build
|
||||||
- ninja -C _build
|
- ninja -C _build
|
||||||
- .gitlab-ci/run-tests.sh _build
|
- .gitlab-ci/run-tests.sh _build x11
|
||||||
artifacts:
|
- .gitlab-ci/run-tests.sh _build wayland
|
||||||
when: always
|
- .gitlab-ci/run-tests.sh _build broadway
|
||||||
reports:
|
|
||||||
junit:
|
|
||||||
- "${CI_PROJECT_DIR}/_build/report.xml"
|
|
||||||
name: "gtk-${CI_COMMIT_REF_NAME}"
|
|
||||||
paths:
|
|
||||||
- "${CI_PROJECT_DIR}/_build/meson-logs"
|
|
||||||
- "${CI_PROJECT_DIR}/_build/report.xml"
|
|
||||||
- "${CI_PROJECT_DIR}/_build/report.html"
|
|
||||||
- "${CI_PROJECT_DIR}/_build/testsuite/reftests/output/*.png"
|
|
||||||
- "${CI_PROJECT_DIR}/_build/testsuite/gsk/compare/*/*.png"
|
|
||||||
- "${CI_PROJECT_DIR}/_build/testsuite/css/output/*.syscap"
|
|
||||||
cache:
|
|
||||||
key: "$CI_JOB_NAME"
|
|
||||||
<<: *cache-paths
|
|
||||||
|
|
||||||
release-build:
|
release-build:
|
||||||
image: registry.gitlab.gnome.org/gnome/gtk/fedora:v16
|
extends: .build-fedora-default
|
||||||
stage: build
|
stage: build
|
||||||
variables:
|
variables:
|
||||||
EXTRA_MESON_FLAGS: "--buildtype=release"
|
EXTRA_MESON_FLAGS: "--buildtype=release"
|
||||||
script:
|
script:
|
||||||
- meson ${COMMON_MESON_FLAGS} ${EXTRA_MESON_FLAGS}
|
- meson ${COMMON_MESON_FLAGS} ${EXTRA_MESON_FLAGS} ${BACKEND_FLAGS} ${FEATURE_FLAGS}
|
||||||
-Dx11-backend=true
|
|
||||||
-Dwayland-backend=true
|
|
||||||
-Dbroadway-backend=true
|
|
||||||
-Dvulkan=yes
|
|
||||||
_build
|
_build
|
||||||
- ninja -C _build
|
- ninja -C _build
|
||||||
- .gitlab-ci/run-tests.sh _build
|
- .gitlab-ci/run-tests.sh _build x11
|
||||||
artifacts:
|
|
||||||
when: always
|
|
||||||
reports:
|
|
||||||
junit:
|
|
||||||
- "${CI_PROJECT_DIR}/_build/report.xml"
|
|
||||||
name: "gtk-${CI_COMMIT_REF_NAME}"
|
|
||||||
paths:
|
|
||||||
- "${CI_PROJECT_DIR}/_build/meson-logs"
|
|
||||||
- "${CI_PROJECT_DIR}/_build/report.xml"
|
|
||||||
- "${CI_PROJECT_DIR}/_build/report.html"
|
|
||||||
- "${CI_PROJECT_DIR}/_build/testsuite/reftests/output/*.png"
|
|
||||||
- "${CI_PROJECT_DIR}/_build/testsuite/gsk/compare/*/*.png"
|
|
||||||
- "${CI_PROJECT_DIR}/_build/testsuite/css/output/*.syscap"
|
|
||||||
cache:
|
|
||||||
key: "$CI_JOB_NAME"
|
|
||||||
<<: *cache-paths
|
|
||||||
|
|
||||||
.mingw-defaults: &mingw-defaults
|
.mingw-defaults:
|
||||||
stage: build
|
stage: build
|
||||||
tags:
|
tags:
|
||||||
- win32-ps
|
- win32-ps
|
||||||
@@ -105,16 +99,22 @@ release-build:
|
|||||||
- C:\msys64\usr\bin\bash -lc "bash -x ./.gitlab-ci/test-msys2.sh"
|
- C:\msys64\usr\bin\bash -lc "bash -x ./.gitlab-ci/test-msys2.sh"
|
||||||
cache:
|
cache:
|
||||||
key: "$CI_JOB_NAME"
|
key: "$CI_JOB_NAME"
|
||||||
<<: *cache-paths
|
paths:
|
||||||
|
- _ccache/
|
||||||
|
- subprojects/gdk-pixbuf/
|
||||||
|
- subprojects/glib/
|
||||||
|
- subprojects/graphene/
|
||||||
|
- subprojects/libepoxy/
|
||||||
|
- subprojects/pango/
|
||||||
|
|
||||||
msys2-mingw32:
|
msys2-mingw64:
|
||||||
|
extends: .mingw-defaults
|
||||||
variables:
|
variables:
|
||||||
MSYSTEM: "MINGW32"
|
MSYSTEM: "MINGW64"
|
||||||
CHERE_INVOKING: "yes"
|
CHERE_INVOKING: "yes"
|
||||||
<<: *mingw-defaults
|
|
||||||
|
|
||||||
.flatpak-defaults: &flatpak-defaults
|
.flatpak-defaults:
|
||||||
image: registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:master
|
image: $FLATPAK_IMAGE
|
||||||
stage: flatpak
|
stage: flatpak
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
tags:
|
tags:
|
||||||
@@ -127,48 +127,48 @@ msys2-mingw32:
|
|||||||
- bash -x ./.gitlab-ci/flatpak-build.sh "${APPID}"
|
- bash -x ./.gitlab-ci/flatpak-build.sh "${APPID}"
|
||||||
|
|
||||||
# Manual jobs, for branches and MRs
|
# Manual jobs, for branches and MRs
|
||||||
.flatpak-manual: &flatpak-manual
|
.flatpak-manual:
|
||||||
<<: *flatpak-defaults
|
extends: .flatpak-defaults
|
||||||
when: manual
|
when: manual
|
||||||
|
|
||||||
# Only build Flatpak bundles automatically on master
|
# Only build Flatpak bundles automatically on master
|
||||||
.flatpak-master: &flatpak-master
|
.flatpak-master:
|
||||||
<<: *flatpak-defaults
|
extends: .flatpak-defaults
|
||||||
only:
|
only:
|
||||||
- master
|
- master
|
||||||
|
|
||||||
flatpak-manual:demo:
|
flatpak-manual:demo:
|
||||||
|
extends: .flatpak-manual
|
||||||
variables:
|
variables:
|
||||||
APPID: org.gtk.Demo4
|
APPID: org.gtk.Demo4
|
||||||
<<: *flatpak-manual
|
|
||||||
|
|
||||||
flatpak-master:demo:
|
flatpak-master:demo:
|
||||||
|
extends: .flatpak-master
|
||||||
variables:
|
variables:
|
||||||
APPID: org.gtk.Demo4
|
APPID: org.gtk.Demo4
|
||||||
<<: *flatpak-master
|
|
||||||
|
|
||||||
flatpak-manual:widget-factory:
|
flatpak-manual:widget-factory:
|
||||||
|
extends: .flatpak-manual
|
||||||
variables:
|
variables:
|
||||||
APPID: org.gtk.WidgetFactory4
|
APPID: org.gtk.WidgetFactory4
|
||||||
<<: *flatpak-manual
|
|
||||||
|
|
||||||
flatpak-master:widget-factory:
|
flatpak-master:widget-factory:
|
||||||
|
extends: .flatpak-master
|
||||||
variables:
|
variables:
|
||||||
APPID: org.gtk.WidgetFactory4
|
APPID: org.gtk.WidgetFactory4
|
||||||
<<: *flatpak-master
|
|
||||||
|
|
||||||
flatpak-manual:icon-browser:
|
flatpak-manual:icon-browser:
|
||||||
|
extends: .flatpak-manual
|
||||||
variables:
|
variables:
|
||||||
APPID: org.gtk.IconBrowser4
|
APPID: org.gtk.IconBrowser4
|
||||||
<<: *flatpak-manual
|
|
||||||
|
|
||||||
flatpak-master:icon-browser:
|
flatpak-master:icon-browser:
|
||||||
|
extends: .flatpak-master
|
||||||
variables:
|
variables:
|
||||||
APPID: org.gtk.IconBrowser4
|
APPID: org.gtk.IconBrowser4
|
||||||
<<: *flatpak-master
|
|
||||||
|
|
||||||
static-scan:
|
static-scan:
|
||||||
image: registry.gitlab.gnome.org/gnome/gtk/fedora:v16
|
image: $FEDORA_IMAGE
|
||||||
stage: analysis
|
stage: analysis
|
||||||
variables:
|
variables:
|
||||||
EXTRA_MESON_FLAGS: "--buildtype=debug"
|
EXTRA_MESON_FLAGS: "--buildtype=debug"
|
||||||
@@ -181,7 +181,7 @@ static-scan:
|
|||||||
allow_failure: true
|
allow_failure: true
|
||||||
|
|
||||||
reference:
|
reference:
|
||||||
image: registry.gitlab.gnome.org/gnome/gtk/fedora:v16
|
image: $DOCS_IMAGE
|
||||||
stage: docs
|
stage: docs
|
||||||
variables:
|
variables:
|
||||||
EXTRA_MESON_FLAGS: "--buildtype=release"
|
EXTRA_MESON_FLAGS: "--buildtype=release"
|
||||||
|
|||||||
88
.gitlab-ci/fedora-base.Dockerfile
Normal file
88
.gitlab-ci/fedora-base.Dockerfile
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
FROM fedora:31
|
||||||
|
|
||||||
|
RUN dnf -y install \
|
||||||
|
adwaita-icon-theme \
|
||||||
|
atk-devel \
|
||||||
|
at-spi2-atk-devel \
|
||||||
|
avahi-gobject-devel \
|
||||||
|
cairo-devel \
|
||||||
|
cairo-gobject-devel \
|
||||||
|
ccache \
|
||||||
|
clang \
|
||||||
|
clang-analyzer \
|
||||||
|
colord-devel \
|
||||||
|
cups-devel \
|
||||||
|
dbus-daemon \
|
||||||
|
dbus-x11 \
|
||||||
|
dejavu-sans-mono-fonts \
|
||||||
|
desktop-file-utils \
|
||||||
|
diffutils \
|
||||||
|
elfutils-libelf-devel \
|
||||||
|
fribidi-devel \
|
||||||
|
gcc \
|
||||||
|
gcc-c++ \
|
||||||
|
gdk-pixbuf2-devel \
|
||||||
|
gdk-pixbuf2-modules \
|
||||||
|
gettext \
|
||||||
|
git \
|
||||||
|
glib2-devel \
|
||||||
|
glib2-static \
|
||||||
|
glibc-devel \
|
||||||
|
glibc-headers \
|
||||||
|
gobject-introspection-devel \
|
||||||
|
graphene-devel \
|
||||||
|
gstreamer1-devel \
|
||||||
|
gstreamer1-plugins-good \
|
||||||
|
gstreamer1-plugins-bad-free-devel \
|
||||||
|
gstreamer1-plugins-base-devel \
|
||||||
|
gtk-doc \
|
||||||
|
hicolor-icon-theme \
|
||||||
|
iso-codes \
|
||||||
|
itstool \
|
||||||
|
json-glib-devel \
|
||||||
|
lcov \
|
||||||
|
libattr-devel \
|
||||||
|
libepoxy-devel \
|
||||||
|
libffi-devel \
|
||||||
|
libmount-devel \
|
||||||
|
librsvg2 \
|
||||||
|
libselinux-devel \
|
||||||
|
libXcomposite-devel \
|
||||||
|
libXcursor-devel \
|
||||||
|
libXcursor-devel \
|
||||||
|
libXdamage-devel \
|
||||||
|
libXfixes-devel \
|
||||||
|
libXi-devel \
|
||||||
|
libXinerama-devel \
|
||||||
|
libxkbcommon-devel \
|
||||||
|
libXrandr-devel \
|
||||||
|
libXrender-devel \
|
||||||
|
libXtst-devel \
|
||||||
|
libxslt \
|
||||||
|
mesa-dri-drivers \
|
||||||
|
mesa-libEGL-devel \
|
||||||
|
mesa-libwayland-egl-devel \
|
||||||
|
ninja-build \
|
||||||
|
pango-devel \
|
||||||
|
pcre-devel \
|
||||||
|
pcre-static \
|
||||||
|
python3 \
|
||||||
|
python3-jinja2 \
|
||||||
|
python3-pip \
|
||||||
|
python3-pygments \
|
||||||
|
python3-wheel \
|
||||||
|
redhat-rpm-config \
|
||||||
|
sassc \
|
||||||
|
sysprof-devel \
|
||||||
|
systemtap-sdt-devel \
|
||||||
|
vulkan-devel \
|
||||||
|
wayland-devel \
|
||||||
|
wayland-protocols-devel \
|
||||||
|
weston \
|
||||||
|
weston-libs \
|
||||||
|
which \
|
||||||
|
xorg-x11-server-Xvfb \
|
||||||
|
&& dnf clean all
|
||||||
|
|
||||||
|
RUN pip3 install meson==0.53.1
|
||||||
|
|
||||||
12
.gitlab-ci/fedora-docs.Dockerfile
Normal file
12
.gitlab-ci/fedora-docs.Dockerfile
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
FROM registry.gitlab.gnome.org/gnome/gtk/fedora-base:v19
|
||||||
|
|
||||||
|
RUN dnf -y install pandoc
|
||||||
|
|
||||||
|
ARG HOST_USER_ID=5555
|
||||||
|
ENV HOST_USER_ID ${HOST_USER_ID}
|
||||||
|
RUN useradd -u $HOST_USER_ID -ms /bin/bash user
|
||||||
|
|
||||||
|
USER user
|
||||||
|
WORKDIR /home/user
|
||||||
|
|
||||||
|
ENV LANG C.UTF-8
|
||||||
@@ -1,88 +1,4 @@
|
|||||||
FROM fedora:31
|
FROM registry.gitlab.gnome.org/gnome/gtk/fedora-base:v19
|
||||||
|
|
||||||
RUN dnf -y install \
|
|
||||||
adwaita-icon-theme \
|
|
||||||
atk-devel \
|
|
||||||
at-spi2-atk-devel \
|
|
||||||
avahi-gobject-devel \
|
|
||||||
cairo-devel \
|
|
||||||
cairo-gobject-devel \
|
|
||||||
ccache \
|
|
||||||
clang \
|
|
||||||
clang-analyzer \
|
|
||||||
colord-devel \
|
|
||||||
cups-devel \
|
|
||||||
dbus-daemon \
|
|
||||||
dbus-x11 \
|
|
||||||
dejavu-sans-mono-fonts \
|
|
||||||
desktop-file-utils \
|
|
||||||
diffutils \
|
|
||||||
elfutils-libelf-devel \
|
|
||||||
fribidi-devel \
|
|
||||||
gcc \
|
|
||||||
gcc-c++ \
|
|
||||||
gdk-pixbuf2-devel \
|
|
||||||
gdk-pixbuf2-modules \
|
|
||||||
gettext \
|
|
||||||
git \
|
|
||||||
glib2-devel \
|
|
||||||
glib2-static \
|
|
||||||
glibc-devel \
|
|
||||||
glibc-headers \
|
|
||||||
gobject-introspection-devel \
|
|
||||||
graphene-devel \
|
|
||||||
gstreamer1-devel \
|
|
||||||
gstreamer1-plugins-good \
|
|
||||||
gstreamer1-plugins-bad-free-devel \
|
|
||||||
gstreamer1-plugins-base-devel \
|
|
||||||
gtk-doc \
|
|
||||||
hicolor-icon-theme \
|
|
||||||
iso-codes \
|
|
||||||
itstool \
|
|
||||||
json-glib-devel \
|
|
||||||
lcov \
|
|
||||||
libattr-devel \
|
|
||||||
libepoxy-devel \
|
|
||||||
libffi-devel \
|
|
||||||
libmount-devel \
|
|
||||||
librsvg2 \
|
|
||||||
libselinux-devel \
|
|
||||||
libXcomposite-devel \
|
|
||||||
libXcursor-devel \
|
|
||||||
libXcursor-devel \
|
|
||||||
libXdamage-devel \
|
|
||||||
libXfixes-devel \
|
|
||||||
libXi-devel \
|
|
||||||
libXinerama-devel \
|
|
||||||
libxkbcommon-devel \
|
|
||||||
libXrandr-devel \
|
|
||||||
libXrender-devel \
|
|
||||||
libXtst-devel \
|
|
||||||
libxslt \
|
|
||||||
mesa-dri-drivers \
|
|
||||||
mesa-libEGL-devel \
|
|
||||||
mesa-libwayland-egl-devel \
|
|
||||||
ninja-build \
|
|
||||||
pango-devel \
|
|
||||||
pcre-devel \
|
|
||||||
pcre-static \
|
|
||||||
python3 \
|
|
||||||
python3-jinja2 \
|
|
||||||
python3-pip \
|
|
||||||
python3-pygments \
|
|
||||||
python3-wheel \
|
|
||||||
redhat-rpm-config \
|
|
||||||
sassc \
|
|
||||||
sysprof-devel \
|
|
||||||
systemtap-sdt-devel \
|
|
||||||
vulkan-devel \
|
|
||||||
wayland-devel \
|
|
||||||
wayland-protocols-devel \
|
|
||||||
which \
|
|
||||||
xorg-x11-server-Xvfb \
|
|
||||||
&& dnf clean all
|
|
||||||
|
|
||||||
RUN pip3 install meson==0.53.1
|
|
||||||
|
|
||||||
ARG HOST_USER_ID=5555
|
ARG HOST_USER_ID=5555
|
||||||
ENV HOST_USER_ID ${HOST_USER_ID}
|
ENV HOST_USER_ID ${HOST_USER_ID}
|
||||||
|
|||||||
@@ -138,12 +138,13 @@ ul.images li {
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
<h1>{{ report.project_name }}/{{ report.branch_name }} :: Test Reports</h1>
|
<h1>{{ report.project_name }}/{{ report.backend }}/{{ report.branch_name }} :: Test Reports</h1>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<article>
|
<article>
|
||||||
<section>
|
<section>
|
||||||
<div class="report-meta">
|
<div class="report-meta">
|
||||||
|
<p><strong>Backend:</strong> {{ report.backend }}</p>
|
||||||
<p><strong>Branch:</strong> {{ report.branch_name }}</p>
|
<p><strong>Branch:</strong> {{ report.branch_name }}</p>
|
||||||
<p><strong>Date:</strong> <time datetime="{{ report.date.isoformat() }}">{{ report.locale_date }}</time></p>
|
<p><strong>Date:</strong> <time datetime="{{ report.date.isoformat() }}">{{ report.locale_date }}</time></p>
|
||||||
{% if report.job_id %}<p><strong>Job ID:</strong> {{ report.job_id }}</p>{% endif %}
|
{% if report.job_id %}<p><strong>Job ID:</strong> {{ report.job_id }}</p>{% endif %}
|
||||||
@@ -259,6 +260,9 @@ aparser = argparse.ArgumentParser(description='Turns a Meson test log into an HT
|
|||||||
aparser.add_argument('--project-name', metavar='NAME',
|
aparser.add_argument('--project-name', metavar='NAME',
|
||||||
help='The project name',
|
help='The project name',
|
||||||
default='Unknown')
|
default='Unknown')
|
||||||
|
aparser.add_argument('--backend', metavar='NAME',
|
||||||
|
help='The used backend',
|
||||||
|
default='unknown')
|
||||||
aparser.add_argument('--job-id', metavar='ID',
|
aparser.add_argument('--job-id', metavar='ID',
|
||||||
help='The job ID for the report',
|
help='The job ID for the report',
|
||||||
default=None)
|
default=None)
|
||||||
@@ -319,6 +323,7 @@ report = {}
|
|||||||
report['date'] = datetime.datetime.utcnow()
|
report['date'] = datetime.datetime.utcnow()
|
||||||
report['locale_date'] = report['date'].strftime("%c")
|
report['locale_date'] = report['date'].strftime("%c")
|
||||||
report['project_name'] = args.project_name
|
report['project_name'] = args.project_name
|
||||||
|
report['backend'] = args.backend
|
||||||
report['job_id'] = args.job_id
|
report['job_id'] = args.job_id
|
||||||
report['branch_name'] = args.branch
|
report['branch_name'] = args.branch
|
||||||
report['total_successes'] = 0
|
report['total_successes'] = 0
|
||||||
|
|||||||
@@ -19,6 +19,9 @@ aparser = argparse.ArgumentParser(description='Turns a Meson test log into a JUn
|
|||||||
aparser.add_argument('--project-name', metavar='NAME',
|
aparser.add_argument('--project-name', metavar='NAME',
|
||||||
help='The project name',
|
help='The project name',
|
||||||
default='unknown')
|
default='unknown')
|
||||||
|
aparser.add_argument('--backend', metavar='NAME',
|
||||||
|
help='The used backend',
|
||||||
|
default='unknown')
|
||||||
aparser.add_argument('--job-id', metavar='ID',
|
aparser.add_argument('--job-id', metavar='ID',
|
||||||
help='The job ID for the report',
|
help='The job ID for the report',
|
||||||
default='Unknown')
|
default='Unknown')
|
||||||
@@ -92,18 +95,18 @@ for name, units in suites.items():
|
|||||||
for unit in successes:
|
for unit in successes:
|
||||||
testcase = ET.SubElement(testsuite, 'testcase')
|
testcase = ET.SubElement(testsuite, 'testcase')
|
||||||
testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
|
testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
|
||||||
testcase.set('name', unit['name'])
|
testcase.set('name', '{}/{}'.format(args.backend, unit['name']))
|
||||||
testcase.set('time', str(unit['duration']))
|
testcase.set('time', str(unit['duration']))
|
||||||
|
|
||||||
for unit in failures:
|
for unit in failures:
|
||||||
testcase = ET.SubElement(testsuite, 'testcase')
|
testcase = ET.SubElement(testsuite, 'testcase')
|
||||||
testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
|
testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
|
||||||
testcase.set('name', unit['name'])
|
testcase.set('name', '{}/{}'.format(args.backend, unit['name']))
|
||||||
testcase.set('time', str(unit['duration']))
|
testcase.set('time', str(unit['duration']))
|
||||||
|
|
||||||
failure = ET.SubElement(testcase, 'failure')
|
failure = ET.SubElement(testcase, 'failure')
|
||||||
failure.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
|
failure.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
|
||||||
failure.set('name', unit['name'])
|
testcase.set('name', '{}/{}'.format(args.backend, unit['name']))
|
||||||
failure.set('type', 'error')
|
failure.set('type', 'error')
|
||||||
failure.text = unit['stdout']
|
failure.text = unit['stdout']
|
||||||
|
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ fi
|
|||||||
|
|
||||||
if [ -z $base_version ]; then
|
if [ -z $base_version ]; then
|
||||||
base_version="latest"
|
base_version="latest"
|
||||||
else
|
elif [ $base_version != "latest" ]; then
|
||||||
base_version="v$base_version"
|
base_version="v$base_version"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@ if [ ! -x "$(command -v docker)" ] || [ docker --help |& grep -q podman ]; then
|
|||||||
else
|
else
|
||||||
echo "Using: Docker"
|
echo "Using: Docker"
|
||||||
format=""
|
format=""
|
||||||
CMD="sudo socker"
|
CMD="sudo docker"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
REGISTRY="registry.gitlab.gnome.org"
|
REGISTRY="registry.gitlab.gnome.org"
|
||||||
|
|||||||
@@ -4,8 +4,15 @@ set -e
|
|||||||
|
|
||||||
# We need to add a new remote for the upstream master, since this script could
|
# We need to add a new remote for the upstream master, since this script could
|
||||||
# be running in a personal fork of the repository which has out of date branches.
|
# be running in a personal fork of the repository which has out of date branches.
|
||||||
git remote add upstream https://gitlab.gnome.org/GNOME/gtk.git
|
if [ "${CI_PROJECT_NAMESPACE}" != "GNOME" ]; then
|
||||||
git fetch upstream
|
echo "Retrieving the current upstream repository from ${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}..."
|
||||||
|
git remote add upstream https://gitlab.gnome.org/GNOME/gtk.git
|
||||||
|
git fetch upstream
|
||||||
|
ORIGIN="upstream"
|
||||||
|
else
|
||||||
|
echo "Reusing the existing repository on ${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}"
|
||||||
|
ORIGIN="origin"
|
||||||
|
fi
|
||||||
|
|
||||||
# Work out the newest common ancestor between the detached HEAD that this CI job
|
# Work out the newest common ancestor between the detached HEAD that this CI job
|
||||||
# has checked out, and the upstream target branch (which will typically be
|
# has checked out, and the upstream target branch (which will typically be
|
||||||
@@ -13,7 +20,7 @@ git fetch upstream
|
|||||||
#
|
#
|
||||||
# `${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}` is only defined if we’re running in
|
# `${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}` is only defined if we’re running in
|
||||||
# a merge request pipeline; fall back to `${CI_DEFAULT_BRANCH}` otherwise.
|
# a merge request pipeline; fall back to `${CI_DEFAULT_BRANCH}` otherwise.
|
||||||
newest_common_ancestor_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "upstream/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH}}") <(git rev-list --first-parent HEAD) | head -1)
|
newest_common_ancestor_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "${ORIGIN}/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH}}") <(git rev-list --first-parent HEAD) | head -1)
|
||||||
git diff -U0 --no-color "${newest_common_ancestor_sha}" | .gitlab-ci/clang-format-diff.py -binary "clang-format" -p1
|
git diff -U0 --no-color "${newest_common_ancestor_sha}" | .gitlab-ci/clang-format-diff.py -binary "clang-format" -p1
|
||||||
exit_status=$?
|
exit_status=$?
|
||||||
|
|
||||||
|
|||||||
@@ -5,30 +5,75 @@ set +e
|
|||||||
|
|
||||||
srcdir=$( pwd )
|
srcdir=$( pwd )
|
||||||
builddir=$1
|
builddir=$1
|
||||||
|
backend=$2
|
||||||
|
|
||||||
export GDK_BACKEND=x11
|
case "${backend}" in
|
||||||
xvfb-run -a -s "-screen 0 1024x768x24" \
|
x11)
|
||||||
|
xvfb-run -a -s "-screen 0 1024x768x24" \
|
||||||
meson test -C ${builddir} \
|
meson test -C ${builddir} \
|
||||||
--print-errorlogs \
|
--print-errorlogs \
|
||||||
|
--setup=${backend} \
|
||||||
--suite=gtk \
|
--suite=gtk \
|
||||||
--no-suite=gtk:a11y
|
--no-suite=gtk:a11y \
|
||||||
|
--no-suite=gsk-compare-broadway
|
||||||
|
|
||||||
# Store the exit code for the CI run, but always
|
# Store the exit code for the CI run, but always
|
||||||
# generate the reports
|
# generate the reports
|
||||||
exit_code=$?
|
exit_code=$?
|
||||||
|
;;
|
||||||
|
|
||||||
|
wayland)
|
||||||
|
export XDG_RUNTIME_DIR="$(mktemp -p $(pwd) -d xdg-runtime-XXXXXX)"
|
||||||
|
|
||||||
|
weston --backend=headless-backend.so --socket=wayland-5 --idle-time=0 &
|
||||||
|
compositor=$!
|
||||||
|
export WAYLAND_DISPLAY=wayland-5
|
||||||
|
|
||||||
|
meson test -C ${builddir} \
|
||||||
|
--print-errorlogs \
|
||||||
|
--setup=${backend} \
|
||||||
|
--suite=gtk \
|
||||||
|
--no-suite=gtk:a11y \
|
||||||
|
--no-suite=gsk-compare-broadway
|
||||||
|
|
||||||
|
exit_code=$?
|
||||||
|
kill ${compositor}
|
||||||
|
;;
|
||||||
|
|
||||||
|
broadway)
|
||||||
|
export XDG_RUNTIME_DIR="$(mktemp -p $(pwd) -d xdg-runtime-XXXXXX)"
|
||||||
|
|
||||||
|
${builddir}/gdk/broadway/gtk4-broadwayd :5 &
|
||||||
|
server=$!
|
||||||
|
export BROADWAY_DISPLAY=:5
|
||||||
|
|
||||||
|
meson test -C ${builddir} \
|
||||||
|
--print-errorlogs \
|
||||||
|
--setup=${backend} \
|
||||||
|
--suite=gtk \
|
||||||
|
--no-suite=gtk:a11y \
|
||||||
|
--no-suite=gsk-compare-opengl
|
||||||
|
|
||||||
|
# don't let Broadway failures fail the run, for now
|
||||||
|
exit_code=0
|
||||||
|
kill ${server}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
cd ${builddir}
|
cd ${builddir}
|
||||||
|
|
||||||
$srcdir/.gitlab-ci/meson-junit-report.py \
|
$srcdir/.gitlab-ci/meson-junit-report.py \
|
||||||
--project-name=gtk \
|
--project-name=gtk \
|
||||||
|
--backend=${backend} \
|
||||||
--job-id="${CI_JOB_NAME}" \
|
--job-id="${CI_JOB_NAME}" \
|
||||||
--output=report.xml \
|
--output=report-${backend}.xml \
|
||||||
meson-logs/testlog.json
|
meson-logs/testlog-${backend}.json
|
||||||
$srcdir/.gitlab-ci/meson-html-report.py \
|
$srcdir/.gitlab-ci/meson-html-report.py \
|
||||||
--project-name=gtk \
|
--project-name=gtk \
|
||||||
|
--backend=${backend} \
|
||||||
--job-id="${CI_JOB_NAME}" \
|
--job-id="${CI_JOB_NAME}" \
|
||||||
--reftest-output-dir="testsuite/reftests/output" \
|
--reftest-output-dir="testsuite/reftests/output/${backend}" \
|
||||||
--output=report.html \
|
--output=report-${backend}.html \
|
||||||
meson-logs/testlog.json
|
meson-logs/testlog-${backend}.json
|
||||||
|
|
||||||
exit $exit_code
|
exit $exit_code
|
||||||
|
|||||||
@@ -34,8 +34,11 @@ pacman --noconfirm -S --needed \
|
|||||||
mingw-w64-$MSYS2_ARCH-shared-mime-info
|
mingw-w64-$MSYS2_ARCH-shared-mime-info
|
||||||
|
|
||||||
# https://gitlab.gnome.org/GNOME/gtk/issues/2243
|
# https://gitlab.gnome.org/GNOME/gtk/issues/2243
|
||||||
wget "https://gitlab.gnome.org/creiter/gitlab-ci-win32-runner-v2/raw/master/pango/mingw-w64-$MSYS2_ARCH-pango-1.44.7-1-any.pkg.tar.xz"
|
wget "https://gitlab.gnome.org/creiter/gitlab-ci-win32-runner-v2/raw/master/pango/mingw-w64-$MSYS2_ARCH-pango-git-1.44.7.90.ge48ae523-1-any.pkg.tar.zst"
|
||||||
pacman --noconfirm -U "mingw-w64-$MSYS2_ARCH-pango-1.44.7-1-any.pkg.tar.xz"
|
pacman --noconfirm -U "mingw-w64-$MSYS2_ARCH-pango-git-1.44.7.90.ge48ae523-1-any.pkg.tar.zst"
|
||||||
|
|
||||||
|
# https://github.com/msys2/MINGW-packages/pull/6465
|
||||||
|
pacman --noconfirm -S --needed mingw-w64-$MSYS2_ARCH-brotli
|
||||||
|
|
||||||
mkdir -p _ccache
|
mkdir -p _ccache
|
||||||
export CCACHE_BASEDIR="$(pwd)"
|
export CCACHE_BASEDIR="$(pwd)"
|
||||||
|
|||||||
178
NEWS
178
NEWS
@@ -1,3 +1,181 @@
|
|||||||
|
Overview of Changes in GTK 3.98.5
|
||||||
|
=================================
|
||||||
|
|
||||||
|
* Introduce new list widgets and supporting infrastructure.
|
||||||
|
The main APIs are:
|
||||||
|
- GtkListView
|
||||||
|
- GtkGridView
|
||||||
|
- GtkColumnView and GtkColumnViewColumn
|
||||||
|
- GtkDropDown
|
||||||
|
- GtkListItemFactory and implementations
|
||||||
|
- GtkExpression
|
||||||
|
- GtkFilter and subclasses, and GtkFilterListModel
|
||||||
|
- GtkSorter and subclasses, and GtkSortListModel
|
||||||
|
- GtkSelectionModel and subclasses
|
||||||
|
- GtkTreeListModel, GtkTreeExpander and GtkTreeListRowSorter
|
||||||
|
|
||||||
|
* GtkFileChooser:
|
||||||
|
- Add a tracker3-based search engine implementation
|
||||||
|
- Rate-limit updates from the trash monitor
|
||||||
|
|
||||||
|
* GtkWindow:
|
||||||
|
- Redo the css node setup. There is now a single 'window' node
|
||||||
|
- Fix rounded corners on tiled windows
|
||||||
|
|
||||||
|
* GtkApplication:
|
||||||
|
- Drop app menu support. Menubar support is still there
|
||||||
|
|
||||||
|
* GtkFixed:
|
||||||
|
- Change coordinate APIs to take doubles
|
||||||
|
|
||||||
|
* GtkOverlay:
|
||||||
|
- Make GtkOverlayLayout public
|
||||||
|
|
||||||
|
* GtkTooltips:
|
||||||
|
- Fix line wrapping of tooltips
|
||||||
|
|
||||||
|
* Shortcuts:
|
||||||
|
- Fix mnemonic cycling
|
||||||
|
- Fix using '0' as a mnemonic
|
||||||
|
|
||||||
|
* Menus:
|
||||||
|
- Differentiate keypad keys in accelerators
|
||||||
|
|
||||||
|
* GtkIMContext:
|
||||||
|
- Add gtk_im_context_filter_key to allow event reinjection
|
||||||
|
|
||||||
|
* Themes:
|
||||||
|
- Adwaita: Limit the scope of backdrop
|
||||||
|
|
||||||
|
* Accessibility:
|
||||||
|
- Clean up and reorganize the code to prepare for the
|
||||||
|
dropping of ATK
|
||||||
|
|
||||||
|
* GDK:
|
||||||
|
- Drop unused enum and struct definitions from headers
|
||||||
|
- Make keymap translation API public again. Still needed
|
||||||
|
- Frameclock: Always use compositor refresh rate info
|
||||||
|
- Frameclock: Use quadratic correction for frame time jitter
|
||||||
|
- Frameclock: Ensure monotonicity
|
||||||
|
- Frameclock: Track resason for paint
|
||||||
|
- X11: Improve sync when the Nvidia driver is used
|
||||||
|
|
||||||
|
* GSK:
|
||||||
|
- GL renderer: Fix blurred outset shadows
|
||||||
|
- GL renderer: handle nested transform nodes properly
|
||||||
|
- GL renderer: Optimize clip handling
|
||||||
|
|
||||||
|
* gtk-demo:
|
||||||
|
- Improve the Drag-and-Drop demo with proper drag icons
|
||||||
|
- Don't show the main window if --run is given
|
||||||
|
- Add demos for list widgets and GtkDropDrown
|
||||||
|
|
||||||
|
* Documentation:
|
||||||
|
- Convert freestanding sections to markdown
|
||||||
|
- Drop the glossary
|
||||||
|
- Expand and improve the migration guide
|
||||||
|
|
||||||
|
* Build:
|
||||||
|
- We require pandoc now, for building the documentation
|
||||||
|
- Require Pango 1.45
|
||||||
|
|
||||||
|
* Translation updates:
|
||||||
|
Polish
|
||||||
|
Romanian
|
||||||
|
Slovenian
|
||||||
|
Turkish
|
||||||
|
Ukrainian
|
||||||
|
|
||||||
|
|
||||||
|
Overview of Changes in GTK 3.98.4
|
||||||
|
=================================
|
||||||
|
|
||||||
|
* Themes
|
||||||
|
- Refine menu styling
|
||||||
|
- Tweak visible focus behavior
|
||||||
|
- HighConstrast: Add public colors
|
||||||
|
- HighContrast: Fix scale borders
|
||||||
|
|
||||||
|
* CSS:
|
||||||
|
- Drop the nonstandard -gtk-icon-theme property
|
||||||
|
- Add a system_setting_changed vfunc to propagate global changes
|
||||||
|
|
||||||
|
* Untangle titlebars from windows:
|
||||||
|
- Add a GtkWindowControls widget
|
||||||
|
- Add a GtkWindowHandle widget
|
||||||
|
- Add actions for window menu items
|
||||||
|
- Remove app menu fallback from GtkHeaderBar
|
||||||
|
- Remove title and subtitle properties from GtkHeaderBar,
|
||||||
|
rename custom-title to title-widget
|
||||||
|
|
||||||
|
* GtkWidget
|
||||||
|
- Add a focusable property
|
||||||
|
|
||||||
|
* GtkPopover:
|
||||||
|
- Fix (re-)positioning issues
|
||||||
|
|
||||||
|
* GtkStack:
|
||||||
|
- Drop the homogeneous property
|
||||||
|
- Add a use-underline property to stack pages
|
||||||
|
|
||||||
|
* GtkScale:
|
||||||
|
- Make area around the trough clickable
|
||||||
|
|
||||||
|
* GtkScrolledWindow:
|
||||||
|
- Fix kinetic scrolling
|
||||||
|
|
||||||
|
* GtkTreeView:
|
||||||
|
- Break reference cycles in unroot
|
||||||
|
|
||||||
|
* Drop GtkBin and GtkContainer. All existing GtkBin subclasses
|
||||||
|
have grown a child property with setter and getter. All
|
||||||
|
existing GtkContainer subclasses have grown widget-specific
|
||||||
|
remove (and in some cases, add) functions. <child> in ui
|
||||||
|
files continues to work as before
|
||||||
|
|
||||||
|
* Replace gtk_widget_destroy by gtk_window_destroy
|
||||||
|
|
||||||
|
* Drop the ::size-allocate signal. Use a GtkWidgetPaintable
|
||||||
|
if you need to be informed about changes to a widgets
|
||||||
|
content or size
|
||||||
|
|
||||||
|
* Remove gtk_dialog_run
|
||||||
|
|
||||||
|
* GDK:
|
||||||
|
- Wayland: Provide a builtin cursor of last resort
|
||||||
|
- Change the monitor api to use a GListModel
|
||||||
|
|
||||||
|
* GSK:
|
||||||
|
- Don't include renderer-specific headers automatically
|
||||||
|
- GL: Fix nested rounded clips
|
||||||
|
|
||||||
|
* Introspection:
|
||||||
|
- Assorted annotation fixes
|
||||||
|
|
||||||
|
* Inspector:
|
||||||
|
- Preview media resources
|
||||||
|
- Show media backend information
|
||||||
|
|
||||||
|
* gtk4-widget-factory:
|
||||||
|
- Add GtkVideo
|
||||||
|
- Add text styles
|
||||||
|
- Add a print dialog
|
||||||
|
- Add a password entry
|
||||||
|
- Improve toolbar styling
|
||||||
|
- Revamp transition effects
|
||||||
|
|
||||||
|
* gtk4-demo:
|
||||||
|
- Replace some demos
|
||||||
|
|
||||||
|
* Translation updates:
|
||||||
|
Chinese (Taiwan)
|
||||||
|
Esperanto
|
||||||
|
Japanese
|
||||||
|
Romanian
|
||||||
|
Spanish
|
||||||
|
Ukrainian
|
||||||
|
|
||||||
|
|
||||||
Overview of Changes in GTK 3.98.3
|
Overview of Changes in GTK 3.98.3
|
||||||
=================================
|
=================================
|
||||||
|
|
||||||
|
|||||||
@@ -27,14 +27,6 @@
|
|||||||
/* Define to 1 if you have the `dcgettext' function. */
|
/* Define to 1 if you have the `dcgettext' function. */
|
||||||
#mesondefine HAVE_DCGETTEXT
|
#mesondefine HAVE_DCGETTEXT
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `isinf', and to 0 if you don't.
|
|
||||||
*/
|
|
||||||
#mesondefine HAVE_DECL_ISINF
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `isnan', and to 0 if you don't.
|
|
||||||
*/
|
|
||||||
#mesondefine HAVE_DECL_ISNAN
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||||
#mesondefine HAVE_DLFCN_H
|
#mesondefine HAVE_DLFCN_H
|
||||||
|
|
||||||
@@ -80,9 +72,6 @@
|
|||||||
/* Define to 1 if you have a working `mmap' system call. */
|
/* Define to 1 if you have a working `mmap' system call. */
|
||||||
#mesondefine HAVE_MMAP
|
#mesondefine HAVE_MMAP
|
||||||
|
|
||||||
/* Define to 1 if you have the `nearbyint' function. */
|
|
||||||
#mesondefine HAVE_NEARBYINT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `posix_fallocate' function. */
|
/* Define to 1 if you have the `posix_fallocate' function. */
|
||||||
#mesondefine HAVE_POSIX_FALLOCATE
|
#mesondefine HAVE_POSIX_FALLOCATE
|
||||||
|
|
||||||
@@ -92,21 +81,9 @@
|
|||||||
/* Have the Xrandr 1.5 extension library */
|
/* Have the Xrandr 1.5 extension library */
|
||||||
#mesondefine HAVE_RANDR15
|
#mesondefine HAVE_RANDR15
|
||||||
|
|
||||||
/* Define to 1 if you have the `rint' function. */
|
|
||||||
#mesondefine HAVE_RINT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `round' function. */
|
|
||||||
#mesondefine HAVE_ROUND
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `sincos' function. */
|
/* Define to 1 if you have the `sincos' function. */
|
||||||
#mesondefine HAVE_SINCOS
|
#mesondefine HAVE_SINCOS
|
||||||
|
|
||||||
/* Define to 1 if you have the `log2` function */
|
|
||||||
#mesondefine HAVE_LOG2
|
|
||||||
|
|
||||||
/* Define to 1 if you ahve the `exp2` function */
|
|
||||||
#mesondefine HAVE_EXP2
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
#mesondefine HAVE_STDINT_H
|
#mesondefine HAVE_STDINT_H
|
||||||
|
|
||||||
@@ -295,3 +272,6 @@
|
|||||||
#mesondefine HAVE_PANGOFT
|
#mesondefine HAVE_PANGOFT
|
||||||
|
|
||||||
#mesondefine ISO_CODES_PREFIX
|
#mesondefine ISO_CODES_PREFIX
|
||||||
|
|
||||||
|
/* Define if tracker3 is available */
|
||||||
|
#mesondefine HAVE_TRACKER3
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ save_response_cb (GtkNativeDialog *dialog,
|
|||||||
"Saving failed");
|
"Saving failed");
|
||||||
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message_dialog),
|
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message_dialog),
|
||||||
"%s", error->message);
|
"%s", error->message);
|
||||||
g_signal_connect (message_dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
|
g_signal_connect (message_dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
|
||||||
gtk_widget_show (message_dialog);
|
gtk_widget_show (message_dialog);
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
}
|
}
|
||||||
@@ -403,7 +403,7 @@ constraint_editor_done (ConstraintEditor *editor,
|
|||||||
|
|
||||||
g_clear_object (&old_constraint);
|
g_clear_object (&old_constraint);
|
||||||
|
|
||||||
gtk_widget_destroy (gtk_widget_get_ancestor (GTK_WIDGET (editor), GTK_TYPE_WINDOW));
|
gtk_window_destroy (GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (editor), GTK_TYPE_WINDOW)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -444,7 +444,7 @@ guide_editor_done (GuideEditor *editor,
|
|||||||
GtkConstraintGuide *guide,
|
GtkConstraintGuide *guide,
|
||||||
ConstraintEditorWindow *win)
|
ConstraintEditorWindow *win)
|
||||||
{
|
{
|
||||||
gtk_widget_destroy (gtk_widget_get_ancestor (GTK_WIDGET (editor), GTK_TYPE_WINDOW));
|
gtk_window_destroy (GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (editor), GTK_TYPE_WINDOW)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -487,8 +487,6 @@ constraint_editor_window_class_init (ConstraintEditorWindowClass *class)
|
|||||||
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
|
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
|
||||||
|
|
||||||
g_type_ensure (CONSTRAINT_VIEW_TYPE);
|
|
||||||
|
|
||||||
object_class->finalize = constraint_editor_window_finalize;
|
object_class->finalize = constraint_editor_window_finalize;
|
||||||
|
|
||||||
gtk_widget_class_set_template_from_resource (widget_class,
|
gtk_widget_class_set_template_from_resource (widget_class,
|
||||||
@@ -607,8 +605,8 @@ create_widget_func (gpointer item,
|
|||||||
gtk_widget_set_margin_bottom (label, 10);
|
gtk_widget_set_margin_bottom (label, 10);
|
||||||
gtk_label_set_xalign (GTK_LABEL (label), 0.0);
|
gtk_label_set_xalign (GTK_LABEL (label), 0.0);
|
||||||
gtk_widget_set_hexpand (label, TRUE);
|
gtk_widget_set_hexpand (label, TRUE);
|
||||||
gtk_container_add (GTK_CONTAINER (row), box);
|
gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), box);
|
||||||
gtk_container_add (GTK_CONTAINER (box), label);
|
gtk_box_append (GTK_BOX (box), label);
|
||||||
|
|
||||||
if (GTK_IS_CONSTRAINT (item) || GTK_IS_CONSTRAINT_GUIDE (item))
|
if (GTK_IS_CONSTRAINT (item) || GTK_IS_CONSTRAINT_GUIDE (item))
|
||||||
{
|
{
|
||||||
@@ -616,18 +614,18 @@ create_widget_func (gpointer item,
|
|||||||
gtk_button_set_has_frame (GTK_BUTTON (button), FALSE);
|
gtk_button_set_has_frame (GTK_BUTTON (button), FALSE);
|
||||||
g_signal_connect (button, "clicked", G_CALLBACK (row_edit), win);
|
g_signal_connect (button, "clicked", G_CALLBACK (row_edit), win);
|
||||||
g_object_set_data (G_OBJECT (row), "edit", button);
|
g_object_set_data (G_OBJECT (row), "edit", button);
|
||||||
gtk_container_add (GTK_CONTAINER (box), button);
|
gtk_box_append (GTK_BOX (box), button);
|
||||||
button = gtk_button_new_from_icon_name ("edit-delete-symbolic");
|
button = gtk_button_new_from_icon_name ("edit-delete-symbolic");
|
||||||
gtk_button_set_has_frame (GTK_BUTTON (button), FALSE);
|
gtk_button_set_has_frame (GTK_BUTTON (button), FALSE);
|
||||||
g_signal_connect (button, "clicked", G_CALLBACK (row_delete), win);
|
g_signal_connect (button, "clicked", G_CALLBACK (row_delete), win);
|
||||||
gtk_container_add (GTK_CONTAINER (box), button);
|
gtk_box_append (GTK_BOX (box), button);
|
||||||
}
|
}
|
||||||
else if (GTK_IS_WIDGET (item))
|
else if (GTK_IS_WIDGET (item))
|
||||||
{
|
{
|
||||||
button = gtk_button_new_from_icon_name ("edit-delete-symbolic");
|
button = gtk_button_new_from_icon_name ("edit-delete-symbolic");
|
||||||
gtk_button_set_has_frame (GTK_BUTTON (button), FALSE);
|
gtk_button_set_has_frame (GTK_BUTTON (button), FALSE);
|
||||||
g_signal_connect (button, "clicked", G_CALLBACK (row_delete), win);
|
g_signal_connect (button, "clicked", G_CALLBACK (row_delete), win);
|
||||||
gtk_container_add (GTK_CONTAINER (box), button);
|
gtk_box_append (GTK_BOX (box), button);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free (freeme);
|
g_free (freeme);
|
||||||
|
|||||||
@@ -169,6 +169,7 @@ constraint_view_init (ConstraintView *self)
|
|||||||
GListModel *guides;
|
GListModel *guides;
|
||||||
GListModel *children;
|
GListModel *children;
|
||||||
GListModel *constraints;
|
GListModel *constraints;
|
||||||
|
GtkFilter *filter;
|
||||||
|
|
||||||
manager = gtk_constraint_layout_new ();
|
manager = gtk_constraint_layout_new ();
|
||||||
gtk_widget_set_layout_manager (GTK_WIDGET (self), manager);
|
gtk_widget_set_layout_manager (GTK_WIDGET (self), manager);
|
||||||
@@ -176,8 +177,12 @@ constraint_view_init (ConstraintView *self)
|
|||||||
all_children = gtk_widget_observe_children (GTK_WIDGET (self));
|
all_children = gtk_widget_observe_children (GTK_WIDGET (self));
|
||||||
all_constraints = gtk_constraint_layout_observe_constraints (GTK_CONSTRAINT_LAYOUT (manager));
|
all_constraints = gtk_constraint_layout_observe_constraints (GTK_CONSTRAINT_LAYOUT (manager));
|
||||||
guides = gtk_constraint_layout_observe_guides (GTK_CONSTRAINT_LAYOUT (manager));
|
guides = gtk_constraint_layout_observe_guides (GTK_CONSTRAINT_LAYOUT (manager));
|
||||||
constraints = (GListModel *)gtk_filter_list_model_new (all_constraints, omit_internal, NULL, NULL);
|
filter = gtk_custom_filter_new (omit_internal, NULL, NULL);
|
||||||
children = (GListModel *)gtk_filter_list_model_new (all_children, omit_internal, NULL, NULL);
|
constraints = (GListModel *)gtk_filter_list_model_new (all_constraints, filter);
|
||||||
|
g_object_unref (filter);
|
||||||
|
filter = gtk_custom_filter_new (omit_internal, NULL, NULL);
|
||||||
|
children = (GListModel *)gtk_filter_list_model_new (all_children, filter);
|
||||||
|
g_object_unref (filter);
|
||||||
|
|
||||||
list = g_list_store_new (G_TYPE_LIST_MODEL);
|
list = g_list_store_new (G_TYPE_LIST_MODEL);
|
||||||
g_list_store_append (list, children);
|
g_list_store_append (list, children);
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#define CONSTRAINT_VIEW_TYPE (constraint_view_get_type ())
|
#define CONSTRAINT_VIEW_TYPE (constraint_view_get_type ())
|
||||||
|
|
||||||
|
G_MODULE_EXPORT
|
||||||
G_DECLARE_FINAL_TYPE (ConstraintView, constraint_view, CONSTRAINT, VIEW, GtkWidget)
|
G_DECLARE_FINAL_TYPE (ConstraintView, constraint_view, CONSTRAINT, VIEW, GtkWidget)
|
||||||
|
|
||||||
ConstraintView * constraint_view_new (void);
|
ConstraintView * constraint_view_new (void);
|
||||||
|
|||||||
@@ -184,58 +184,6 @@ max_input (GtkSpinButton *spin_button,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
min_output (GtkSpinButton *spin_button)
|
|
||||||
{
|
|
||||||
GtkAdjustment *adjustment;
|
|
||||||
double value;
|
|
||||||
GtkWidget *box, *text;
|
|
||||||
|
|
||||||
adjustment = gtk_spin_button_get_adjustment (spin_button);
|
|
||||||
value = gtk_adjustment_get_value (adjustment);
|
|
||||||
|
|
||||||
box = gtk_widget_get_first_child (GTK_WIDGET (spin_button));
|
|
||||||
text = gtk_widget_get_first_child (box);
|
|
||||||
|
|
||||||
if (value == 0.0)
|
|
||||||
{
|
|
||||||
gtk_editable_set_text (GTK_EDITABLE (spin_button), "");
|
|
||||||
gtk_text_set_placeholder_text (GTK_TEXT (text), "unset");
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gtk_text_set_placeholder_text (GTK_TEXT (text), "");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
max_output (GtkSpinButton *spin_button)
|
|
||||||
{
|
|
||||||
GtkAdjustment *adjustment;
|
|
||||||
double value;
|
|
||||||
GtkWidget *box, *text;
|
|
||||||
|
|
||||||
adjustment = gtk_spin_button_get_adjustment (spin_button);
|
|
||||||
value = gtk_adjustment_get_value (adjustment);
|
|
||||||
|
|
||||||
box = gtk_widget_get_first_child (GTK_WIDGET (spin_button));
|
|
||||||
text = gtk_widget_get_first_child (box);
|
|
||||||
|
|
||||||
if (value == (double)G_MAXINT)
|
|
||||||
{
|
|
||||||
gtk_editable_set_text (GTK_EDITABLE (spin_button), "");
|
|
||||||
gtk_text_set_placeholder_text (GTK_TEXT (text), "unset");
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gtk_text_set_placeholder_text (GTK_TEXT (text), "");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
guide_editor_constructed (GObject *object)
|
guide_editor_constructed (GObject *object)
|
||||||
{
|
{
|
||||||
@@ -244,16 +192,12 @@ guide_editor_constructed (GObject *object)
|
|||||||
guide_strength_combo (editor->strength);
|
guide_strength_combo (editor->strength);
|
||||||
|
|
||||||
g_signal_connect (editor->min_width, "input", G_CALLBACK (min_input), NULL);
|
g_signal_connect (editor->min_width, "input", G_CALLBACK (min_input), NULL);
|
||||||
g_signal_connect (editor->min_width, "output", G_CALLBACK (min_output), NULL);
|
|
||||||
|
|
||||||
g_signal_connect (editor->min_height, "input", G_CALLBACK (min_input), NULL);
|
g_signal_connect (editor->min_height, "input", G_CALLBACK (min_input), NULL);
|
||||||
g_signal_connect (editor->min_height, "output", G_CALLBACK (min_output), NULL);
|
|
||||||
|
|
||||||
g_signal_connect (editor->max_width, "input", G_CALLBACK (max_input), NULL);
|
g_signal_connect (editor->max_width, "input", G_CALLBACK (max_input), NULL);
|
||||||
g_signal_connect (editor->max_width, "output", G_CALLBACK (max_output), NULL);
|
|
||||||
|
|
||||||
g_signal_connect (editor->max_height, "input", G_CALLBACK (max_input), NULL);
|
g_signal_connect (editor->max_height, "input", G_CALLBACK (max_input), NULL);
|
||||||
g_signal_connect (editor->max_height, "output", G_CALLBACK (max_output), NULL);
|
|
||||||
|
|
||||||
if (editor->guide)
|
if (editor->guide)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ show_action_dialog (GSimpleAction *action)
|
|||||||
name);
|
name);
|
||||||
|
|
||||||
g_signal_connect (dialog, "response",
|
g_signal_connect (dialog, "response",
|
||||||
G_CALLBACK (gtk_widget_destroy), NULL);
|
G_CALLBACK (gtk_window_destroy), NULL);
|
||||||
|
|
||||||
gtk_widget_show (dialog);
|
gtk_widget_show (dialog);
|
||||||
}
|
}
|
||||||
@@ -120,7 +120,7 @@ open_response_cb (GtkNativeDialog *dialog,
|
|||||||
"Error loading file: \"%s\"",
|
"Error loading file: \"%s\"",
|
||||||
error->message);
|
error->message);
|
||||||
g_signal_connect (message_dialog, "response",
|
g_signal_connect (message_dialog, "response",
|
||||||
G_CALLBACK (gtk_widget_destroy), NULL);
|
G_CALLBACK (gtk_window_destroy), NULL);
|
||||||
gtk_widget_show (message_dialog);
|
gtk_widget_show (message_dialog);
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
}
|
}
|
||||||
@@ -234,7 +234,7 @@ activate_quit (GSimpleAction *action,
|
|||||||
win = list->data;
|
win = list->data;
|
||||||
next = list->next;
|
next = list->next;
|
||||||
|
|
||||||
gtk_widget_destroy (GTK_WIDGET (win));
|
gtk_window_destroy (GTK_WINDOW (win));
|
||||||
|
|
||||||
list = next;
|
list = next;
|
||||||
}
|
}
|
||||||
@@ -328,19 +328,14 @@ static void
|
|||||||
startup (GApplication *app)
|
startup (GApplication *app)
|
||||||
{
|
{
|
||||||
GtkBuilder *builder;
|
GtkBuilder *builder;
|
||||||
GMenuModel *appmenu;
|
|
||||||
GMenuModel *menubar;
|
|
||||||
|
|
||||||
G_APPLICATION_CLASS (demo_application_parent_class)->startup (app);
|
G_APPLICATION_CLASS (demo_application_parent_class)->startup (app);
|
||||||
|
|
||||||
builder = gtk_builder_new ();
|
builder = gtk_builder_new ();
|
||||||
gtk_builder_add_from_resource (builder, "/application_demo/menus.ui", NULL);
|
gtk_builder_add_from_resource (builder, "/application_demo/menus.ui", NULL);
|
||||||
|
|
||||||
appmenu = (GMenuModel *)gtk_builder_get_object (builder, "appmenu");
|
gtk_application_set_menubar (GTK_APPLICATION (app),
|
||||||
menubar = (GMenuModel *)gtk_builder_get_object (builder, "menubar");
|
G_MENU_MODEL (gtk_builder_get_object (builder, "menubar")));
|
||||||
|
|
||||||
gtk_application_set_app_menu (GTK_APPLICATION (app), appmenu);
|
|
||||||
gtk_application_set_menubar (GTK_APPLICATION (app), menubar);
|
|
||||||
|
|
||||||
g_object_unref (builder);
|
g_object_unref (builder);
|
||||||
}
|
}
|
||||||
@@ -353,6 +348,7 @@ create_window (GApplication *app,
|
|||||||
|
|
||||||
window = (DemoApplicationWindow *)g_object_new (demo_application_window_get_type (),
|
window = (DemoApplicationWindow *)g_object_new (demo_application_window_get_type (),
|
||||||
"application", app,
|
"application", app,
|
||||||
|
"show-menubar", TRUE,
|
||||||
NULL);
|
NULL);
|
||||||
if (content)
|
if (content)
|
||||||
gtk_text_buffer_set_text (window->buffer, content, -1);
|
gtk_text_buffer_set_text (window->buffer, content, -1);
|
||||||
|
|||||||
@@ -31,12 +31,7 @@ on_name_vanished (GDBusConnection *connection,
|
|||||||
if (!name_seen)
|
if (!name_seen)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (placeholder)
|
g_clear_object (&placeholder);
|
||||||
{
|
|
||||||
gtk_widget_destroy (placeholder);
|
|
||||||
g_object_unref (placeholder);
|
|
||||||
placeholder = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<interface>
|
|
||||||
<menu id="appmenu">
|
|
||||||
<section>
|
|
||||||
<item>
|
|
||||||
<attribute name="label" translatable="yes">About</attribute>
|
|
||||||
<attribute name="action">app.about</attribute>
|
|
||||||
</item>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<item>
|
|
||||||
<attribute name="label" translatable="yes">_Quit</attribute>
|
|
||||||
<attribute name="action">app.quit</attribute>
|
|
||||||
<attribute name="accel"><Control>q</attribute>
|
|
||||||
</item>
|
|
||||||
</section>
|
|
||||||
</menu>
|
|
||||||
</interface>
|
|
||||||
@@ -26,7 +26,7 @@ apply_changes_gradually (gpointer data)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Close automatically once changes are fully applied. */
|
/* Close automatically once changes are fully applied. */
|
||||||
gtk_widget_destroy (data);
|
gtk_window_destroy (GTK_WINDOW (data));
|
||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -41,7 +41,7 @@ on_assistant_apply (GtkWidget *widget, gpointer data)
|
|||||||
static void
|
static void
|
||||||
on_assistant_close_cancel (GtkWidget *widget, gpointer data)
|
on_assistant_close_cancel (GtkWidget *widget, gpointer data)
|
||||||
{
|
{
|
||||||
gtk_widget_destroy (widget);
|
gtk_window_destroy (GTK_WINDOW (widget));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -95,12 +95,12 @@ create_page1 (GtkWidget *assistant)
|
|||||||
gtk_widget_set_margin_bottom (box, 12);
|
gtk_widget_set_margin_bottom (box, 12);
|
||||||
|
|
||||||
label = gtk_label_new ("You must fill out this entry to continue:");
|
label = gtk_label_new ("You must fill out this entry to continue:");
|
||||||
gtk_container_add (GTK_CONTAINER (box), label);
|
gtk_box_append (GTK_BOX (box), label);
|
||||||
|
|
||||||
entry = gtk_entry_new ();
|
entry = gtk_entry_new ();
|
||||||
gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
|
gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
|
||||||
gtk_widget_set_valign (entry, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign (entry, GTK_ALIGN_CENTER);
|
||||||
gtk_container_add (GTK_CONTAINER (box), entry);
|
gtk_box_append (GTK_BOX (box), entry);
|
||||||
g_signal_connect (G_OBJECT (entry), "changed",
|
g_signal_connect (G_OBJECT (entry), "changed",
|
||||||
G_CALLBACK (on_entry_changed), assistant);
|
G_CALLBACK (on_entry_changed), assistant);
|
||||||
|
|
||||||
@@ -123,7 +123,7 @@ create_page2 (GtkWidget *assistant)
|
|||||||
checkbutton = gtk_check_button_new_with_label ("This is optional data, you may continue "
|
checkbutton = gtk_check_button_new_with_label ("This is optional data, you may continue "
|
||||||
"even if you do not check this");
|
"even if you do not check this");
|
||||||
gtk_widget_set_valign (checkbutton, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign (checkbutton, GTK_ALIGN_CENTER);
|
||||||
gtk_container_add (GTK_CONTAINER (box), checkbutton);
|
gtk_box_append (GTK_BOX (box), checkbutton);
|
||||||
|
|
||||||
gtk_assistant_append_page (GTK_ASSISTANT (assistant), box);
|
gtk_assistant_append_page (GTK_ASSISTANT (assistant), box);
|
||||||
gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), box, TRUE);
|
gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), box, TRUE);
|
||||||
@@ -178,8 +178,7 @@ do_assistant (GtkWidget *do_widget)
|
|||||||
|
|
||||||
gtk_window_set_display (GTK_WINDOW (assistant),
|
gtk_window_set_display (GTK_WINDOW (assistant),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
g_signal_connect (assistant, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (assistant), (gpointer *)&assistant);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &assistant);
|
|
||||||
|
|
||||||
create_page1 (assistant);
|
create_page1 (assistant);
|
||||||
create_page2 (assistant);
|
create_page2 (assistant);
|
||||||
@@ -199,7 +198,7 @@ do_assistant (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (assistant))
|
if (!gtk_widget_get_visible (assistant))
|
||||||
gtk_widget_show (assistant);
|
gtk_widget_show (assistant);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (assistant);
|
gtk_window_destroy (GTK_WINDOW (assistant));
|
||||||
|
|
||||||
return assistant;
|
return assistant;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ quit_activate (GSimpleAction *action,
|
|||||||
{
|
{
|
||||||
GtkWidget *window = user_data;
|
GtkWidget *window = user_data;
|
||||||
|
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -26,8 +26,10 @@ about_activate (GSimpleAction *action,
|
|||||||
|
|
||||||
builder = g_object_get_data (G_OBJECT (window), "builder");
|
builder = g_object_get_data (G_OBJECT (window), "builder");
|
||||||
about_dlg = GTK_WIDGET (gtk_builder_get_object (builder, "aboutdialog1"));
|
about_dlg = GTK_WIDGET (gtk_builder_get_object (builder, "aboutdialog1"));
|
||||||
gtk_dialog_run (GTK_DIALOG (about_dlg));
|
gtk_window_set_transient_for (GTK_WINDOW (about_dlg), GTK_WINDOW (window));
|
||||||
gtk_widget_hide (about_dlg);
|
gtk_window_set_hide_on_close (GTK_WINDOW (about_dlg), TRUE);
|
||||||
|
g_signal_connect (about_dlg, "response", G_CALLBACK (gtk_widget_hide), NULL);
|
||||||
|
gtk_widget_show (about_dlg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -74,21 +76,20 @@ do_builder (GtkWidget *do_widget)
|
|||||||
window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
|
window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
|
||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
actions = (GActionGroup*)g_simple_action_group_new ();
|
actions = (GActionGroup*)g_simple_action_group_new ();
|
||||||
g_action_map_add_action_entries (G_ACTION_MAP (actions),
|
g_action_map_add_action_entries (G_ACTION_MAP (actions),
|
||||||
win_entries, G_N_ELEMENTS (win_entries),
|
win_entries, G_N_ELEMENTS (win_entries),
|
||||||
window);
|
window);
|
||||||
gtk_widget_insert_action_group (window, "win", actions);
|
gtk_widget_insert_action_group (window, "win", actions);
|
||||||
|
|
||||||
g_object_set_data_full (G_OBJECT(window), "builder", builder, g_object_unref);
|
g_object_unref (builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ paste_received (GObject *source_object,
|
|||||||
"Could not paste text: %s",
|
"Could not paste text: %s",
|
||||||
error->message);
|
error->message);
|
||||||
g_signal_connect (dialog, "response",
|
g_signal_connect (dialog, "response",
|
||||||
G_CALLBACK (gtk_widget_destroy), NULL);
|
G_CALLBACK (gtk_window_destroy), NULL);
|
||||||
gtk_widget_show (dialog);
|
gtk_widget_show (dialog);
|
||||||
|
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
@@ -108,9 +108,7 @@ do_clipboard (GtkWidget *do_widget)
|
|||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Clipboard");
|
gtk_window_set_title (GTK_WINDOW (window), "Clipboard");
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
g_signal_connect (window, "destroy",
|
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
gtk_widget_set_margin_start (vbox, 8);
|
gtk_widget_set_margin_start (vbox, 8);
|
||||||
@@ -122,72 +120,72 @@ do_clipboard (GtkWidget *do_widget)
|
|||||||
|
|
||||||
label = gtk_label_new ("\"Copy\" will copy the text\nin the entry to the clipboard");
|
label = gtk_label_new ("\"Copy\" will copy the text\nin the entry to the clipboard");
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
|
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
|
||||||
gtk_widget_set_margin_start (hbox, 8);
|
gtk_widget_set_margin_start (hbox, 8);
|
||||||
gtk_widget_set_margin_end (hbox, 8);
|
gtk_widget_set_margin_end (hbox, 8);
|
||||||
gtk_widget_set_margin_top (hbox, 8);
|
gtk_widget_set_margin_top (hbox, 8);
|
||||||
gtk_widget_set_margin_bottom (hbox, 8);
|
gtk_widget_set_margin_bottom (hbox, 8);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), hbox);
|
gtk_box_append (GTK_BOX (vbox), hbox);
|
||||||
|
|
||||||
/* Create the first entry */
|
/* Create the first entry */
|
||||||
entry = gtk_entry_new ();
|
entry = gtk_entry_new ();
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), entry);
|
gtk_box_append (GTK_BOX (hbox), entry);
|
||||||
|
|
||||||
/* Create the button */
|
/* Create the button */
|
||||||
button = gtk_button_new_with_mnemonic (_("_Copy"));
|
button = gtk_button_new_with_mnemonic (_("_Copy"));
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), button);
|
gtk_box_append (GTK_BOX (hbox), button);
|
||||||
g_signal_connect (button, "clicked",
|
g_signal_connect (button, "clicked",
|
||||||
G_CALLBACK (copy_button_clicked), entry);
|
G_CALLBACK (copy_button_clicked), entry);
|
||||||
|
|
||||||
label = gtk_label_new ("\"Paste\" will paste the text from the clipboard to the entry");
|
label = gtk_label_new ("\"Paste\" will paste the text from the clipboard to the entry");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
|
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
|
||||||
gtk_widget_set_margin_start (hbox, 8);
|
gtk_widget_set_margin_start (hbox, 8);
|
||||||
gtk_widget_set_margin_end (hbox, 8);
|
gtk_widget_set_margin_end (hbox, 8);
|
||||||
gtk_widget_set_margin_top (hbox, 8);
|
gtk_widget_set_margin_top (hbox, 8);
|
||||||
gtk_widget_set_margin_bottom (hbox, 8);
|
gtk_widget_set_margin_bottom (hbox, 8);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), hbox);
|
gtk_box_append (GTK_BOX (vbox), hbox);
|
||||||
|
|
||||||
/* Create the second entry */
|
/* Create the second entry */
|
||||||
entry = gtk_entry_new ();
|
entry = gtk_entry_new ();
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), entry);
|
gtk_box_append (GTK_BOX (hbox), entry);
|
||||||
|
|
||||||
/* Create the button */
|
/* Create the button */
|
||||||
button = gtk_button_new_with_mnemonic (_("_Paste"));
|
button = gtk_button_new_with_mnemonic (_("_Paste"));
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), button);
|
gtk_box_append (GTK_BOX (hbox), button);
|
||||||
g_signal_connect (button, "clicked",
|
g_signal_connect (button, "clicked",
|
||||||
G_CALLBACK (paste_button_clicked), entry);
|
G_CALLBACK (paste_button_clicked), entry);
|
||||||
|
|
||||||
label = gtk_label_new ("Images can be transferred via the clipboard, too");
|
label = gtk_label_new ("Images can be transferred via the clipboard, too");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
|
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
|
||||||
gtk_widget_set_margin_start (hbox, 8);
|
gtk_widget_set_margin_start (hbox, 8);
|
||||||
gtk_widget_set_margin_end (hbox, 8);
|
gtk_widget_set_margin_end (hbox, 8);
|
||||||
gtk_widget_set_margin_top (hbox, 8);
|
gtk_widget_set_margin_top (hbox, 8);
|
||||||
gtk_widget_set_margin_bottom (hbox, 8);
|
gtk_widget_set_margin_bottom (hbox, 8);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), hbox);
|
gtk_box_append (GTK_BOX (vbox), hbox);
|
||||||
|
|
||||||
/* Create the first image */
|
/* Create the first image */
|
||||||
image = demo_image_new ("dialog-warning");
|
image = demo_image_new ("dialog-warning");
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), image);
|
gtk_box_append (GTK_BOX (hbox), image);
|
||||||
|
|
||||||
/* Create the second image */
|
/* Create the second image */
|
||||||
image = demo_image_new ("process-stop");
|
image = demo_image_new ("process-stop");
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), image);
|
gtk_box_append (GTK_BOX (hbox), image);
|
||||||
|
|
||||||
/* Create the third image */
|
/* Create the third image */
|
||||||
image = demo_image_new ("weather-clear");
|
image = demo_image_new ("weather-clear");
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), image);
|
gtk_box_append (GTK_BOX (hbox), image);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
9344
demos/gtk-demo/color.names.txt
Normal file
9344
demos/gtk-demo/color.names.txt
Normal file
File diff suppressed because it is too large
Load Diff
@@ -315,9 +315,7 @@ do_combobox (GtkWidget *do_widget)
|
|||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Combo Boxes");
|
gtk_window_set_title (GTK_WINDOW (window), "Combo Boxes");
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
g_signal_connect (window, "destroy",
|
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
|
||||||
gtk_widget_set_margin_start (vbox, 10);
|
gtk_widget_set_margin_start (vbox, 10);
|
||||||
@@ -330,7 +328,7 @@ do_combobox (GtkWidget *do_widget)
|
|||||||
* insensitive rows
|
* insensitive rows
|
||||||
*/
|
*/
|
||||||
frame = gtk_frame_new ("Items with icons");
|
frame = gtk_frame_new ("Items with icons");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), frame);
|
gtk_box_append (GTK_BOX (vbox), frame);
|
||||||
|
|
||||||
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
gtk_widget_set_margin_start (box, 5);
|
gtk_widget_set_margin_start (box, 5);
|
||||||
@@ -342,7 +340,7 @@ do_combobox (GtkWidget *do_widget)
|
|||||||
model = create_icon_store ();
|
model = create_icon_store ();
|
||||||
combo = gtk_combo_box_new_with_model (model);
|
combo = gtk_combo_box_new_with_model (model);
|
||||||
g_object_unref (model);
|
g_object_unref (model);
|
||||||
gtk_container_add (GTK_CONTAINER (box), combo);
|
gtk_box_append (GTK_BOX (box), combo);
|
||||||
|
|
||||||
renderer = gtk_cell_renderer_pixbuf_new ();
|
renderer = gtk_cell_renderer_pixbuf_new ();
|
||||||
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, FALSE);
|
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, FALSE);
|
||||||
@@ -374,7 +372,7 @@ do_combobox (GtkWidget *do_widget)
|
|||||||
/* A combobox demonstrating trees.
|
/* A combobox demonstrating trees.
|
||||||
*/
|
*/
|
||||||
frame = gtk_frame_new ("Where are we ?");
|
frame = gtk_frame_new ("Where are we ?");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), frame);
|
gtk_box_append (GTK_BOX (vbox), frame);
|
||||||
|
|
||||||
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
gtk_widget_set_margin_start (box, 5);
|
gtk_widget_set_margin_start (box, 5);
|
||||||
@@ -386,7 +384,7 @@ do_combobox (GtkWidget *do_widget)
|
|||||||
model = create_capital_store ();
|
model = create_capital_store ();
|
||||||
combo = gtk_combo_box_new_with_model (model);
|
combo = gtk_combo_box_new_with_model (model);
|
||||||
g_object_unref (model);
|
g_object_unref (model);
|
||||||
gtk_container_add (GTK_CONTAINER (box), combo);
|
gtk_box_append (GTK_BOX (box), combo);
|
||||||
|
|
||||||
renderer = gtk_cell_renderer_text_new ();
|
renderer = gtk_cell_renderer_text_new ();
|
||||||
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
|
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
|
||||||
@@ -405,7 +403,7 @@ do_combobox (GtkWidget *do_widget)
|
|||||||
|
|
||||||
/* A GtkComboBoxEntry with validation */
|
/* A GtkComboBoxEntry with validation */
|
||||||
frame = gtk_frame_new ("Editable");
|
frame = gtk_frame_new ("Editable");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), frame);
|
gtk_box_append (GTK_BOX (vbox), frame);
|
||||||
|
|
||||||
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
gtk_widget_set_margin_start (box, 5);
|
gtk_widget_set_margin_start (box, 5);
|
||||||
@@ -416,7 +414,7 @@ do_combobox (GtkWidget *do_widget)
|
|||||||
|
|
||||||
combo = gtk_combo_box_text_new_with_entry ();
|
combo = gtk_combo_box_text_new_with_entry ();
|
||||||
fill_combo_entry (combo);
|
fill_combo_entry (combo);
|
||||||
gtk_container_add (GTK_CONTAINER (box), combo);
|
gtk_box_append (GTK_BOX (box), combo);
|
||||||
|
|
||||||
entry = g_object_new (TYPE_MASK_ENTRY, NULL);
|
entry = g_object_new (TYPE_MASK_ENTRY, NULL);
|
||||||
MASK_ENTRY (entry)->mask = "^([0-9]*|One|Two|2\302\275|Three)$";
|
MASK_ENTRY (entry)->mask = "^([0-9]*|One|Two|2\302\275|Three)$";
|
||||||
@@ -425,7 +423,7 @@ do_combobox (GtkWidget *do_widget)
|
|||||||
|
|
||||||
/* A combobox with string IDs */
|
/* A combobox with string IDs */
|
||||||
frame = gtk_frame_new ("String IDs");
|
frame = gtk_frame_new ("String IDs");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), frame);
|
gtk_box_append (GTK_BOX (vbox), frame);
|
||||||
|
|
||||||
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
gtk_widget_set_margin_start (box, 5);
|
gtk_widget_set_margin_start (box, 5);
|
||||||
@@ -438,19 +436,19 @@ do_combobox (GtkWidget *do_widget)
|
|||||||
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "never", "Not visible");
|
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "never", "Not visible");
|
||||||
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "when-active", "Visible when active");
|
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "when-active", "Visible when active");
|
||||||
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "always", "Always visible");
|
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "always", "Always visible");
|
||||||
gtk_container_add (GTK_CONTAINER (box), combo);
|
gtk_box_append (GTK_BOX (box), combo);
|
||||||
|
|
||||||
entry = gtk_entry_new ();
|
entry = gtk_entry_new ();
|
||||||
g_object_bind_property (combo, "active-id",
|
g_object_bind_property (combo, "active-id",
|
||||||
entry, "text",
|
entry, "text",
|
||||||
G_BINDING_BIDIRECTIONAL);
|
G_BINDING_BIDIRECTIONAL);
|
||||||
gtk_container_add (GTK_CONTAINER (box), entry);
|
gtk_box_append (GTK_BOX (box), entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,9 +25,9 @@ simple_grid_dispose (GObject *object)
|
|||||||
{
|
{
|
||||||
SimpleGrid *self = SIMPLE_GRID (object);
|
SimpleGrid *self = SIMPLE_GRID (object);
|
||||||
|
|
||||||
g_clear_pointer (&self->button1, gtk_widget_destroy);
|
g_clear_pointer (&self->button1, gtk_widget_unparent);
|
||||||
g_clear_pointer (&self->button2, gtk_widget_destroy);
|
g_clear_pointer (&self->button2, gtk_widget_unparent);
|
||||||
g_clear_pointer (&self->button3, gtk_widget_destroy);
|
g_clear_pointer (&self->button3, gtk_widget_unparent);
|
||||||
|
|
||||||
G_OBJECT_CLASS (simple_grid_parent_class)->dispose (object);
|
G_OBJECT_CLASS (simple_grid_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
@@ -263,8 +263,7 @@ do_constraints (GtkWidget *do_widget)
|
|||||||
header = gtk_header_bar_new ();
|
header = gtk_header_bar_new ();
|
||||||
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
|
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
|
||||||
gtk_window_set_titlebar (GTK_WINDOW (window), header);
|
gtk_window_set_titlebar (GTK_WINDOW (window), header);
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
|
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
|
||||||
gtk_window_set_child (GTK_WINDOW (window), box);
|
gtk_window_set_child (GTK_WINDOW (window), box);
|
||||||
@@ -272,19 +271,19 @@ do_constraints (GtkWidget *do_widget)
|
|||||||
grid = g_object_new (simple_grid_get_type (), NULL);
|
grid = g_object_new (simple_grid_get_type (), NULL);
|
||||||
gtk_widget_set_hexpand (grid, TRUE);
|
gtk_widget_set_hexpand (grid, TRUE);
|
||||||
gtk_widget_set_vexpand (grid, TRUE);
|
gtk_widget_set_vexpand (grid, TRUE);
|
||||||
gtk_container_add (GTK_CONTAINER (box), grid);
|
gtk_box_append (GTK_BOX (box), grid);
|
||||||
|
|
||||||
button = gtk_button_new_with_label ("Close");
|
button = gtk_button_new_with_label ("Close");
|
||||||
gtk_container_add (GTK_CONTAINER (box), button);
|
gtk_box_append (GTK_BOX (box), button);
|
||||||
gtk_widget_set_hexpand (grid, TRUE);
|
gtk_widget_set_hexpand (grid, TRUE);
|
||||||
g_signal_connect_swapped (button, "clicked",
|
g_signal_connect_swapped (button, "clicked",
|
||||||
G_CALLBACK (gtk_widget_destroy), window);
|
G_CALLBACK (gtk_window_destroy), window);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/* Constraints/Interactive
|
/* Constraints/Interactive
|
||||||
*
|
*
|
||||||
* Demonstrate how constraints can be updates during
|
* Demonstrate how constraints can be updates during user interaction.
|
||||||
* user interaction.
|
* The vertical edge between the buttons can be dragged with the mouse.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
@@ -26,9 +26,9 @@ interactive_grid_dispose (GObject *object)
|
|||||||
{
|
{
|
||||||
InteractiveGrid *self = INTERACTIVE_GRID (object);
|
InteractiveGrid *self = INTERACTIVE_GRID (object);
|
||||||
|
|
||||||
g_clear_pointer (&self->button1, gtk_widget_destroy);
|
g_clear_pointer (&self->button1, gtk_widget_unparent);
|
||||||
g_clear_pointer (&self->button2, gtk_widget_destroy);
|
g_clear_pointer (&self->button2, gtk_widget_unparent);
|
||||||
g_clear_pointer (&self->button3, gtk_widget_destroy);
|
g_clear_pointer (&self->button3, gtk_widget_unparent);
|
||||||
|
|
||||||
G_OBJECT_CLASS (interactive_grid_parent_class)->dispose (object);
|
G_OBJECT_CLASS (interactive_grid_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
@@ -219,8 +219,7 @@ do_constraints2 (GtkWidget *do_widget)
|
|||||||
header = gtk_header_bar_new ();
|
header = gtk_header_bar_new ();
|
||||||
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
|
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
|
||||||
gtk_window_set_titlebar (GTK_WINDOW (window), header);
|
gtk_window_set_titlebar (GTK_WINDOW (window), header);
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
|
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
|
||||||
gtk_window_set_child (GTK_WINDOW (window), box);
|
gtk_window_set_child (GTK_WINDOW (window), box);
|
||||||
@@ -228,19 +227,19 @@ do_constraints2 (GtkWidget *do_widget)
|
|||||||
grid = g_object_new (interactive_grid_get_type (), NULL);
|
grid = g_object_new (interactive_grid_get_type (), NULL);
|
||||||
gtk_widget_set_hexpand (grid, TRUE);
|
gtk_widget_set_hexpand (grid, TRUE);
|
||||||
gtk_widget_set_vexpand (grid, TRUE);
|
gtk_widget_set_vexpand (grid, TRUE);
|
||||||
gtk_container_add (GTK_CONTAINER (box), grid);
|
gtk_box_append (GTK_BOX (box), grid);
|
||||||
|
|
||||||
button = gtk_button_new_with_label ("Close");
|
button = gtk_button_new_with_label ("Close");
|
||||||
gtk_container_add (GTK_CONTAINER (box), button);
|
gtk_box_append (GTK_BOX (box), button);
|
||||||
gtk_widget_set_hexpand (grid, TRUE);
|
gtk_widget_set_hexpand (grid, TRUE);
|
||||||
g_signal_connect_swapped (button, "clicked",
|
g_signal_connect_swapped (button, "clicked",
|
||||||
G_CALLBACK (gtk_widget_destroy), window);
|
G_CALLBACK (gtk_window_destroy), window);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ vfl_grid_dispose (GObject *object)
|
|||||||
{
|
{
|
||||||
VflGrid *self = VFL_GRID (object);
|
VflGrid *self = VFL_GRID (object);
|
||||||
|
|
||||||
g_clear_pointer (&self->button1, gtk_widget_destroy);
|
g_clear_pointer (&self->button1, gtk_widget_unparent);
|
||||||
g_clear_pointer (&self->button2, gtk_widget_destroy);
|
g_clear_pointer (&self->button2, gtk_widget_unparent);
|
||||||
g_clear_pointer (&self->button3, gtk_widget_destroy);
|
g_clear_pointer (&self->button3, gtk_widget_unparent);
|
||||||
|
|
||||||
G_OBJECT_CLASS (vfl_grid_parent_class)->dispose (object);
|
G_OBJECT_CLASS (vfl_grid_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
@@ -139,8 +139,7 @@ do_constraints3 (GtkWidget *do_widget)
|
|||||||
header = gtk_header_bar_new ();
|
header = gtk_header_bar_new ();
|
||||||
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
|
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
|
||||||
gtk_window_set_titlebar (GTK_WINDOW (window), header);
|
gtk_window_set_titlebar (GTK_WINDOW (window), header);
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
|
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
|
||||||
gtk_window_set_child (GTK_WINDOW (window), box);
|
gtk_window_set_child (GTK_WINDOW (window), box);
|
||||||
@@ -148,19 +147,19 @@ do_constraints3 (GtkWidget *do_widget)
|
|||||||
grid = g_object_new (vfl_grid_get_type (), NULL);
|
grid = g_object_new (vfl_grid_get_type (), NULL);
|
||||||
gtk_widget_set_hexpand (grid, TRUE);
|
gtk_widget_set_hexpand (grid, TRUE);
|
||||||
gtk_widget_set_vexpand (grid, TRUE);
|
gtk_widget_set_vexpand (grid, TRUE);
|
||||||
gtk_container_add (GTK_CONTAINER (box), grid);
|
gtk_box_append (GTK_BOX (box), grid);
|
||||||
|
|
||||||
button = gtk_button_new_with_label ("Close");
|
button = gtk_button_new_with_label ("Close");
|
||||||
gtk_container_add (GTK_CONTAINER (box), button);
|
gtk_box_append (GTK_BOX (box), button);
|
||||||
gtk_widget_set_hexpand (grid, TRUE);
|
gtk_widget_set_hexpand (grid, TRUE);
|
||||||
g_signal_connect_swapped (button, "clicked",
|
g_signal_connect_swapped (button, "clicked",
|
||||||
G_CALLBACK (gtk_widget_destroy), window);
|
G_CALLBACK (gtk_window_destroy), window);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,13 @@
|
|||||||
static void
|
static void
|
||||||
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
||||||
{
|
{
|
||||||
|
GtkWidget *child;
|
||||||
|
|
||||||
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
||||||
if (GTK_IS_CONTAINER (widget))
|
for (child = gtk_widget_get_first_child (widget);
|
||||||
gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
|
child != NULL;
|
||||||
|
child = gtk_widget_get_next_sibling (child))
|
||||||
|
apply_css (child, provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkWidget *
|
GtkWidget *
|
||||||
@@ -28,8 +32,7 @@ do_css_accordion (GtkWidget *do_widget)
|
|||||||
gtk_window_set_title (GTK_WINDOW (window), "CSS Accordion");
|
gtk_window_set_title (GTK_WINDOW (window), "CSS Accordion");
|
||||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window), 600, 300);
|
gtk_window_set_default_size (GTK_WINDOW (window), 600, 300);
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
||||||
gtk_widget_set_halign (container, GTK_ALIGN_CENTER);
|
gtk_widget_set_halign (container, GTK_ALIGN_CENTER);
|
||||||
@@ -37,22 +40,22 @@ do_css_accordion (GtkWidget *do_widget)
|
|||||||
gtk_window_set_child (GTK_WINDOW (window), container);
|
gtk_window_set_child (GTK_WINDOW (window), container);
|
||||||
|
|
||||||
child = gtk_button_new_with_label ("This");
|
child = gtk_button_new_with_label ("This");
|
||||||
gtk_container_add (GTK_CONTAINER (container), child);
|
gtk_box_append (GTK_BOX (container), child);
|
||||||
|
|
||||||
child = gtk_button_new_with_label ("Is");
|
child = gtk_button_new_with_label ("Is");
|
||||||
gtk_container_add (GTK_CONTAINER (container), child);
|
gtk_box_append (GTK_BOX (container), child);
|
||||||
|
|
||||||
child = gtk_button_new_with_label ("A");
|
child = gtk_button_new_with_label ("A");
|
||||||
gtk_container_add (GTK_CONTAINER (container), child);
|
gtk_box_append (GTK_BOX (container), child);
|
||||||
|
|
||||||
child = gtk_button_new_with_label ("CSS");
|
child = gtk_button_new_with_label ("CSS");
|
||||||
gtk_container_add (GTK_CONTAINER (container), child);
|
gtk_box_append (GTK_BOX (container), child);
|
||||||
|
|
||||||
child = gtk_button_new_with_label ("Accordion");
|
child = gtk_button_new_with_label ("Accordion");
|
||||||
gtk_container_add (GTK_CONTAINER (container), child);
|
gtk_box_append (GTK_BOX (container), child);
|
||||||
|
|
||||||
child = gtk_button_new_with_label (":-)");
|
child = gtk_button_new_with_label (":-)");
|
||||||
gtk_container_add (GTK_CONTAINER (container), child);
|
gtk_box_append (GTK_BOX (container), child);
|
||||||
|
|
||||||
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
||||||
gtk_css_provider_load_from_resource (GTK_CSS_PROVIDER (provider), "/css_accordion/css_accordion.css");
|
gtk_css_provider_load_from_resource (GTK_CSS_PROVIDER (provider), "/css_accordion/css_accordion.css");
|
||||||
@@ -63,7 +66,7 @@ do_css_accordion (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,9 +55,13 @@ css_text_changed (GtkTextBuffer *buffer,
|
|||||||
static void
|
static void
|
||||||
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
||||||
{
|
{
|
||||||
|
GtkWidget *child;
|
||||||
|
|
||||||
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
||||||
if (GTK_IS_CONTAINER (widget))
|
for (child = gtk_widget_get_first_child (widget);
|
||||||
gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
|
child != NULL;
|
||||||
|
child = gtk_widget_get_next_sibling (child))
|
||||||
|
apply_css (child, provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkWidget *
|
GtkWidget *
|
||||||
@@ -76,8 +80,7 @@ do_css_basics (GtkWidget *do_widget)
|
|||||||
gtk_window_set_title (GTK_WINDOW (window), "CSS Basics");
|
gtk_window_set_title (GTK_WINDOW (window), "CSS Basics");
|
||||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
|
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
text = gtk_text_buffer_new (NULL);
|
text = gtk_text_buffer_new (NULL);
|
||||||
gtk_text_buffer_create_tag (text,
|
gtk_text_buffer_create_tag (text,
|
||||||
@@ -91,10 +94,10 @@ do_css_basics (GtkWidget *do_widget)
|
|||||||
|
|
||||||
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
||||||
|
|
||||||
container = gtk_scrolled_window_new (NULL, NULL);
|
container = gtk_scrolled_window_new ();
|
||||||
gtk_window_set_child (GTK_WINDOW (window), container);
|
gtk_window_set_child (GTK_WINDOW (window), container);
|
||||||
child = gtk_text_view_new_with_buffer (text);
|
child = gtk_text_view_new_with_buffer (text);
|
||||||
gtk_container_add (GTK_CONTAINER (container), child);
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (container), child);
|
||||||
g_signal_connect (text, "changed",
|
g_signal_connect (text, "changed",
|
||||||
G_CALLBACK (css_text_changed), provider);
|
G_CALLBACK (css_text_changed), provider);
|
||||||
|
|
||||||
@@ -113,7 +116,7 @@ do_css_basics (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ setup_listbox (GtkBuilder *builder,
|
|||||||
|
|
||||||
normal_row = NULL;
|
normal_row = NULL;
|
||||||
listbox = gtk_list_box_new ();
|
listbox = gtk_list_box_new ();
|
||||||
gtk_container_add (GTK_CONTAINER (WID ("scrolledwindow")), listbox);
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (WID ("scrolledwindow")), listbox);
|
||||||
|
|
||||||
g_signal_connect (listbox, "row-activated", G_CALLBACK (row_activated), provider);
|
g_signal_connect (listbox, "row-activated", G_CALLBACK (row_activated), provider);
|
||||||
|
|
||||||
@@ -95,9 +95,8 @@ setup_listbox (GtkBuilder *builder,
|
|||||||
"xalign", 0.0,
|
"xalign", 0.0,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER (row), label);
|
gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), label);
|
||||||
|
gtk_list_box_insert (GTK_LIST_BOX (listbox), row, -1);
|
||||||
gtk_container_add (GTK_CONTAINER (listbox), row);
|
|
||||||
|
|
||||||
/* The first selected row is "normal" */
|
/* The first selected row is "normal" */
|
||||||
if (g_strcmp0 (blend_modes[i].id, "normal") == 0)
|
if (g_strcmp0 (blend_modes[i].id, "normal") == 0)
|
||||||
@@ -125,7 +124,7 @@ do_css_blendmodes (GtkWidget *do_widget)
|
|||||||
|
|
||||||
window = WID ("window");
|
window = WID ("window");
|
||||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
||||||
g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
|
|
||||||
/* Setup the CSS provider for window */
|
/* Setup the CSS provider for window */
|
||||||
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
||||||
@@ -135,12 +134,14 @@ do_css_blendmodes (GtkWidget *do_widget)
|
|||||||
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
|
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
|
||||||
|
|
||||||
setup_listbox (builder, provider);
|
setup_listbox (builder, provider);
|
||||||
|
|
||||||
|
g_object_unref (builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,9 +69,13 @@ drawing_area_draw (GtkDrawingArea *da,
|
|||||||
static void
|
static void
|
||||||
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
||||||
{
|
{
|
||||||
|
GtkWidget *child;
|
||||||
|
|
||||||
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
||||||
if (GTK_IS_CONTAINER (widget))
|
for (child = gtk_widget_get_first_child (widget);
|
||||||
gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
|
child != NULL;
|
||||||
|
child = gtk_widget_get_next_sibling (child))
|
||||||
|
apply_css (child, provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkWidget *
|
GtkWidget *
|
||||||
@@ -81,7 +85,7 @@ do_css_multiplebgs (GtkWidget *do_widget)
|
|||||||
|
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
GtkWidget *paned, *container, *child;
|
GtkWidget *paned, *overlay, *child, *sw;
|
||||||
GtkStyleProvider *provider;
|
GtkStyleProvider *provider;
|
||||||
GtkTextBuffer *text;
|
GtkTextBuffer *text;
|
||||||
GBytes *bytes;
|
GBytes *bytes;
|
||||||
@@ -90,32 +94,31 @@ do_css_multiplebgs (GtkWidget *do_widget)
|
|||||||
gtk_window_set_title (GTK_WINDOW (window), "Multiple Backgrounds");
|
gtk_window_set_title (GTK_WINDOW (window), "Multiple Backgrounds");
|
||||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
|
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
container = gtk_overlay_new ();
|
overlay = gtk_overlay_new ();
|
||||||
gtk_window_set_child (GTK_WINDOW (window), container);
|
gtk_window_set_child (GTK_WINDOW (window), overlay);
|
||||||
|
|
||||||
child = gtk_drawing_area_new ();
|
child = gtk_drawing_area_new ();
|
||||||
gtk_widget_set_name (child, "canvas");
|
gtk_widget_set_name (child, "canvas");
|
||||||
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (child),
|
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (child),
|
||||||
drawing_area_draw,
|
drawing_area_draw,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
gtk_container_add (GTK_CONTAINER (container), child);
|
gtk_overlay_set_child (GTK_OVERLAY (overlay), child);
|
||||||
|
|
||||||
child = gtk_button_new ();
|
child = gtk_button_new ();
|
||||||
gtk_overlay_add_overlay (GTK_OVERLAY (container), child);
|
gtk_overlay_add_overlay (GTK_OVERLAY (overlay), child);
|
||||||
gtk_widget_set_name (child, "bricks-button");
|
gtk_widget_set_name (child, "bricks-button");
|
||||||
gtk_widget_set_halign (child, GTK_ALIGN_CENTER);
|
gtk_widget_set_halign (child, GTK_ALIGN_CENTER);
|
||||||
gtk_widget_set_valign (child, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign (child, GTK_ALIGN_CENTER);
|
||||||
gtk_widget_set_size_request (child, 250, 84);
|
gtk_widget_set_size_request (child, 250, 84);
|
||||||
|
|
||||||
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
|
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
|
||||||
gtk_overlay_add_overlay (GTK_OVERLAY (container), paned);
|
gtk_overlay_add_overlay (GTK_OVERLAY (overlay), paned);
|
||||||
|
|
||||||
/* Need a filler so we get a handle */
|
/* Need a filler so we get a handle */
|
||||||
child = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
child = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
gtk_container_add (GTK_CONTAINER (paned), child);
|
gtk_paned_set_start_child (GTK_PANED (paned), child);
|
||||||
|
|
||||||
text = gtk_text_buffer_new (NULL);
|
text = gtk_text_buffer_new (NULL);
|
||||||
gtk_text_buffer_create_tag (text,
|
gtk_text_buffer_create_tag (text,
|
||||||
@@ -129,10 +132,10 @@ do_css_multiplebgs (GtkWidget *do_widget)
|
|||||||
|
|
||||||
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
||||||
|
|
||||||
container = gtk_scrolled_window_new (NULL, NULL);
|
sw = gtk_scrolled_window_new ();
|
||||||
gtk_container_add (GTK_CONTAINER (paned), container);
|
gtk_paned_set_end_child (GTK_PANED (paned), sw);
|
||||||
child = gtk_text_view_new_with_buffer (text);
|
child = gtk_text_view_new_with_buffer (text);
|
||||||
gtk_container_add (GTK_CONTAINER (container), child);
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), child);
|
||||||
g_signal_connect (text,
|
g_signal_connect (text,
|
||||||
"changed",
|
"changed",
|
||||||
G_CALLBACK (css_text_changed),
|
G_CALLBACK (css_text_changed),
|
||||||
@@ -153,7 +156,7 @@ do_css_multiplebgs (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,9 +55,13 @@ css_text_changed (GtkTextBuffer *buffer,
|
|||||||
static void
|
static void
|
||||||
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
||||||
{
|
{
|
||||||
|
GtkWidget *child;
|
||||||
|
|
||||||
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
||||||
if (GTK_IS_CONTAINER (widget))
|
for (child = gtk_widget_get_first_child (widget);
|
||||||
gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
|
child != NULL;
|
||||||
|
child = gtk_widget_get_next_sibling (child))
|
||||||
|
apply_css (child, provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkWidget *
|
GtkWidget *
|
||||||
@@ -76,15 +80,14 @@ do_css_pixbufs (GtkWidget *do_widget)
|
|||||||
gtk_window_set_title (GTK_WINDOW (window), "Animated Backgrounds");
|
gtk_window_set_title (GTK_WINDOW (window), "Animated Backgrounds");
|
||||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
|
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
|
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
|
||||||
gtk_window_set_child (GTK_WINDOW (window), paned);
|
gtk_window_set_child (GTK_WINDOW (window), paned);
|
||||||
|
|
||||||
/* Need a filler so we get a handle */
|
/* Need a filler so we get a handle */
|
||||||
child = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
child = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
gtk_container_add (GTK_CONTAINER (paned), child);
|
gtk_paned_set_start_child (GTK_PANED (paned), child);
|
||||||
|
|
||||||
text = gtk_text_buffer_new (NULL);
|
text = gtk_text_buffer_new (NULL);
|
||||||
gtk_text_buffer_create_tag (text,
|
gtk_text_buffer_create_tag (text,
|
||||||
@@ -98,10 +101,10 @@ do_css_pixbufs (GtkWidget *do_widget)
|
|||||||
|
|
||||||
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
||||||
|
|
||||||
container = gtk_scrolled_window_new (NULL, NULL);
|
container = gtk_scrolled_window_new ();
|
||||||
gtk_container_add (GTK_CONTAINER (paned), container);
|
gtk_paned_set_end_child (GTK_PANED (paned), container);
|
||||||
child = gtk_text_view_new_with_buffer (text);
|
child = gtk_text_view_new_with_buffer (text);
|
||||||
gtk_container_add (GTK_CONTAINER (container), child);
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (container), child);
|
||||||
g_signal_connect (text, "changed",
|
g_signal_connect (text, "changed",
|
||||||
G_CALLBACK (css_text_changed), provider);
|
G_CALLBACK (css_text_changed), provider);
|
||||||
|
|
||||||
@@ -120,7 +123,7 @@ do_css_pixbufs (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,9 +53,13 @@ css_text_changed (GtkTextBuffer *buffer,
|
|||||||
static void
|
static void
|
||||||
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
||||||
{
|
{
|
||||||
|
GtkWidget *child;
|
||||||
|
|
||||||
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
||||||
if (GTK_IS_CONTAINER (widget))
|
for (child = gtk_widget_get_first_child (widget);
|
||||||
gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
|
child != NULL;
|
||||||
|
child = gtk_widget_get_next_sibling (child))
|
||||||
|
apply_css (child, provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkWidget *
|
static GtkWidget *
|
||||||
@@ -68,13 +72,13 @@ create_toolbar (void)
|
|||||||
gtk_widget_set_valign (toolbar, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign (toolbar, GTK_ALIGN_CENTER);
|
||||||
|
|
||||||
item = gtk_button_new_from_icon_name ("go-next");
|
item = gtk_button_new_from_icon_name ("go-next");
|
||||||
gtk_container_add (GTK_CONTAINER (toolbar), item);
|
gtk_box_append (GTK_BOX (toolbar), item);
|
||||||
|
|
||||||
item = gtk_button_new_from_icon_name ("go-previous");
|
item = gtk_button_new_from_icon_name ("go-previous");
|
||||||
gtk_container_add (GTK_CONTAINER (toolbar), item);
|
gtk_box_append (GTK_BOX (toolbar), item);
|
||||||
|
|
||||||
item = gtk_button_new_with_label ("Hello World");
|
item = gtk_button_new_with_label ("Hello World");
|
||||||
gtk_container_add (GTK_CONTAINER (toolbar), item);
|
gtk_box_append (GTK_BOX (toolbar), item);
|
||||||
|
|
||||||
return toolbar;
|
return toolbar;
|
||||||
}
|
}
|
||||||
@@ -95,14 +99,13 @@ do_css_shadows (GtkWidget *do_widget)
|
|||||||
gtk_window_set_title (GTK_WINDOW (window), "Shadows");
|
gtk_window_set_title (GTK_WINDOW (window), "Shadows");
|
||||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
|
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
|
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
|
||||||
gtk_window_set_child (GTK_WINDOW (window), paned);
|
gtk_window_set_child (GTK_WINDOW (window), paned);
|
||||||
|
|
||||||
child = create_toolbar ();
|
child = create_toolbar ();
|
||||||
gtk_container_add (GTK_CONTAINER (paned), child);
|
gtk_paned_set_start_child (GTK_PANED (paned), child);
|
||||||
|
|
||||||
text = gtk_text_buffer_new (NULL);
|
text = gtk_text_buffer_new (NULL);
|
||||||
gtk_text_buffer_create_tag (text,
|
gtk_text_buffer_create_tag (text,
|
||||||
@@ -116,10 +119,10 @@ do_css_shadows (GtkWidget *do_widget)
|
|||||||
|
|
||||||
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
||||||
|
|
||||||
container = gtk_scrolled_window_new (NULL, NULL);
|
container = gtk_scrolled_window_new ();
|
||||||
gtk_container_add (GTK_CONTAINER (paned), container);
|
gtk_paned_set_end_child (GTK_PANED (paned), container);
|
||||||
child = gtk_text_view_new_with_buffer (text);
|
child = gtk_text_view_new_with_buffer (text);
|
||||||
gtk_container_add (GTK_CONTAINER (container), child);
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (container), child);
|
||||||
g_signal_connect (text, "changed",
|
g_signal_connect (text, "changed",
|
||||||
G_CALLBACK (css_text_changed), provider);
|
G_CALLBACK (css_text_changed), provider);
|
||||||
|
|
||||||
@@ -138,7 +141,7 @@ do_css_shadows (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
/* Cursors
|
/* Cursors
|
||||||
*
|
*
|
||||||
* Demonstrates a useful set of available cursors. The cursors shown here are the ones
|
* Demonstrates a useful set of available cursors. The cursors shown here are the
|
||||||
* defined by CSS, which we assume to be available.
|
* ones defined by CSS, which we assume to be available. The example shows creating
|
||||||
*
|
* cursors by name or from an image, with or without a fallback.
|
||||||
* The example shows creating cursors by name or from an image, with or without a fallback.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
@@ -29,14 +28,14 @@ do_cursors (GtkWidget *do_widget)
|
|||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
g_signal_connect (window, "destroy",
|
g_signal_connect (window, "destroy",
|
||||||
G_CALLBACK (on_destroy), NULL);
|
G_CALLBACK (on_destroy), NULL);
|
||||||
g_object_set_data_full (G_OBJECT (window), "builder", builder, g_object_unref);
|
g_object_unref (builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
}
|
}
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<gresources>
|
<gresources>
|
||||||
|
<gresource prefix="/">
|
||||||
|
</gresource>
|
||||||
<gresource prefix="/ui">
|
<gresource prefix="/ui">
|
||||||
<file preprocess="xml-stripblanks">main.ui</file>
|
<file preprocess="xml-stripblanks">main.ui</file>
|
||||||
<file preprocess="xml-stripblanks">appmenu.ui</file>
|
<file preprocess="xml-stripblanks">main-listitem.ui</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
<gresource prefix="/application_demo">
|
<gresource prefix="/application_demo">
|
||||||
<file>application.c</file>
|
<file>application.c</file>
|
||||||
@@ -103,6 +105,9 @@
|
|||||||
<file>zoom_in_cursor.png</file>
|
<file>zoom_in_cursor.png</file>
|
||||||
<file>zoom_out_cursor.png</file>
|
<file>zoom_out_cursor.png</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
|
<gresource prefix="/dnd">
|
||||||
|
<file>dnd.css</file>
|
||||||
|
</gresource>
|
||||||
<gresource prefix="/fishbowl">
|
<gresource prefix="/fishbowl">
|
||||||
<file>fishbowl.ui</file>
|
<file>fishbowl.ui</file>
|
||||||
<file>gtkfishbowl.c</file>
|
<file>gtkfishbowl.c</file>
|
||||||
@@ -119,6 +124,23 @@
|
|||||||
<file>gnome-fs-directory.png</file>
|
<file>gnome-fs-directory.png</file>
|
||||||
<file>gnome-fs-regular.png</file>
|
<file>gnome-fs-regular.png</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
|
<gresource prefix="/listview_filebrowser">
|
||||||
|
<file>listview_filebrowser.ui</file>
|
||||||
|
<file>listview_filebrowser.css</file>
|
||||||
|
</gresource>
|
||||||
|
<gresource prefix="/listview_minesweeper">
|
||||||
|
<file>listview_minesweeper.ui</file>
|
||||||
|
<file>listview_minesweeper_cell.ui</file>
|
||||||
|
</gresource>
|
||||||
|
<gresource prefix="/listview_settings">
|
||||||
|
<file>listview_settings.ui</file>
|
||||||
|
</gresource>
|
||||||
|
<gresource prefix="/listview_weather">
|
||||||
|
<file compressed="true">listview_weather.txt</file>
|
||||||
|
</gresource>
|
||||||
|
<gresource prefix="/listview_colors">
|
||||||
|
<file compressed="true">color.names.txt</file>
|
||||||
|
</gresource>
|
||||||
<gresource prefix="/shortcuts">
|
<gresource prefix="/shortcuts">
|
||||||
<file>shortcuts.ui</file>
|
<file>shortcuts.ui</file>
|
||||||
<file>shortcuts-builder.ui</file>
|
<file>shortcuts-builder.ui</file>
|
||||||
@@ -171,6 +193,7 @@
|
|||||||
<file>cursors.c</file>
|
<file>cursors.c</file>
|
||||||
<file>dialog.c</file>
|
<file>dialog.c</file>
|
||||||
<file>drawingarea.c</file>
|
<file>drawingarea.c</file>
|
||||||
|
<file>dropdown.c</file>
|
||||||
<file>dnd.c</file>
|
<file>dnd.c</file>
|
||||||
<file>editable_cells.c</file>
|
<file>editable_cells.c</file>
|
||||||
<file>entry_completion.c</file>
|
<file>entry_completion.c</file>
|
||||||
@@ -195,6 +218,14 @@
|
|||||||
<file>infobar.c</file>
|
<file>infobar.c</file>
|
||||||
<file>links.c</file>
|
<file>links.c</file>
|
||||||
<file>listbox.c</file>
|
<file>listbox.c</file>
|
||||||
|
<file>listview_applauncher.c</file>
|
||||||
|
<file>listview_colors.c</file>
|
||||||
|
<file>listview_clocks.c</file>
|
||||||
|
<file>listview_filebrowser.c</file>
|
||||||
|
<file>listview_minesweeper.c</file>
|
||||||
|
<file>listview_settings.c</file>
|
||||||
|
<file>listview_weather.c</file>
|
||||||
|
<file>listview_words.c</file>
|
||||||
<file>list_store.c</file>
|
<file>list_store.c</file>
|
||||||
<file>markup.c</file>
|
<file>markup.c</file>
|
||||||
<file>modelbutton.c</file>
|
<file>modelbutton.c</file>
|
||||||
@@ -269,6 +300,7 @@
|
|||||||
</gresource>
|
</gresource>
|
||||||
<gresource prefix="/transparent">
|
<gresource prefix="/transparent">
|
||||||
<file>portland-rose.jpg</file>
|
<file>portland-rose.jpg</file>
|
||||||
|
<file>bluroverlay.h</file>
|
||||||
<file>bluroverlay.c</file>
|
<file>bluroverlay.c</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
<gresource prefix="/markup">
|
<gresource prefix="/markup">
|
||||||
|
|||||||
@@ -94,6 +94,7 @@
|
|||||||
<object class="GtkAboutDialog" id="aboutdialog1">
|
<object class="GtkAboutDialog" id="aboutdialog1">
|
||||||
<property name="program-name" translatable="yes">Builder demo</property>
|
<property name="program-name" translatable="yes">Builder demo</property>
|
||||||
<property name="logo-icon-name" translatable="yes">gtk3-demo</property>
|
<property name="logo-icon-name" translatable="yes">gtk3-demo</property>
|
||||||
|
<property name="modal">True</property>
|
||||||
<accessibility>
|
<accessibility>
|
||||||
<relation target="window1" type="subwindow-of"/>
|
<relation target="window1" type="subwindow-of"/>
|
||||||
</accessibility>
|
</accessibility>
|
||||||
|
|||||||
@@ -25,31 +25,36 @@
|
|||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <gtk/gtk-a11y.h>
|
#include <gtk/gtk-a11y.h>
|
||||||
|
|
||||||
typedef struct {
|
struct _DemoTaggedEntry
|
||||||
|
{
|
||||||
|
GtkWidget parent_instance;
|
||||||
|
|
||||||
GtkWidget *box;
|
GtkWidget *box;
|
||||||
GtkWidget *entry;
|
GtkWidget *entry;
|
||||||
} DemoTaggedEntryPrivate;
|
};
|
||||||
|
|
||||||
|
struct _DemoTaggedEntryClass
|
||||||
|
{
|
||||||
|
GtkWidgetClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
static void demo_tagged_entry_editable_init (GtkEditableInterface *iface);
|
static void demo_tagged_entry_editable_init (GtkEditableInterface *iface);
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_CODE (DemoTaggedEntry, demo_tagged_entry, GTK_TYPE_WIDGET,
|
G_DEFINE_TYPE_WITH_CODE (DemoTaggedEntry, demo_tagged_entry, GTK_TYPE_WIDGET,
|
||||||
G_ADD_PRIVATE (DemoTaggedEntry)
|
|
||||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE, demo_tagged_entry_editable_init))
|
G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE, demo_tagged_entry_editable_init))
|
||||||
|
|
||||||
static void
|
static void
|
||||||
demo_tagged_entry_init (DemoTaggedEntry *entry)
|
demo_tagged_entry_init (DemoTaggedEntry *entry)
|
||||||
{
|
{
|
||||||
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
|
entry->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
||||||
|
gtk_widget_set_parent (entry->box, GTK_WIDGET (entry));
|
||||||
|
|
||||||
priv->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
entry->entry = gtk_text_new ();
|
||||||
gtk_widget_set_parent (priv->box, GTK_WIDGET (entry));
|
gtk_widget_set_hexpand (entry->entry, TRUE);
|
||||||
|
gtk_widget_set_vexpand (entry->entry, TRUE);
|
||||||
priv->entry = gtk_text_new ();
|
gtk_widget_set_hexpand (entry->box, FALSE);
|
||||||
gtk_widget_set_hexpand (priv->entry, TRUE);
|
gtk_widget_set_vexpand (entry->box, FALSE);
|
||||||
gtk_widget_set_vexpand (priv->entry, TRUE);
|
gtk_box_append (GTK_BOX (entry->box), entry->entry);
|
||||||
gtk_widget_set_hexpand (priv->box, FALSE);
|
|
||||||
gtk_widget_set_vexpand (priv->box, FALSE);
|
|
||||||
gtk_container_add (GTK_CONTAINER (priv->box), priv->entry);
|
|
||||||
gtk_editable_init_delegate (GTK_EDITABLE (entry));
|
gtk_editable_init_delegate (GTK_EDITABLE (entry));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,23 +62,16 @@ static void
|
|||||||
demo_tagged_entry_dispose (GObject *object)
|
demo_tagged_entry_dispose (GObject *object)
|
||||||
{
|
{
|
||||||
DemoTaggedEntry *entry = DEMO_TAGGED_ENTRY (object);
|
DemoTaggedEntry *entry = DEMO_TAGGED_ENTRY (object);
|
||||||
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
|
|
||||||
|
|
||||||
if (priv->entry)
|
if (entry->entry)
|
||||||
gtk_editable_finish_delegate (GTK_EDITABLE (entry));
|
gtk_editable_finish_delegate (GTK_EDITABLE (entry));
|
||||||
|
|
||||||
g_clear_pointer (&priv->entry, gtk_widget_unparent);
|
g_clear_pointer (&entry->entry, gtk_widget_unparent);
|
||||||
g_clear_pointer (&priv->box, gtk_widget_unparent);
|
g_clear_pointer (&entry->box, gtk_widget_unparent);
|
||||||
|
|
||||||
G_OBJECT_CLASS (demo_tagged_entry_parent_class)->dispose (object);
|
G_OBJECT_CLASS (demo_tagged_entry_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
demo_tagged_entry_finalize (GObject *object)
|
|
||||||
{
|
|
||||||
G_OBJECT_CLASS (demo_tagged_entry_parent_class)->finalize (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
demo_tagged_entry_set_property (GObject *object,
|
demo_tagged_entry_set_property (GObject *object,
|
||||||
guint prop_id,
|
guint prop_id,
|
||||||
@@ -98,44 +96,12 @@ demo_tagged_entry_get_property (GObject *object,
|
|||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
demo_tagged_entry_measure (GtkWidget *widget,
|
|
||||||
GtkOrientation orientation,
|
|
||||||
int for_size,
|
|
||||||
int *minimum,
|
|
||||||
int *natural,
|
|
||||||
int *minimum_baseline,
|
|
||||||
int *natural_baseline)
|
|
||||||
{
|
|
||||||
DemoTaggedEntry *entry = DEMO_TAGGED_ENTRY (widget);
|
|
||||||
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
|
|
||||||
|
|
||||||
gtk_widget_measure (priv->box, orientation, for_size,
|
|
||||||
minimum, natural,
|
|
||||||
minimum_baseline, natural_baseline);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
demo_tagged_entry_size_allocate (GtkWidget *widget,
|
|
||||||
int width,
|
|
||||||
int height,
|
|
||||||
int baseline)
|
|
||||||
{
|
|
||||||
DemoTaggedEntry *entry = DEMO_TAGGED_ENTRY (widget);
|
|
||||||
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
|
|
||||||
|
|
||||||
gtk_widget_size_allocate (priv->box,
|
|
||||||
&(GtkAllocation) { 0, 0, width, height },
|
|
||||||
baseline);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
demo_tagged_entry_grab_focus (GtkWidget *widget)
|
demo_tagged_entry_grab_focus (GtkWidget *widget)
|
||||||
{
|
{
|
||||||
DemoTaggedEntry *entry = DEMO_TAGGED_ENTRY (widget);
|
DemoTaggedEntry *entry = DEMO_TAGGED_ENTRY (widget);
|
||||||
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
|
|
||||||
|
|
||||||
return gtk_widget_grab_focus (priv->entry);
|
return gtk_widget_grab_focus (entry->entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -145,16 +111,14 @@ demo_tagged_entry_class_init (DemoTaggedEntryClass *klass)
|
|||||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||||
|
|
||||||
object_class->dispose = demo_tagged_entry_dispose;
|
object_class->dispose = demo_tagged_entry_dispose;
|
||||||
object_class->finalize = demo_tagged_entry_finalize;
|
|
||||||
object_class->get_property = demo_tagged_entry_get_property;
|
object_class->get_property = demo_tagged_entry_get_property;
|
||||||
object_class->set_property = demo_tagged_entry_set_property;
|
object_class->set_property = demo_tagged_entry_set_property;
|
||||||
|
|
||||||
widget_class->measure = demo_tagged_entry_measure;
|
|
||||||
widget_class->size_allocate = demo_tagged_entry_size_allocate;
|
|
||||||
widget_class->grab_focus = demo_tagged_entry_grab_focus;
|
widget_class->grab_focus = demo_tagged_entry_grab_focus;
|
||||||
|
|
||||||
gtk_editable_install_properties (object_class, 1);
|
gtk_editable_install_properties (object_class, 1);
|
||||||
|
|
||||||
|
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
|
||||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_ENTRY_ACCESSIBLE);
|
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_ENTRY_ACCESSIBLE);
|
||||||
gtk_widget_class_set_css_name (widget_class, "entry");
|
gtk_widget_class_set_css_name (widget_class, "entry");
|
||||||
}
|
}
|
||||||
@@ -162,10 +126,7 @@ demo_tagged_entry_class_init (DemoTaggedEntryClass *klass)
|
|||||||
static GtkEditable *
|
static GtkEditable *
|
||||||
demo_tagged_entry_get_delegate (GtkEditable *editable)
|
demo_tagged_entry_get_delegate (GtkEditable *editable)
|
||||||
{
|
{
|
||||||
DemoTaggedEntry *entry = DEMO_TAGGED_ENTRY (editable);
|
return GTK_EDITABLE (DEMO_TAGGED_ENTRY (editable)->entry);
|
||||||
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
|
|
||||||
|
|
||||||
return GTK_EDITABLE (priv->entry);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -184,11 +145,9 @@ void
|
|||||||
demo_tagged_entry_add_tag (DemoTaggedEntry *entry,
|
demo_tagged_entry_add_tag (DemoTaggedEntry *entry,
|
||||||
GtkWidget *tag)
|
GtkWidget *tag)
|
||||||
{
|
{
|
||||||
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
|
|
||||||
|
|
||||||
g_return_if_fail (DEMO_IS_TAGGED_ENTRY (entry));
|
g_return_if_fail (DEMO_IS_TAGGED_ENTRY (entry));
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER (priv->box), tag);
|
gtk_box_append (GTK_BOX (entry->box), tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -196,30 +155,27 @@ demo_tagged_entry_insert_tag_after (DemoTaggedEntry *entry,
|
|||||||
GtkWidget *tag,
|
GtkWidget *tag,
|
||||||
GtkWidget *sibling)
|
GtkWidget *sibling)
|
||||||
{
|
{
|
||||||
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
|
|
||||||
|
|
||||||
g_return_if_fail (DEMO_IS_TAGGED_ENTRY (entry));
|
g_return_if_fail (DEMO_IS_TAGGED_ENTRY (entry));
|
||||||
|
|
||||||
if (sibling == NULL)
|
if (sibling == NULL)
|
||||||
gtk_container_add (GTK_CONTAINER (priv->box), tag);
|
gtk_box_append (GTK_BOX (entry->box), tag);
|
||||||
else
|
else
|
||||||
gtk_box_insert_child_after (GTK_BOX (priv->box), tag, sibling);
|
gtk_box_insert_child_after (GTK_BOX (entry->box), tag, sibling);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
demo_tagged_entry_remove_tag (DemoTaggedEntry *entry,
|
demo_tagged_entry_remove_tag (DemoTaggedEntry *entry,
|
||||||
GtkWidget *tag)
|
GtkWidget *tag)
|
||||||
{
|
{
|
||||||
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
|
|
||||||
|
|
||||||
g_return_if_fail (DEMO_IS_TAGGED_ENTRY (entry));
|
g_return_if_fail (DEMO_IS_TAGGED_ENTRY (entry));
|
||||||
|
|
||||||
gtk_container_remove (GTK_CONTAINER (priv->box), tag);
|
gtk_box_remove (GTK_BOX (entry->box), tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct _DemoTaggedEntryTag
|
struct _DemoTaggedEntryTag
|
||||||
{
|
{
|
||||||
GtkWidget parent;
|
GtkWidget parent;
|
||||||
|
|
||||||
GtkWidget *box;
|
GtkWidget *box;
|
||||||
GtkWidget *label;
|
GtkWidget *label;
|
||||||
GtkWidget *button;
|
GtkWidget *button;
|
||||||
@@ -268,7 +224,7 @@ demo_tagged_entry_tag_init (DemoTaggedEntryTag *tag)
|
|||||||
tag->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
tag->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
||||||
gtk_widget_set_parent (tag->box, GTK_WIDGET (tag));
|
gtk_widget_set_parent (tag->box, GTK_WIDGET (tag));
|
||||||
tag->label = gtk_label_new ("");
|
tag->label = gtk_label_new ("");
|
||||||
gtk_container_add (GTK_CONTAINER (tag->box), tag->label);
|
gtk_box_append (GTK_BOX (tag->box), tag->label);
|
||||||
|
|
||||||
gesture = gtk_gesture_click_new ();
|
gesture = gtk_gesture_click_new ();
|
||||||
g_signal_connect (gesture, "released", G_CALLBACK (on_released), tag);
|
g_signal_connect (gesture, "released", G_CALLBACK (on_released), tag);
|
||||||
@@ -460,7 +416,7 @@ demo_tagged_entry_tag_set_has_close_button (DemoTaggedEntryTag *tag,
|
|||||||
|
|
||||||
if (!has_close_button && tag->button)
|
if (!has_close_button && tag->button)
|
||||||
{
|
{
|
||||||
gtk_container_remove (GTK_CONTAINER (tag->box), tag->button);
|
gtk_box_remove (GTK_BOX (tag->box), tag->button);
|
||||||
tag->button = NULL;
|
tag->button = NULL;
|
||||||
}
|
}
|
||||||
else if (has_close_button && tag->button == NULL)
|
else if (has_close_button && tag->button == NULL)
|
||||||
@@ -469,11 +425,11 @@ demo_tagged_entry_tag_set_has_close_button (DemoTaggedEntryTag *tag,
|
|||||||
|
|
||||||
image = gtk_image_new_from_icon_name ("window-close-symbolic");
|
image = gtk_image_new_from_icon_name ("window-close-symbolic");
|
||||||
tag->button = gtk_button_new ();
|
tag->button = gtk_button_new ();
|
||||||
gtk_container_add (GTK_CONTAINER (tag->button), image);
|
gtk_button_set_child (GTK_BUTTON (tag->button), image);
|
||||||
gtk_widget_set_halign (tag->button, GTK_ALIGN_CENTER);
|
gtk_widget_set_halign (tag->button, GTK_ALIGN_CENTER);
|
||||||
gtk_widget_set_valign (tag->button, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign (tag->button, GTK_ALIGN_CENTER);
|
||||||
gtk_button_set_has_frame (GTK_BUTTON (tag->button), FALSE);
|
gtk_button_set_has_frame (GTK_BUTTON (tag->button), FALSE);
|
||||||
gtk_container_add (GTK_CONTAINER (tag->box), tag->button);
|
gtk_box_append (GTK_BOX (tag->box), tag->button);
|
||||||
g_signal_connect (tag->button, "clicked", G_CALLBACK (on_button_clicked), tag);
|
g_signal_connect (tag->button, "clicked", G_CALLBACK (on_button_clicked), tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,38 +26,10 @@
|
|||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define DEMO_TYPE_TAGGED_ENTRY (demo_tagged_entry_get_type ())
|
#define DEMO_TYPE_TAGGED_ENTRY (demo_tagged_entry_get_type ())
|
||||||
#define DEMO_TAGGED_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DEMO_TYPE_TAGGED_ENTRY, DemoTaggedEntry))
|
G_DECLARE_FINAL_TYPE (DemoTaggedEntry, demo_tagged_entry, DEMO, TAGGED_ENTRY, GtkWidget)
|
||||||
#define DEMO_TAGGED_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DEMO_TYPE_TAGGED_ENTRY, DemoTaggedEntryClass))
|
|
||||||
#define DEMO_IS_TAGGED_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DEMO_TYPE_TAGGED_ENTRY))
|
|
||||||
#define DEMO_IS_TAGGED_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DEMO_TYPE_TAGGED_ENTRY))
|
|
||||||
#define DEMO_TAGGED_ENTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DEMO_TYPE_TAGGED_ENTRY, DemoTaggedEntryClass))
|
|
||||||
|
|
||||||
typedef struct _DemoTaggedEntry DemoTaggedEntry;
|
|
||||||
typedef struct _DemoTaggedEntryClass DemoTaggedEntryClass;
|
|
||||||
|
|
||||||
struct _DemoTaggedEntry
|
|
||||||
{
|
|
||||||
GtkWidget parent;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _DemoTaggedEntryClass
|
|
||||||
{
|
|
||||||
GtkWidgetClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define DEMO_TYPE_TAGGED_ENTRY_TAG (demo_tagged_entry_tag_get_type ())
|
#define DEMO_TYPE_TAGGED_ENTRY_TAG (demo_tagged_entry_tag_get_type ())
|
||||||
#define DEMO_TAGGED_ENTRY_TAG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DEMO_TYPE_TAGGED_ENTRY_TAG, DemoTaggedEntryTag))
|
G_DECLARE_FINAL_TYPE (DemoTaggedEntryTag, demo_tagged_entry_tag, DEMO, TAGGED_ENTRY_TAG, GtkWidget)
|
||||||
#define DEMO_TAGGED_ENTRY_TAG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DEMO_TYPE_TAGGED_ENTRY_TAG, DemoTaggedEntryTag))
|
|
||||||
#define DEMO_IS_TAGGED_ENTRY_TAG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DEMO_TYPE_TAGGED_ENTRY_TAG))
|
|
||||||
#define DEMO_IS_TAGGED_ENTRY_TAG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DEMO_TYPE_TAGGED_ENTRY_TAG))
|
|
||||||
#define DEMO_TAGGED_ENTRY_TAG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DEMO_TYPE_TAGGED_ENTRY_TAG, DemoTaggedEntryTagClass))
|
|
||||||
|
|
||||||
typedef struct _DemoTaggedEntryTag DemoTaggedEntryTag;
|
|
||||||
typedef struct _DemoTaggedEntryTagClass DemoTaggedEntryTagClass;
|
|
||||||
|
|
||||||
|
|
||||||
GType demo_tagged_entry_get_type (void) G_GNUC_CONST;
|
|
||||||
GType demo_tagged_entry_tag_get_type (void) G_GNUC_CONST;
|
|
||||||
|
|
||||||
GtkWidget * demo_tagged_entry_new (void);
|
GtkWidget * demo_tagged_entry_new (void);
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/* Dialogs and Message Boxes
|
/* Dialogs
|
||||||
*
|
*
|
||||||
* Dialog widgets are used to pop up a transient window for user feedback.
|
* Dialogs are used to pop up transient windows for information
|
||||||
|
* and user feedback.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
@@ -21,51 +22,71 @@ message_dialog_clicked (GtkButton *button,
|
|||||||
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
|
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
|
||||||
GTK_MESSAGE_INFO,
|
GTK_MESSAGE_INFO,
|
||||||
GTK_BUTTONS_OK_CANCEL,
|
GTK_BUTTONS_OK_CANCEL,
|
||||||
"This message box has been popped up the following\n"
|
"Test message");
|
||||||
"number of times:");
|
|
||||||
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
|
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
|
||||||
"%d", i);
|
ngettext ("Has been shown once", "Has been shown %d times", i), i);
|
||||||
gtk_dialog_run (GTK_DIALOG (dialog));
|
g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
|
||||||
gtk_widget_destroy (dialog);
|
gtk_widget_show (dialog);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
GtkWidget *local_entry1;
|
||||||
|
GtkWidget *local_entry2;
|
||||||
|
GtkWidget *global_entry1;
|
||||||
|
GtkWidget *global_entry2;
|
||||||
|
} ResponseData;
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_dialog_response (GtkDialog *dialog,
|
||||||
|
int response,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
ResponseData *data = user_data;
|
||||||
|
|
||||||
|
if (response == GTK_RESPONSE_OK)
|
||||||
|
{
|
||||||
|
gtk_editable_set_text (GTK_EDITABLE (data->global_entry1),
|
||||||
|
gtk_editable_get_text (GTK_EDITABLE (data->local_entry1)));
|
||||||
|
gtk_editable_set_text (GTK_EDITABLE (data->global_entry2),
|
||||||
|
gtk_editable_get_text (GTK_EDITABLE (data->local_entry2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_window_destroy (GTK_WINDOW (dialog));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
interactive_dialog_clicked (GtkButton *button,
|
interactive_dialog_clicked (GtkButton *button,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GtkWidget *content_area;
|
GtkWidget *content_area;
|
||||||
GtkWidget *dialog;
|
GtkWidget *dialog;
|
||||||
GtkWidget *hbox;
|
|
||||||
GtkWidget *image;
|
|
||||||
GtkWidget *table;
|
GtkWidget *table;
|
||||||
GtkWidget *local_entry1;
|
GtkWidget *local_entry1;
|
||||||
GtkWidget *local_entry2;
|
GtkWidget *local_entry2;
|
||||||
GtkWidget *label;
|
GtkWidget *label;
|
||||||
gint response;
|
ResponseData *data;
|
||||||
|
|
||||||
dialog = gtk_dialog_new_with_buttons ("Interactive Dialog",
|
dialog = gtk_dialog_new_with_buttons ("Interactive Dialog",
|
||||||
GTK_WINDOW (window),
|
GTK_WINDOW (window),
|
||||||
GTK_DIALOG_MODAL| GTK_DIALOG_DESTROY_WITH_PARENT,
|
GTK_DIALOG_MODAL| GTK_DIALOG_DESTROY_WITH_PARENT|GTK_DIALOG_USE_HEADER_BAR,
|
||||||
_("_OK"),
|
_("_OK"), GTK_RESPONSE_OK,
|
||||||
GTK_RESPONSE_OK,
|
_("_Cancel"), GTK_RESPONSE_CANCEL,
|
||||||
"_Cancel",
|
|
||||||
GTK_RESPONSE_CANCEL,
|
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
|
||||||
|
|
||||||
content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
|
content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
|
||||||
|
|
||||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
|
|
||||||
gtk_container_add (GTK_CONTAINER (content_area), hbox);
|
|
||||||
|
|
||||||
image = gtk_image_new_from_icon_name ("dialog-question");
|
|
||||||
gtk_image_set_icon_size (GTK_IMAGE (image), GTK_ICON_SIZE_LARGE);
|
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), image);
|
|
||||||
|
|
||||||
table = gtk_grid_new ();
|
table = gtk_grid_new ();
|
||||||
gtk_grid_set_row_spacing (GTK_GRID (table), 4);
|
gtk_widget_set_hexpand (table, TRUE);
|
||||||
gtk_grid_set_column_spacing (GTK_GRID (table), 4);
|
gtk_widget_set_vexpand (table, TRUE);
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), table);
|
gtk_widget_set_halign (table, GTK_ALIGN_CENTER);
|
||||||
|
gtk_widget_set_valign (table, GTK_ALIGN_CENTER);
|
||||||
|
gtk_box_append (GTK_BOX (content_area), table);
|
||||||
|
gtk_grid_set_row_spacing (GTK_GRID (table), 6);
|
||||||
|
gtk_grid_set_column_spacing (GTK_GRID (table), 6);
|
||||||
|
|
||||||
label = gtk_label_new_with_mnemonic ("_Entry 1");
|
label = gtk_label_new_with_mnemonic ("_Entry 1");
|
||||||
gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1);
|
gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1);
|
||||||
local_entry1 = gtk_entry_new ();
|
local_entry1 = gtk_entry_new ();
|
||||||
@@ -81,21 +102,23 @@ interactive_dialog_clicked (GtkButton *button,
|
|||||||
gtk_grid_attach (GTK_GRID (table), local_entry2, 1, 1, 1, 1);
|
gtk_grid_attach (GTK_GRID (table), local_entry2, 1, 1, 1, 1);
|
||||||
gtk_label_set_mnemonic_widget (GTK_LABEL (label), local_entry2);
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), local_entry2);
|
||||||
|
|
||||||
response = gtk_dialog_run (GTK_DIALOG (dialog));
|
data = g_new (ResponseData, 1);
|
||||||
|
data->local_entry1 = local_entry1;
|
||||||
|
data->local_entry2 = local_entry2;
|
||||||
|
data->global_entry1 = entry1;
|
||||||
|
data->global_entry2 = entry2;
|
||||||
|
|
||||||
if (response == GTK_RESPONSE_OK)
|
g_signal_connect_data (dialog, "response",
|
||||||
{
|
G_CALLBACK (on_dialog_response),
|
||||||
gtk_editable_set_text (GTK_EDITABLE (entry1), gtk_editable_get_text (GTK_EDITABLE (local_entry1)));
|
data, (GClosureNotify) g_free,
|
||||||
gtk_editable_set_text (GTK_EDITABLE (entry2), gtk_editable_get_text (GTK_EDITABLE (local_entry2)));
|
0);
|
||||||
}
|
|
||||||
|
|
||||||
gtk_widget_destroy (dialog);
|
gtk_widget_show (dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkWidget *
|
GtkWidget *
|
||||||
do_dialog (GtkWidget *do_widget)
|
do_dialog (GtkWidget *do_widget)
|
||||||
{
|
{
|
||||||
GtkWidget *frame;
|
|
||||||
GtkWidget *vbox;
|
GtkWidget *vbox;
|
||||||
GtkWidget *vbox2;
|
GtkWidget *vbox2;
|
||||||
GtkWidget *hbox;
|
GtkWidget *hbox;
|
||||||
@@ -108,50 +131,42 @@ do_dialog (GtkWidget *do_widget)
|
|||||||
window = gtk_window_new ();
|
window = gtk_window_new ();
|
||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Dialogs and Message Boxes");
|
gtk_window_set_title (GTK_WINDOW (window), "Dialogs");
|
||||||
|
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
frame = gtk_frame_new ("Dialogs");
|
|
||||||
gtk_widget_set_margin_start (frame, 8);
|
|
||||||
gtk_widget_set_margin_end (frame, 8);
|
|
||||||
gtk_widget_set_margin_top (frame, 8);
|
|
||||||
gtk_widget_set_margin_bottom (frame, 8);
|
|
||||||
gtk_window_set_child (GTK_WINDOW (window), frame);
|
|
||||||
|
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
|
||||||
gtk_widget_set_margin_start (vbox, 8);
|
gtk_widget_set_margin_start (vbox, 8);
|
||||||
gtk_widget_set_margin_end (vbox, 8);
|
gtk_widget_set_margin_end (vbox, 8);
|
||||||
gtk_widget_set_margin_top (vbox, 8);
|
gtk_widget_set_margin_top (vbox, 8);
|
||||||
gtk_widget_set_margin_bottom (vbox, 8);
|
gtk_widget_set_margin_bottom (vbox, 8);
|
||||||
gtk_frame_set_child (GTK_FRAME (frame), vbox);
|
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
||||||
|
|
||||||
/* Standard message dialog */
|
/* Standard message dialog */
|
||||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
|
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), hbox);
|
gtk_box_append (GTK_BOX (vbox), hbox);
|
||||||
button = gtk_button_new_with_mnemonic ("_Message Dialog");
|
button = gtk_button_new_with_mnemonic ("_Message Dialog");
|
||||||
g_signal_connect (button, "clicked",
|
g_signal_connect (button, "clicked",
|
||||||
G_CALLBACK (message_dialog_clicked), NULL);
|
G_CALLBACK (message_dialog_clicked), NULL);
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), button);
|
gtk_box_append (GTK_BOX (hbox), button);
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL));
|
gtk_box_append (GTK_BOX (vbox), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL));
|
||||||
|
|
||||||
/* Interactive dialog*/
|
/* Interactive dialog*/
|
||||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
|
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), hbox);
|
gtk_box_append (GTK_BOX (vbox), hbox);
|
||||||
vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
|
|
||||||
button = gtk_button_new_with_mnemonic ("_Interactive Dialog");
|
button = gtk_button_new_with_mnemonic ("_Interactive Dialog");
|
||||||
g_signal_connect (button, "clicked",
|
g_signal_connect (button, "clicked",
|
||||||
G_CALLBACK (interactive_dialog_clicked), NULL);
|
G_CALLBACK (interactive_dialog_clicked), NULL);
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), vbox2);
|
gtk_box_append (GTK_BOX (hbox), vbox2);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox2), button);
|
gtk_box_append (GTK_BOX (vbox2), button);
|
||||||
|
|
||||||
table = gtk_grid_new ();
|
table = gtk_grid_new ();
|
||||||
gtk_grid_set_row_spacing (GTK_GRID (table), 4);
|
gtk_grid_set_row_spacing (GTK_GRID (table), 4);
|
||||||
gtk_grid_set_column_spacing (GTK_GRID (table), 4);
|
gtk_grid_set_column_spacing (GTK_GRID (table), 4);
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), table);
|
gtk_box_append (GTK_BOX (hbox), table);
|
||||||
|
|
||||||
label = gtk_label_new_with_mnemonic ("_Entry 1");
|
label = gtk_label_new_with_mnemonic ("_Entry 1");
|
||||||
gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1);
|
gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1);
|
||||||
@@ -170,7 +185,7 @@ do_dialog (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,324 @@
|
|||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
G_DECLARE_FINAL_TYPE (CanvasItem, canvas_item, CANVAS, ITEM, GtkWidget)
|
||||||
|
|
||||||
|
struct _CanvasItem {
|
||||||
|
GtkWidget parent;
|
||||||
|
|
||||||
|
GtkWidget *fixed;
|
||||||
|
GtkWidget *label;
|
||||||
|
|
||||||
|
double r;
|
||||||
|
double angle;
|
||||||
|
double delta;
|
||||||
|
|
||||||
|
GtkWidget *editor;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _CanvasItemClass {
|
||||||
|
GtkWidgetClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (CanvasItem, canvas_item, GTK_TYPE_WIDGET)
|
||||||
|
|
||||||
|
static int n_items = 0;
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_color (CanvasItem *item,
|
||||||
|
GdkRGBA *color)
|
||||||
|
{
|
||||||
|
char *css;
|
||||||
|
char *str;
|
||||||
|
GtkStyleContext *context;
|
||||||
|
GtkCssProvider *provider;
|
||||||
|
const char *old_class;
|
||||||
|
|
||||||
|
str = gdk_rgba_to_string (color);
|
||||||
|
css = g_strdup_printf ("* { background: %s; }", str);
|
||||||
|
|
||||||
|
context = gtk_widget_get_style_context (item->label);
|
||||||
|
provider = g_object_get_data (G_OBJECT (context), "style-provider");
|
||||||
|
if (provider)
|
||||||
|
gtk_style_context_remove_provider (context, GTK_STYLE_PROVIDER (provider));
|
||||||
|
|
||||||
|
old_class = (const char *)g_object_get_data (G_OBJECT (item->label), "css-class");
|
||||||
|
if (old_class)
|
||||||
|
gtk_widget_remove_css_class (item->label, old_class);
|
||||||
|
|
||||||
|
provider = gtk_css_provider_new ();
|
||||||
|
gtk_css_provider_load_from_data (provider, css, -1);
|
||||||
|
gtk_style_context_add_provider (gtk_widget_get_style_context (item->label), GTK_STYLE_PROVIDER (provider), 800);
|
||||||
|
g_object_set_data_full (G_OBJECT (context), "style-provider", provider, g_object_unref);
|
||||||
|
|
||||||
|
g_free (str);
|
||||||
|
g_free (css);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_css (CanvasItem *item,
|
||||||
|
const char *class)
|
||||||
|
{
|
||||||
|
GtkStyleContext *context;
|
||||||
|
GtkCssProvider *provider;
|
||||||
|
const char *old_class;
|
||||||
|
|
||||||
|
context = gtk_widget_get_style_context (item->label);
|
||||||
|
provider = g_object_get_data (G_OBJECT (context), "style-provider");
|
||||||
|
if (provider)
|
||||||
|
gtk_style_context_remove_provider (context, GTK_STYLE_PROVIDER (provider));
|
||||||
|
|
||||||
|
old_class = (const char *)g_object_get_data (G_OBJECT (item->label), "css-class");
|
||||||
|
if (old_class)
|
||||||
|
gtk_widget_remove_css_class (item->label, old_class);
|
||||||
|
|
||||||
|
g_object_set_data_full (G_OBJECT (item->label), "css-class", g_strdup (class), g_free);
|
||||||
|
gtk_widget_add_css_class (item->label, class);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
item_drag_drop (GtkDropTarget *dest,
|
||||||
|
const GValue *value,
|
||||||
|
double x,
|
||||||
|
double y)
|
||||||
|
{
|
||||||
|
GtkWidget *label = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (dest));
|
||||||
|
CanvasItem *item = CANVAS_ITEM (gtk_widget_get_parent (gtk_widget_get_parent (label)));
|
||||||
|
|
||||||
|
if (G_VALUE_TYPE (value) == GDK_TYPE_RGBA)
|
||||||
|
set_color (item, g_value_get_boxed (value));
|
||||||
|
else if (G_VALUE_TYPE (value) == G_TYPE_STRING)
|
||||||
|
set_css (item, g_value_get_string (value));
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
apply_transform (CanvasItem *item)
|
||||||
|
{
|
||||||
|
GskTransform *transform;
|
||||||
|
double x, y;
|
||||||
|
|
||||||
|
x = gtk_widget_get_allocated_width (item->label) / 2.0;
|
||||||
|
y = gtk_widget_get_allocated_height (item->label) / 2.0;
|
||||||
|
item->r = sqrt (x*x + y*y);
|
||||||
|
|
||||||
|
transform = gsk_transform_translate (
|
||||||
|
gsk_transform_rotate (
|
||||||
|
gsk_transform_translate (NULL,
|
||||||
|
&(graphene_point_t) { item->r, item->r }),
|
||||||
|
item->angle + item->delta),
|
||||||
|
&(graphene_point_t) { - x, - y });
|
||||||
|
|
||||||
|
gtk_fixed_set_child_transform (GTK_FIXED (item->fixed), item->label, transform);
|
||||||
|
gsk_transform_unref (transform);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
angle_changed (GtkGestureRotate *gesture,
|
||||||
|
double angle,
|
||||||
|
double delta)
|
||||||
|
{
|
||||||
|
CanvasItem *item = CANVAS_ITEM (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)));
|
||||||
|
|
||||||
|
item->delta = angle / M_PI * 180.0;
|
||||||
|
|
||||||
|
apply_transform (item);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
rotate_done (GtkGesture *gesture)
|
||||||
|
{
|
||||||
|
CanvasItem *item = CANVAS_ITEM (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)));
|
||||||
|
|
||||||
|
item->angle = item->angle + item->delta;
|
||||||
|
item->delta = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
click_done (GtkGesture *gesture)
|
||||||
|
{
|
||||||
|
GtkWidget *item = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
|
||||||
|
GtkWidget *canvas = gtk_widget_get_parent (item);
|
||||||
|
GtkWidget *last_child;
|
||||||
|
|
||||||
|
last_child = gtk_widget_get_last_child (canvas);
|
||||||
|
if (item != last_child)
|
||||||
|
gtk_widget_insert_after (item, canvas, last_child);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
canvas_item_init (CanvasItem *item)
|
||||||
|
{
|
||||||
|
char *text;
|
||||||
|
char *id;
|
||||||
|
GdkRGBA rgba;
|
||||||
|
GtkDropTarget *dest;
|
||||||
|
GtkGesture *gesture;
|
||||||
|
GType types[2] = { GDK_TYPE_RGBA, G_TYPE_STRING };
|
||||||
|
|
||||||
|
n_items++;
|
||||||
|
|
||||||
|
text = g_strdup_printf ("Item %d", n_items);
|
||||||
|
item->label = gtk_label_new (text);
|
||||||
|
gtk_widget_add_css_class (item->label, "canvasitem");
|
||||||
|
g_free (text);
|
||||||
|
|
||||||
|
item->fixed = gtk_fixed_new ();
|
||||||
|
gtk_widget_set_parent (item->fixed, GTK_WIDGET (item));
|
||||||
|
gtk_fixed_put (GTK_FIXED (item->fixed), item->label, 0, 0);
|
||||||
|
|
||||||
|
gtk_widget_add_css_class (item->label, "frame");
|
||||||
|
|
||||||
|
id = g_strdup_printf ("item%d", n_items);
|
||||||
|
gtk_widget_set_name (item->label, id);
|
||||||
|
g_free (id);
|
||||||
|
|
||||||
|
gdk_rgba_parse (&rgba, "yellow");
|
||||||
|
set_color (item, &rgba);
|
||||||
|
|
||||||
|
item->angle = 0;
|
||||||
|
|
||||||
|
dest = gtk_drop_target_new (G_TYPE_INVALID, GDK_ACTION_COPY);
|
||||||
|
gtk_drop_target_set_gtypes (dest, types, G_N_ELEMENTS (types));
|
||||||
|
g_signal_connect (dest, "drop", G_CALLBACK (item_drag_drop), NULL);
|
||||||
|
gtk_widget_add_controller (GTK_WIDGET (item->label), GTK_EVENT_CONTROLLER (dest));
|
||||||
|
|
||||||
|
gesture = gtk_gesture_rotate_new ();
|
||||||
|
g_signal_connect (gesture, "angle-changed", G_CALLBACK (angle_changed), NULL);
|
||||||
|
g_signal_connect (gesture, "end", G_CALLBACK (rotate_done), NULL);
|
||||||
|
gtk_widget_add_controller (GTK_WIDGET (item), GTK_EVENT_CONTROLLER (gesture));
|
||||||
|
|
||||||
|
gesture = gtk_gesture_click_new ();
|
||||||
|
g_signal_connect (gesture, "released", G_CALLBACK (click_done), NULL);
|
||||||
|
gtk_widget_add_controller (GTK_WIDGET (item), GTK_EVENT_CONTROLLER (gesture));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
canvas_item_dispose (GObject *object)
|
||||||
|
{
|
||||||
|
CanvasItem *item = CANVAS_ITEM (object);
|
||||||
|
|
||||||
|
g_clear_pointer (&item->fixed, gtk_widget_unparent);
|
||||||
|
g_clear_pointer (&item->editor, gtk_widget_unparent);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (canvas_item_parent_class)->dispose (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
canvas_item_map (GtkWidget *widget)
|
||||||
|
{
|
||||||
|
CanvasItem *item = CANVAS_ITEM (widget);
|
||||||
|
|
||||||
|
GTK_WIDGET_CLASS (canvas_item_parent_class)->map (widget);
|
||||||
|
|
||||||
|
apply_transform (item);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
canvas_item_class_init (CanvasItemClass *class)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||||
|
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
|
||||||
|
|
||||||
|
object_class->dispose = canvas_item_dispose;
|
||||||
|
|
||||||
|
widget_class->map = canvas_item_map;
|
||||||
|
|
||||||
|
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
|
||||||
|
gtk_widget_class_set_css_name (widget_class, "item");
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget *
|
||||||
|
canvas_item_new (void)
|
||||||
|
{
|
||||||
|
CanvasItem *item = g_object_new (canvas_item_get_type (), NULL);
|
||||||
|
|
||||||
|
return GTK_WIDGET (item);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GdkPaintable *
|
||||||
|
canvas_item_get_drag_icon (CanvasItem *item)
|
||||||
|
{
|
||||||
|
return gtk_widget_paintable_new (item->fixed);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
canvas_item_is_editing (CanvasItem *item)
|
||||||
|
{
|
||||||
|
return item->editor != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
scale_changed (GtkRange *range,
|
||||||
|
CanvasItem *item)
|
||||||
|
{
|
||||||
|
item->angle = gtk_range_get_value (range);
|
||||||
|
apply_transform (item);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
text_changed (GtkEditable *editable,
|
||||||
|
GParamSpec *pspec,
|
||||||
|
CanvasItem *item)
|
||||||
|
{
|
||||||
|
gtk_label_set_text (GTK_LABEL (item->label), gtk_editable_get_text (editable));
|
||||||
|
apply_transform (item);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
canvas_item_stop_editing (CanvasItem *item)
|
||||||
|
{
|
||||||
|
GtkWidget *scale;
|
||||||
|
|
||||||
|
if (!item->editor)
|
||||||
|
return;
|
||||||
|
|
||||||
|
scale = gtk_widget_get_last_child (item->editor);
|
||||||
|
g_signal_handlers_disconnect_by_func (scale, scale_changed, item);
|
||||||
|
|
||||||
|
gtk_fixed_remove (GTK_FIXED (gtk_widget_get_parent (item->editor)), item->editor);
|
||||||
|
item->editor = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
canvas_item_start_editing (CanvasItem *item)
|
||||||
|
{
|
||||||
|
GtkWidget *canvas = gtk_widget_get_parent (GTK_WIDGET (item));
|
||||||
|
GtkWidget *entry;
|
||||||
|
GtkWidget *scale;
|
||||||
|
double x, y;
|
||||||
|
|
||||||
|
if (item->editor)
|
||||||
|
return;
|
||||||
|
|
||||||
|
item->editor = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
|
||||||
|
|
||||||
|
entry = gtk_entry_new ();
|
||||||
|
|
||||||
|
gtk_editable_set_text (GTK_EDITABLE (entry),
|
||||||
|
gtk_label_get_text (GTK_LABEL (item->label)));
|
||||||
|
|
||||||
|
gtk_editable_set_width_chars (GTK_EDITABLE (entry), 12);
|
||||||
|
g_signal_connect (entry, "notify::text", G_CALLBACK (text_changed), item);
|
||||||
|
g_signal_connect_swapped (entry, "activate", G_CALLBACK (canvas_item_stop_editing), item);
|
||||||
|
|
||||||
|
gtk_box_append (GTK_BOX (item->editor), entry);
|
||||||
|
|
||||||
|
scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 360, 1);
|
||||||
|
gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
|
||||||
|
gtk_range_set_value (GTK_RANGE (scale), fmod (item->angle, 360));
|
||||||
|
|
||||||
|
g_signal_connect (scale, "value-changed", G_CALLBACK (scale_changed), item);
|
||||||
|
|
||||||
|
gtk_box_append (GTK_BOX (item->editor), scale);
|
||||||
|
|
||||||
|
gtk_widget_translate_coordinates (GTK_WIDGET (item), canvas, 0, 0, &x, &y);
|
||||||
|
gtk_fixed_put (GTK_FIXED (canvas), item->editor, x, y + 2 * item->r);
|
||||||
|
gtk_widget_grab_focus (entry);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static GdkContentProvider *
|
static GdkContentProvider *
|
||||||
prepare (GtkDragSource *source,
|
prepare (GtkDragSource *source,
|
||||||
double x,
|
double x,
|
||||||
@@ -18,7 +336,8 @@ prepare (GtkDragSource *source,
|
|||||||
canvas = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source));
|
canvas = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source));
|
||||||
item = gtk_widget_pick (canvas, x, y, GTK_PICK_DEFAULT);
|
item = gtk_widget_pick (canvas, x, y, GTK_PICK_DEFAULT);
|
||||||
|
|
||||||
if (!GTK_IS_LABEL (item))
|
item = gtk_widget_get_ancestor (item, canvas_item_get_type ());
|
||||||
|
if (!item)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
g_object_set_data (G_OBJECT (canvas), "dragged-item", item);
|
g_object_set_data (G_OBJECT (canvas), "dragged-item", item);
|
||||||
@@ -31,12 +350,17 @@ drag_begin (GtkDragSource *source,
|
|||||||
GdkDrag *drag)
|
GdkDrag *drag)
|
||||||
{
|
{
|
||||||
GtkWidget *canvas;
|
GtkWidget *canvas;
|
||||||
GtkWidget *item;
|
CanvasItem *item;
|
||||||
|
GdkPaintable *paintable;
|
||||||
|
|
||||||
canvas = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source));
|
canvas = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source));
|
||||||
item = g_object_get_data (G_OBJECT (canvas), "dragged-item");
|
item = CANVAS_ITEM (g_object_get_data (G_OBJECT (canvas), "dragged-item"));
|
||||||
|
|
||||||
gtk_widget_set_opacity (item, 0.5);
|
paintable = canvas_item_get_drag_icon (item);
|
||||||
|
gtk_drag_source_set_icon (source, paintable, item->r, item->r);
|
||||||
|
g_object_unref (paintable);
|
||||||
|
|
||||||
|
gtk_widget_set_opacity (GTK_WIDGET (item), 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -53,32 +377,12 @@ drag_end (GtkDragSource *source,
|
|||||||
gtk_widget_set_opacity (item, 1.0);
|
gtk_widget_set_opacity (item, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
drag_cancel (GtkDragSource *source,
|
drag_cancel (GtkDragSource *source,
|
||||||
GdkDrag *drag,
|
GdkDrag *drag,
|
||||||
GdkDragCancelReason reason)
|
GdkDragCancelReason reason)
|
||||||
{
|
{
|
||||||
drag_end (source, drag);
|
return FALSE;
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
double x, y;
|
|
||||||
double angle;
|
|
||||||
double delta;
|
|
||||||
} TransformData;
|
|
||||||
|
|
||||||
static void
|
|
||||||
apply_transform (GtkWidget *item)
|
|
||||||
{
|
|
||||||
GtkWidget *canvas = gtk_widget_get_parent (item);
|
|
||||||
TransformData *data;
|
|
||||||
GskTransform *transform;
|
|
||||||
|
|
||||||
data = g_object_get_data (G_OBJECT (item), "transform-data");
|
|
||||||
transform = gsk_transform_rotate (gsk_transform_translate (NULL, &(graphene_point_t){data->x, data->y}),
|
|
||||||
data->angle + data->delta);
|
|
||||||
gtk_fixed_set_child_transform (GTK_FIXED (canvas), item, transform);
|
|
||||||
gsk_transform_unref (transform);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -87,90 +391,58 @@ drag_drop (GtkDropTarget *target,
|
|||||||
double x,
|
double x,
|
||||||
double y)
|
double y)
|
||||||
{
|
{
|
||||||
GtkWidget *item;
|
CanvasItem *item;
|
||||||
TransformData *transform_data;
|
|
||||||
GtkWidget *canvas;
|
GtkWidget *canvas;
|
||||||
GtkWidget *last_child;
|
GtkWidget *last_child;
|
||||||
|
|
||||||
item = g_value_get_object (value);
|
item = g_value_get_object (value);
|
||||||
transform_data = g_object_get_data (G_OBJECT (item), "transform-data");
|
|
||||||
|
|
||||||
transform_data->x = x;
|
canvas = gtk_widget_get_parent (GTK_WIDGET (item));
|
||||||
transform_data->y = y;
|
|
||||||
|
|
||||||
canvas = gtk_widget_get_parent (item);
|
|
||||||
last_child = gtk_widget_get_last_child (canvas);
|
last_child = gtk_widget_get_last_child (canvas);
|
||||||
if (item != last_child)
|
if (GTK_WIDGET (item) != last_child)
|
||||||
gtk_widget_insert_after (item, canvas, last_child);
|
gtk_widget_insert_after (GTK_WIDGET (item), canvas, last_child);
|
||||||
|
|
||||||
apply_transform (item);
|
gtk_fixed_move (GTK_FIXED (canvas), GTK_WIDGET (item), x - item->r, y - item->r);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static double pos_x, pos_y;
|
|
||||||
|
|
||||||
static GtkWidget * canvas_item_new (double x, double y);
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
new_item_cb (GtkWidget *button, gpointer data)
|
new_item_cb (GtkWidget *button, gpointer data)
|
||||||
{
|
{
|
||||||
GtkWidget *canvas = data;
|
GtkWidget *canvas = data;
|
||||||
|
GtkWidget *popover;
|
||||||
GtkWidget *item;
|
GtkWidget *item;
|
||||||
|
GdkRectangle rect;
|
||||||
|
|
||||||
item = canvas_item_new (pos_x, pos_y);
|
popover = gtk_widget_get_ancestor (button, GTK_TYPE_POPOVER);
|
||||||
gtk_container_add (GTK_CONTAINER (canvas), item);
|
gtk_popover_get_pointing_to (GTK_POPOVER (popover), &rect);
|
||||||
apply_transform (item);
|
|
||||||
|
item = canvas_item_new ();
|
||||||
|
gtk_fixed_put (GTK_FIXED (canvas), item, rect.x, rect.y);
|
||||||
|
apply_transform (CANVAS_ITEM (item));
|
||||||
|
|
||||||
gtk_popover_popdown (GTK_POPOVER (gtk_widget_get_ancestor (button, GTK_TYPE_POPOVER)));
|
gtk_popover_popdown (GTK_POPOVER (gtk_widget_get_ancestor (button, GTK_TYPE_POPOVER)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
edit_label_done (GtkWidget *entry, gpointer data)
|
|
||||||
{
|
|
||||||
GtkWidget *canvas = gtk_widget_get_parent (entry);
|
|
||||||
GtkWidget *label;
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
gtk_fixed_get_child_position (GTK_FIXED (canvas), entry, &x, &y);
|
|
||||||
|
|
||||||
label = GTK_WIDGET (g_object_get_data (G_OBJECT (entry), "label"));
|
|
||||||
gtk_label_set_text (GTK_LABEL (label), gtk_editable_get_text (GTK_EDITABLE (entry)));
|
|
||||||
gtk_widget_show (label);
|
|
||||||
|
|
||||||
gtk_widget_destroy (entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
edit_cb (GtkWidget *button, GtkWidget *child)
|
edit_cb (GtkWidget *button, GtkWidget *child)
|
||||||
{
|
{
|
||||||
GtkWidget *canvas = gtk_widget_get_parent (child);
|
CanvasItem *item = CANVAS_ITEM (child);
|
||||||
int x, y;
|
|
||||||
|
|
||||||
gtk_fixed_get_child_position (GTK_FIXED (canvas), child, &x, &y);
|
|
||||||
|
|
||||||
if (GTK_IS_LABEL (child))
|
|
||||||
{
|
|
||||||
GtkWidget *entry = gtk_entry_new ();
|
|
||||||
|
|
||||||
g_object_set_data (G_OBJECT (entry), "label", child);
|
|
||||||
|
|
||||||
gtk_editable_set_text (GTK_EDITABLE (entry), gtk_label_get_text (GTK_LABEL (child)));
|
|
||||||
gtk_editable_set_width_chars (GTK_EDITABLE (entry), 12);
|
|
||||||
g_signal_connect (entry, "activate", G_CALLBACK (edit_label_done), NULL);
|
|
||||||
gtk_fixed_put (GTK_FIXED (canvas), entry, x, y);
|
|
||||||
gtk_widget_grab_focus (entry);
|
|
||||||
gtk_widget_hide (child);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (button)
|
if (button)
|
||||||
gtk_popover_popdown (GTK_POPOVER (gtk_widget_get_ancestor (button, GTK_TYPE_POPOVER)));
|
gtk_popover_popdown (GTK_POPOVER (gtk_widget_get_ancestor (button, GTK_TYPE_POPOVER)));
|
||||||
|
|
||||||
|
if (!canvas_item_is_editing (item))
|
||||||
|
canvas_item_start_editing (item);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
delete_cb (GtkWidget *button, GtkWidget *child)
|
delete_cb (GtkWidget *button, GtkWidget *child)
|
||||||
{
|
{
|
||||||
gtk_widget_destroy (child);
|
GtkWidget *canvas = gtk_widget_get_parent (child);
|
||||||
|
|
||||||
|
gtk_fixed_remove (GTK_FIXED (canvas), child);
|
||||||
|
|
||||||
gtk_popover_popdown (GTK_POPOVER (gtk_widget_get_ancestor (button, GTK_TYPE_POPOVER)));
|
gtk_popover_popdown (GTK_POPOVER (gtk_widget_get_ancestor (button, GTK_TYPE_POPOVER)));
|
||||||
}
|
}
|
||||||
@@ -187,6 +459,7 @@ pressed_cb (GtkGesture *gesture,
|
|||||||
|
|
||||||
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
|
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
|
||||||
child = gtk_widget_pick (widget, x, y, GTK_PICK_DEFAULT);
|
child = gtk_widget_pick (widget, x, y, GTK_PICK_DEFAULT);
|
||||||
|
child = gtk_widget_get_ancestor (child, canvas_item_get_type ());
|
||||||
|
|
||||||
if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_SECONDARY)
|
if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_SECONDARY)
|
||||||
{
|
{
|
||||||
@@ -194,38 +467,35 @@ pressed_cb (GtkGesture *gesture,
|
|||||||
GtkWidget *box;
|
GtkWidget *box;
|
||||||
GtkWidget *item;
|
GtkWidget *item;
|
||||||
|
|
||||||
pos_x = x;
|
|
||||||
pos_y = y;
|
|
||||||
|
|
||||||
menu = gtk_popover_new ();
|
menu = gtk_popover_new ();
|
||||||
gtk_widget_set_parent (menu, widget);
|
gtk_widget_set_parent (menu, widget);
|
||||||
gtk_popover_set_has_arrow (GTK_POPOVER (menu), FALSE);
|
gtk_popover_set_has_arrow (GTK_POPOVER (menu), FALSE);
|
||||||
gtk_popover_set_pointing_to (GTK_POPOVER (menu), &(GdkRectangle){ x, y, 1, 1});
|
gtk_popover_set_pointing_to (GTK_POPOVER (menu), &(GdkRectangle){ x, y, 1, 1});
|
||||||
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
gtk_container_add (GTK_CONTAINER (menu), box);
|
gtk_popover_set_child (GTK_POPOVER (menu), box);
|
||||||
|
|
||||||
item = gtk_button_new_with_label ("New");
|
item = gtk_button_new_with_label ("New");
|
||||||
gtk_button_set_has_frame (GTK_BUTTON (item), FALSE);
|
gtk_button_set_has_frame (GTK_BUTTON (item), FALSE);
|
||||||
g_signal_connect (item, "clicked", G_CALLBACK (new_item_cb), widget);
|
g_signal_connect (item, "clicked", G_CALLBACK (new_item_cb), widget);
|
||||||
gtk_container_add (GTK_CONTAINER (box), item);
|
gtk_box_append (GTK_BOX (box), item);
|
||||||
|
|
||||||
item = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
|
item = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
|
||||||
gtk_container_add (GTK_CONTAINER (box), item);
|
gtk_box_append (GTK_BOX (box), item);
|
||||||
|
|
||||||
item = gtk_button_new_with_label ("Edit");
|
item = gtk_button_new_with_label ("Edit");
|
||||||
gtk_button_set_has_frame (GTK_BUTTON (item), FALSE);
|
gtk_button_set_has_frame (GTK_BUTTON (item), FALSE);
|
||||||
gtk_widget_set_sensitive (item, child != NULL && child != widget);
|
gtk_widget_set_sensitive (item, child != NULL && child != widget);
|
||||||
g_signal_connect (item, "clicked", G_CALLBACK (edit_cb), child);
|
g_signal_connect (item, "clicked", G_CALLBACK (edit_cb), child);
|
||||||
gtk_container_add (GTK_CONTAINER (box), item);
|
gtk_box_append (GTK_BOX (box), item);
|
||||||
|
|
||||||
item = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
|
item = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
|
||||||
gtk_container_add (GTK_CONTAINER (box), item);
|
gtk_box_append (GTK_BOX (box), item);
|
||||||
|
|
||||||
item = gtk_button_new_with_label ("Delete");
|
item = gtk_button_new_with_label ("Delete");
|
||||||
gtk_button_set_has_frame (GTK_BUTTON (item), FALSE);
|
gtk_button_set_has_frame (GTK_BUTTON (item), FALSE);
|
||||||
gtk_widget_set_sensitive (item, child != NULL && child != widget);
|
gtk_widget_set_sensitive (item, child != NULL && child != widget);
|
||||||
g_signal_connect (item, "clicked", G_CALLBACK (delete_cb), child);
|
g_signal_connect (item, "clicked", G_CALLBACK (delete_cb), child);
|
||||||
gtk_container_add (GTK_CONTAINER (box), item);
|
gtk_box_append (GTK_BOX (box), item);
|
||||||
|
|
||||||
gtk_popover_popup (GTK_POPOVER (menu));
|
gtk_popover_popup (GTK_POPOVER (menu));
|
||||||
}
|
}
|
||||||
@@ -240,14 +510,20 @@ released_cb (GtkGesture *gesture,
|
|||||||
{
|
{
|
||||||
GtkWidget *widget;
|
GtkWidget *widget;
|
||||||
GtkWidget *child;
|
GtkWidget *child;
|
||||||
|
CanvasItem *item;
|
||||||
|
|
||||||
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
|
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
|
||||||
child = gtk_widget_pick (widget, x, y, 0);
|
child = gtk_widget_pick (widget, x, y, 0);
|
||||||
|
item = (CanvasItem *)gtk_widget_get_ancestor (child, canvas_item_get_type ());
|
||||||
|
if (!item)
|
||||||
|
return;
|
||||||
|
|
||||||
if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_PRIMARY)
|
if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_PRIMARY)
|
||||||
{
|
{
|
||||||
if (child != NULL && child != widget)
|
if (canvas_item_is_editing (item))
|
||||||
edit_cb (NULL, child);
|
canvas_item_stop_editing (item);
|
||||||
|
else
|
||||||
|
canvas_item_start_editing (item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -285,129 +561,40 @@ canvas_new (void)
|
|||||||
return canvas;
|
return canvas;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static GdkContentProvider *
|
||||||
set_color (GtkWidget *item,
|
css_drag_prepare (GtkDragSource *source,
|
||||||
GdkRGBA *color)
|
|
||||||
{
|
|
||||||
char *css;
|
|
||||||
char *str;
|
|
||||||
GtkStyleContext *context;
|
|
||||||
GtkCssProvider *provider;
|
|
||||||
|
|
||||||
str = gdk_rgba_to_string (color);
|
|
||||||
css = g_strdup_printf ("* { background: %s; padding: 10px; }", str);
|
|
||||||
|
|
||||||
context = gtk_widget_get_style_context (item);
|
|
||||||
provider = g_object_get_data (G_OBJECT (context), "style-provider");
|
|
||||||
if (provider)
|
|
||||||
gtk_style_context_remove_provider (context, GTK_STYLE_PROVIDER (provider));
|
|
||||||
|
|
||||||
provider = gtk_css_provider_new ();
|
|
||||||
gtk_css_provider_load_from_data (provider, css, -1);
|
|
||||||
gtk_style_context_add_provider (gtk_widget_get_style_context (item), GTK_STYLE_PROVIDER (provider), 800);
|
|
||||||
g_object_set_data_full (G_OBJECT (context), "style-provider", provider, g_object_unref);
|
|
||||||
|
|
||||||
g_free (str);
|
|
||||||
g_free (css);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
item_drag_drop (GtkDropTarget *dest,
|
|
||||||
const GValue *value,
|
|
||||||
double x,
|
double x,
|
||||||
double y)
|
double y,
|
||||||
|
GtkWidget *button)
|
||||||
{
|
{
|
||||||
GtkWidget *item = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (dest));
|
const char *class;
|
||||||
|
GdkPaintable *paintable;
|
||||||
|
|
||||||
set_color (item, g_value_get_boxed (value));
|
class = (const char *)g_object_get_data (G_OBJECT (button), "css-class");
|
||||||
|
|
||||||
return TRUE;
|
paintable = gtk_widget_paintable_new (button);
|
||||||
|
gtk_drag_source_set_icon (source, paintable, 0, 0);
|
||||||
|
g_object_unref (paintable);
|
||||||
|
|
||||||
|
return gdk_content_provider_new_typed (G_TYPE_STRING, class);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
angle_changed (GtkGestureRotate *gesture,
|
|
||||||
double angle,
|
|
||||||
double delta)
|
|
||||||
{
|
|
||||||
GtkWidget *item = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
|
|
||||||
TransformData *data = g_object_get_data (G_OBJECT (item), "transform-data");
|
|
||||||
|
|
||||||
data->delta = angle / M_PI * 180.0;
|
|
||||||
|
|
||||||
apply_transform (item);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
rotate_done (GtkGesture *gesture)
|
|
||||||
{
|
|
||||||
GtkWidget *item = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
|
|
||||||
TransformData *data = g_object_get_data (G_OBJECT (item), "transform-data");
|
|
||||||
|
|
||||||
data->angle = data->angle + data->delta;
|
|
||||||
data->delta = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
click_done (GtkGesture *gesture)
|
|
||||||
{
|
|
||||||
GtkWidget *item = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
|
|
||||||
GtkWidget *canvas = gtk_widget_get_parent (item);
|
|
||||||
GtkWidget *last_child;
|
|
||||||
|
|
||||||
last_child = gtk_widget_get_last_child (canvas);
|
|
||||||
if (item != last_child)
|
|
||||||
gtk_widget_insert_after (item, canvas, last_child);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int n_items = 0;
|
|
||||||
|
|
||||||
static GtkWidget *
|
static GtkWidget *
|
||||||
canvas_item_new (double x,
|
css_button_new (const char *class)
|
||||||
double y)
|
|
||||||
{
|
{
|
||||||
GtkWidget *widget;
|
GtkWidget *button;
|
||||||
char *label;
|
GtkDragSource *source;
|
||||||
char *id;
|
|
||||||
TransformData *transform_data;
|
|
||||||
GdkRGBA rgba;
|
|
||||||
GtkDropTarget *dest;
|
|
||||||
GtkGesture *gesture;
|
|
||||||
|
|
||||||
n_items++;
|
button = gtk_image_new ();
|
||||||
|
gtk_widget_set_size_request (button, 48, 32);
|
||||||
|
gtk_widget_add_css_class (button, class);
|
||||||
|
g_object_set_data (G_OBJECT (button), "css-class", (gpointer)class);
|
||||||
|
|
||||||
label = g_strdup_printf ("Item %d", n_items);
|
source = gtk_drag_source_new ();
|
||||||
id = g_strdup_printf ("item%d", n_items);
|
g_signal_connect (source, "prepare", G_CALLBACK (css_drag_prepare), button);
|
||||||
|
gtk_widget_add_controller (button, GTK_EVENT_CONTROLLER (source));
|
||||||
|
|
||||||
gdk_rgba_parse (&rgba, "yellow");
|
return button;
|
||||||
|
|
||||||
widget = gtk_label_new (label);
|
|
||||||
gtk_widget_add_css_class (widget, "frame");
|
|
||||||
gtk_widget_set_name (widget, id);
|
|
||||||
|
|
||||||
set_color (widget, &rgba);
|
|
||||||
transform_data = g_new0 (TransformData, 1);
|
|
||||||
transform_data->x = x;
|
|
||||||
transform_data->y = y;
|
|
||||||
transform_data->angle = 0.0;
|
|
||||||
g_object_set_data_full (G_OBJECT (widget), "transform-data", transform_data, g_free);
|
|
||||||
|
|
||||||
g_free (label);
|
|
||||||
g_free (id);
|
|
||||||
|
|
||||||
dest = gtk_drop_target_new (GDK_TYPE_RGBA, GDK_ACTION_COPY);
|
|
||||||
g_signal_connect (dest, "drop", G_CALLBACK (item_drag_drop), NULL);
|
|
||||||
gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (dest));
|
|
||||||
|
|
||||||
gesture = gtk_gesture_rotate_new ();
|
|
||||||
g_signal_connect (gesture, "angle-changed", G_CALLBACK (angle_changed), NULL);
|
|
||||||
g_signal_connect (gesture, "end", G_CALLBACK (rotate_done), NULL);
|
|
||||||
gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture));
|
|
||||||
|
|
||||||
gesture = gtk_gesture_click_new ();
|
|
||||||
g_signal_connect (gesture, "released", G_CALLBACK (click_done), NULL);
|
|
||||||
gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture));
|
|
||||||
|
|
||||||
return widget;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkWidget *window = NULL;
|
static GtkWidget *window = NULL;
|
||||||
@@ -417,9 +604,9 @@ do_dnd (GtkWidget *do_widget)
|
|||||||
{
|
{
|
||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
|
GtkWidget *button;
|
||||||
GtkWidget *sw;
|
GtkWidget *sw;
|
||||||
GtkWidget *canvas;
|
GtkWidget *canvas;
|
||||||
GtkWidget *widget;
|
|
||||||
GtkWidget *box, *box2, *box3;
|
GtkWidget *box, *box2, *box3;
|
||||||
const char *colors[] = {
|
const char *colors[] = {
|
||||||
"red", "green", "blue", "magenta", "orange", "gray", "black", "yellow",
|
"red", "green", "blue", "magenta", "orange", "gray", "black", "yellow",
|
||||||
@@ -429,27 +616,33 @@ do_dnd (GtkWidget *do_widget)
|
|||||||
};
|
};
|
||||||
int i;
|
int i;
|
||||||
int x, y;
|
int x, y;
|
||||||
|
GtkCssProvider *provider;
|
||||||
|
|
||||||
widget = gtk_color_button_new ();
|
button = gtk_color_button_new ();
|
||||||
gtk_widget_destroy (widget);
|
g_object_unref (g_object_ref_sink (button));
|
||||||
|
|
||||||
|
provider = gtk_css_provider_new ();
|
||||||
|
gtk_css_provider_load_from_resource (provider, "/dnd/dnd.css");
|
||||||
|
gtk_style_context_add_provider_for_display (gdk_display_get_default (),
|
||||||
|
GTK_STYLE_PROVIDER (provider),
|
||||||
|
800);
|
||||||
|
g_object_unref (provider);
|
||||||
|
|
||||||
window = gtk_window_new ();
|
window = gtk_window_new ();
|
||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Drag-and-Drop");
|
gtk_window_set_title (GTK_WINDOW (window), "Drag-and-Drop");
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);
|
gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
g_signal_connect (window, "destroy",
|
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
gtk_window_set_child (GTK_WINDOW (window), box);
|
gtk_window_set_child (GTK_WINDOW (window), box);
|
||||||
|
|
||||||
box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
||||||
gtk_container_add (GTK_CONTAINER (box), box2);
|
gtk_box_append (GTK_BOX (box), box2);
|
||||||
|
|
||||||
canvas = canvas_new ();
|
canvas = canvas_new ();
|
||||||
gtk_container_add (GTK_CONTAINER (box2), canvas);
|
gtk_box_append (GTK_BOX (box2), canvas);
|
||||||
|
|
||||||
n_items = 0;
|
n_items = 0;
|
||||||
|
|
||||||
@@ -458,19 +651,19 @@ do_dnd (GtkWidget *do_widget)
|
|||||||
{
|
{
|
||||||
GtkWidget *item;
|
GtkWidget *item;
|
||||||
|
|
||||||
item = canvas_item_new (x, y);
|
item = canvas_item_new ();
|
||||||
gtk_container_add (GTK_CONTAINER (canvas), item);
|
gtk_fixed_put (GTK_FIXED (canvas), item, x, y);
|
||||||
apply_transform (item);
|
apply_transform (CANVAS_ITEM (item));
|
||||||
|
|
||||||
x += 150;
|
x += 150;
|
||||||
y += 100;
|
y += 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
sw = gtk_scrolled_window_new (NULL, NULL);
|
sw = gtk_scrolled_window_new ();
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
||||||
GTK_POLICY_AUTOMATIC,
|
GTK_POLICY_AUTOMATIC,
|
||||||
GTK_POLICY_NEVER);
|
GTK_POLICY_NEVER);
|
||||||
gtk_container_add (GTK_CONTAINER (box), sw);
|
gtk_box_append (GTK_BOX (box), sw);
|
||||||
|
|
||||||
box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
||||||
gtk_widget_add_css_class (box3, "linked");
|
gtk_widget_add_css_class (box3, "linked");
|
||||||
@@ -487,14 +680,18 @@ do_dnd (GtkWidget *do_widget)
|
|||||||
"rgba", &rgba,
|
"rgba", &rgba,
|
||||||
"selectable", FALSE,
|
"selectable", FALSE,
|
||||||
NULL);
|
NULL);
|
||||||
gtk_container_add (GTK_CONTAINER (box3), swatch);
|
gtk_box_append (GTK_BOX (box3), swatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gtk_box_append (GTK_BOX (box3), css_button_new ("rainbow1"));
|
||||||
|
gtk_box_append (GTK_BOX (box3), css_button_new ("rainbow2"));
|
||||||
|
gtk_box_append (GTK_BOX (box3), css_button_new ("rainbow3"));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
37
demos/gtk-demo/dnd.css
Normal file
37
demos/gtk-demo/dnd.css
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
label.canvasitem {
|
||||||
|
padding: 10px;
|
||||||
|
margin: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.canvasitem.rainbow1,
|
||||||
|
image.rainbow1 {
|
||||||
|
background: linear-gradient(140deg,red,orange,yellow,green,blue,purple);
|
||||||
|
}
|
||||||
|
|
||||||
|
.canvasitem.rainbow2,
|
||||||
|
image.rainbow2 {
|
||||||
|
animation: rainbow2 1s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rainbow2 {
|
||||||
|
0% { background: linear-gradient(0deg,red,orange,yellow,green,blue,purple); }
|
||||||
|
25% { background: linear-gradient(90deg,red,orange,yellow,green,blue,purple); }
|
||||||
|
50% { background: linear-gradient(180deg,red,orange,yellow,green,blue,purple); }
|
||||||
|
75% { background: linear-gradient(270deg,red,orange,yellow,green,blue,purple); }
|
||||||
|
100% { background: linear-gradient(360deg,red,orange,yellow,green,blue,purple); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.canvasitem.rainbow3,
|
||||||
|
image.rainbow3 {
|
||||||
|
animation: rainbow3 1s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rainbow3 {
|
||||||
|
0% { background: linear-gradient(140deg,red,orange,yellow,green,blue,purple); }
|
||||||
|
16.6% { background: linear-gradient(140deg,purple,red,orange,yellow,green,blue); }
|
||||||
|
33.2% { background: linear-gradient(140deg,blue,purple,red,orange,yellow,green); }
|
||||||
|
50% { background: linear-gradient(140deg,green,blue,purple,red,orange,yellow); }
|
||||||
|
66.6% { background: linear-gradient(140deg,yellow,green,blue,purple,red,orange); }
|
||||||
|
83.2% { background: linear-gradient(140deg,orange,yellow,green,blue,purple,red); }
|
||||||
|
100% { background: linear-gradient(140deg,red,orange,yellow,green,blue,purple); }
|
||||||
|
}
|
||||||
@@ -125,49 +125,164 @@ drag_end (GtkGestureDrag *gesture,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
checkerboard_draw (GtkDrawingArea *da,
|
oval_path (cairo_t *cr,
|
||||||
|
double xc, double yc,
|
||||||
|
double xr, double yr)
|
||||||
|
{
|
||||||
|
cairo_save (cr);
|
||||||
|
|
||||||
|
cairo_translate (cr, xc, yc);
|
||||||
|
cairo_scale (cr, 1.0, yr / xr);
|
||||||
|
cairo_move_to (cr, xr, 0.0);
|
||||||
|
cairo_arc (cr,
|
||||||
|
0, 0,
|
||||||
|
xr,
|
||||||
|
0, 2 * G_PI);
|
||||||
|
cairo_close_path (cr);
|
||||||
|
|
||||||
|
cairo_restore (cr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fill the given area with checks in the standard style
|
||||||
|
* for showing compositing effects.
|
||||||
|
*
|
||||||
|
* It would make sense to do this as a repeating surface,
|
||||||
|
* but most implementations of RENDER currently have broken
|
||||||
|
* implementations of repeat + transform, even when the
|
||||||
|
* transform is a translation.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
fill_checks (cairo_t *cr,
|
||||||
|
int x, int y,
|
||||||
|
int width, int height)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
#define CHECK_SIZE 16
|
||||||
|
|
||||||
|
cairo_rectangle (cr, x, y, width, height);
|
||||||
|
cairo_set_source_rgb (cr, 0.4, 0.4, 0.4);
|
||||||
|
cairo_fill (cr);
|
||||||
|
|
||||||
|
/* Only works for CHECK_SIZE a power of 2 */
|
||||||
|
j = x & (-CHECK_SIZE);
|
||||||
|
|
||||||
|
for (; j < height; j += CHECK_SIZE)
|
||||||
|
{
|
||||||
|
i = y & (-CHECK_SIZE);
|
||||||
|
for (; i < width; i += CHECK_SIZE)
|
||||||
|
if ((i / CHECK_SIZE + j / CHECK_SIZE) % 2 == 0)
|
||||||
|
cairo_rectangle (cr, i, j, CHECK_SIZE, CHECK_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
cairo_set_source_rgb (cr, 0.7, 0.7, 0.7);
|
||||||
|
cairo_fill (cr);
|
||||||
|
|
||||||
|
#undef CHECK_SIZE
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Draw a red, green, and blue circle equally spaced inside
|
||||||
|
* the larger circle of radius r at (xc, yc)
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
draw_3circles (cairo_t *cr,
|
||||||
|
double xc, double yc,
|
||||||
|
double radius,
|
||||||
|
double alpha)
|
||||||
|
{
|
||||||
|
double subradius = radius * (2 / 3. - 0.1);
|
||||||
|
|
||||||
|
cairo_set_source_rgba (cr, 1., 0., 0., alpha);
|
||||||
|
oval_path (cr,
|
||||||
|
xc + radius / 3. * cos (G_PI * (0.5)),
|
||||||
|
yc - radius / 3. * sin (G_PI * (0.5)),
|
||||||
|
subradius, subradius);
|
||||||
|
cairo_fill (cr);
|
||||||
|
|
||||||
|
cairo_set_source_rgba (cr, 0., 1., 0., alpha);
|
||||||
|
oval_path (cr,
|
||||||
|
xc + radius / 3. * cos (G_PI * (0.5 + 2/.3)),
|
||||||
|
yc - radius / 3. * sin (G_PI * (0.5 + 2/.3)),
|
||||||
|
subradius, subradius);
|
||||||
|
cairo_fill (cr);
|
||||||
|
|
||||||
|
cairo_set_source_rgba (cr, 0., 0., 1., alpha);
|
||||||
|
oval_path (cr,
|
||||||
|
xc + radius / 3. * cos (G_PI * (0.5 + 4/.3)),
|
||||||
|
yc - radius / 3. * sin (G_PI * (0.5 + 4/.3)),
|
||||||
|
subradius, subradius);
|
||||||
|
cairo_fill (cr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
groups_draw (GtkDrawingArea *darea,
|
||||||
cairo_t *cr,
|
cairo_t *cr,
|
||||||
int width,
|
int width,
|
||||||
int height,
|
int height,
|
||||||
gpointer data)
|
gpointer data)
|
||||||
{
|
{
|
||||||
gint i, j, xcount, ycount;
|
cairo_surface_t *overlay, *punch, *circles;
|
||||||
|
cairo_t *overlay_cr, *punch_cr, *circles_cr;
|
||||||
|
|
||||||
#define CHECK_SIZE 10
|
/* Fill the background */
|
||||||
#define SPACING 2
|
double radius = 0.5 * (width < height ? width : height) - 10;
|
||||||
|
double xc = width / 2.;
|
||||||
|
double yc = height / 2.;
|
||||||
|
|
||||||
/* At the start of a draw handler, a clip region has been set on
|
overlay = cairo_surface_create_similar (cairo_get_target (cr),
|
||||||
* the Cairo context, and the contents have been cleared to the
|
CAIRO_CONTENT_COLOR_ALPHA,
|
||||||
* widget's background color. The docs for
|
width, height);
|
||||||
* gdk_surface_begin_paint_region() give more details on how this
|
|
||||||
* works.
|
punch = cairo_surface_create_similar (cairo_get_target (cr),
|
||||||
|
CAIRO_CONTENT_ALPHA,
|
||||||
|
width, height);
|
||||||
|
|
||||||
|
circles = cairo_surface_create_similar (cairo_get_target (cr),
|
||||||
|
CAIRO_CONTENT_COLOR_ALPHA,
|
||||||
|
width, height);
|
||||||
|
|
||||||
|
fill_checks (cr, 0, 0, width, height);
|
||||||
|
|
||||||
|
/* Draw a black circle on the overlay
|
||||||
*/
|
*/
|
||||||
|
overlay_cr = cairo_create (overlay);
|
||||||
|
cairo_set_source_rgb (overlay_cr, 0., 0., 0.);
|
||||||
|
oval_path (overlay_cr, xc, yc, radius, radius);
|
||||||
|
cairo_fill (overlay_cr);
|
||||||
|
|
||||||
xcount = 0;
|
/* Draw 3 circles to the punch surface, then cut
|
||||||
i = SPACING;
|
* that out of the main circle in the overlay
|
||||||
while (i < width)
|
|
||||||
{
|
|
||||||
j = SPACING;
|
|
||||||
ycount = xcount % 2; /* start with even/odd depending on row */
|
|
||||||
while (j < height)
|
|
||||||
{
|
|
||||||
if (ycount % 2)
|
|
||||||
cairo_set_source_rgb (cr, 0.45777, 0, 0.45777);
|
|
||||||
else
|
|
||||||
cairo_set_source_rgb (cr, 1, 1, 1);
|
|
||||||
|
|
||||||
/* If we're outside the clip, this will do nothing.
|
|
||||||
*/
|
*/
|
||||||
cairo_rectangle (cr, i, j, CHECK_SIZE, CHECK_SIZE);
|
punch_cr = cairo_create (punch);
|
||||||
cairo_fill (cr);
|
draw_3circles (punch_cr, xc, yc, radius, 1.0);
|
||||||
|
cairo_destroy (punch_cr);
|
||||||
|
|
||||||
j += CHECK_SIZE + SPACING;
|
cairo_set_operator (overlay_cr, CAIRO_OPERATOR_DEST_OUT);
|
||||||
++ycount;
|
cairo_set_source_surface (overlay_cr, punch, 0, 0);
|
||||||
}
|
cairo_paint (overlay_cr);
|
||||||
|
|
||||||
i += CHECK_SIZE + SPACING;
|
/* Now draw the 3 circles in a subgroup again
|
||||||
++xcount;
|
* at half intensity, and use OperatorAdd to join up
|
||||||
}
|
* without seams.
|
||||||
|
*/
|
||||||
|
circles_cr = cairo_create (circles);
|
||||||
|
|
||||||
|
cairo_set_operator (circles_cr, CAIRO_OPERATOR_OVER);
|
||||||
|
draw_3circles (circles_cr, xc, yc, radius, 0.5);
|
||||||
|
cairo_destroy (circles_cr);
|
||||||
|
|
||||||
|
cairo_set_operator (overlay_cr, CAIRO_OPERATOR_ADD);
|
||||||
|
cairo_set_source_surface (overlay_cr, circles, 0, 0);
|
||||||
|
cairo_paint (overlay_cr);
|
||||||
|
|
||||||
|
cairo_destroy (overlay_cr);
|
||||||
|
|
||||||
|
cairo_set_source_surface (cr, overlay, 0, 0);
|
||||||
|
cairo_paint (cr);
|
||||||
|
|
||||||
|
cairo_surface_destroy (overlay);
|
||||||
|
cairo_surface_destroy (punch);
|
||||||
|
cairo_surface_destroy (circles);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -207,22 +322,21 @@ do_drawingarea (GtkWidget *do_widget)
|
|||||||
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the checkerboard area
|
* Create the groups area
|
||||||
*/
|
*/
|
||||||
|
|
||||||
label = gtk_label_new (NULL);
|
label = gtk_label_new (NULL);
|
||||||
gtk_label_set_markup (GTK_LABEL (label),
|
gtk_label_set_markup (GTK_LABEL (label),
|
||||||
"<u>Checkerboard pattern</u>");
|
"<u>Knockout groups</u>");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
frame = gtk_frame_new (NULL);
|
frame = gtk_frame_new (NULL);
|
||||||
gtk_widget_set_vexpand (frame, TRUE);
|
gtk_widget_set_vexpand (frame, TRUE);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), frame);
|
gtk_box_append (GTK_BOX (vbox), frame);
|
||||||
|
|
||||||
da = gtk_drawing_area_new ();
|
da = gtk_drawing_area_new ();
|
||||||
gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100);
|
gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100);
|
||||||
gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (da), 100);
|
gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (da), 100);
|
||||||
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), checkerboard_draw, NULL, NULL);
|
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), groups_draw, NULL, NULL);
|
||||||
gtk_frame_set_child (GTK_FRAME (frame), da);
|
gtk_frame_set_child (GTK_FRAME (frame), da);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -232,11 +346,11 @@ do_drawingarea (GtkWidget *do_widget)
|
|||||||
label = gtk_label_new (NULL);
|
label = gtk_label_new (NULL);
|
||||||
gtk_label_set_markup (GTK_LABEL (label),
|
gtk_label_set_markup (GTK_LABEL (label),
|
||||||
"<u>Scribble area</u>");
|
"<u>Scribble area</u>");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
frame = gtk_frame_new (NULL);
|
frame = gtk_frame_new (NULL);
|
||||||
gtk_widget_set_vexpand (frame, TRUE);
|
gtk_widget_set_vexpand (frame, TRUE);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), frame);
|
gtk_box_append (GTK_BOX (vbox), frame);
|
||||||
|
|
||||||
da = gtk_drawing_area_new ();
|
da = gtk_drawing_area_new ();
|
||||||
gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100);
|
gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100);
|
||||||
@@ -260,7 +374,7 @@ do_drawingarea (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
305
demos/gtk-demo/dropdown.c
Normal file
305
demos/gtk-demo/dropdown.c
Normal file
@@ -0,0 +1,305 @@
|
|||||||
|
/* Drop Downs
|
||||||
|
*
|
||||||
|
* The GtkDropDown widget is a modern alternative to GtkComboBox.
|
||||||
|
* It uses list models instead of tree models, and the content is
|
||||||
|
* displayed using widgets instead of cell renderers.
|
||||||
|
*
|
||||||
|
* The examples here demonstrate how to use different kinds of
|
||||||
|
* list models with GtkDropDown, how to use search and how to
|
||||||
|
* display the selected item differently from the presentation
|
||||||
|
* in the popup.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define STRING_TYPE_HOLDER (string_holder_get_type ())
|
||||||
|
G_DECLARE_FINAL_TYPE (StringHolder, string_holder, STRING, HOLDER, GObject)
|
||||||
|
|
||||||
|
struct _StringHolder {
|
||||||
|
GObject parent_instance;
|
||||||
|
char *title;
|
||||||
|
char *icon;
|
||||||
|
char *description;
|
||||||
|
};
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (StringHolder, string_holder, G_TYPE_OBJECT);
|
||||||
|
|
||||||
|
static void
|
||||||
|
string_holder_init (StringHolder *holder)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
string_holder_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
StringHolder *holder = STRING_HOLDER (object);
|
||||||
|
|
||||||
|
g_free (holder->title);
|
||||||
|
g_free (holder->icon);
|
||||||
|
g_free (holder->description);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (string_holder_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
string_holder_class_init (StringHolderClass *class)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||||
|
|
||||||
|
object_class->finalize = string_holder_finalize;
|
||||||
|
}
|
||||||
|
|
||||||
|
static StringHolder *
|
||||||
|
string_holder_new (const char *title, const char *icon, const char *description)
|
||||||
|
{
|
||||||
|
StringHolder *holder = g_object_new (STRING_TYPE_HOLDER, NULL);
|
||||||
|
holder->title = g_strdup (title);
|
||||||
|
holder->icon = g_strdup (icon);
|
||||||
|
holder->description = g_strdup (description);
|
||||||
|
return holder;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
strings_setup_item_single_line (GtkSignalListItemFactory *factory,
|
||||||
|
GtkListItem *item)
|
||||||
|
{
|
||||||
|
GtkWidget *box, *image, *title;
|
||||||
|
|
||||||
|
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
|
||||||
|
|
||||||
|
image = gtk_image_new ();
|
||||||
|
title = gtk_label_new ("");
|
||||||
|
gtk_label_set_xalign (GTK_LABEL (title), 0.0);
|
||||||
|
|
||||||
|
gtk_box_append (GTK_BOX (box), image);
|
||||||
|
gtk_box_append (GTK_BOX (box), title);
|
||||||
|
|
||||||
|
g_object_set_data (G_OBJECT (item), "title", title);
|
||||||
|
g_object_set_data (G_OBJECT (item), "image", image);
|
||||||
|
|
||||||
|
gtk_list_item_set_child (item, box);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
strings_setup_item_full (GtkSignalListItemFactory *factory,
|
||||||
|
GtkListItem *item)
|
||||||
|
{
|
||||||
|
GtkWidget *box, *box2, *image, *title, *description;
|
||||||
|
|
||||||
|
image = gtk_image_new ();
|
||||||
|
title = gtk_label_new ("");
|
||||||
|
gtk_label_set_xalign (GTK_LABEL (title), 0.0);
|
||||||
|
description = gtk_label_new ("");
|
||||||
|
gtk_label_set_xalign (GTK_LABEL (description), 0.0);
|
||||||
|
gtk_style_context_add_class (gtk_widget_get_style_context (description), "dim-label");
|
||||||
|
|
||||||
|
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
|
||||||
|
box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
|
||||||
|
|
||||||
|
gtk_box_append (GTK_BOX (box), image);
|
||||||
|
gtk_box_append (GTK_BOX (box), box2);
|
||||||
|
gtk_box_append (GTK_BOX (box2), title);
|
||||||
|
gtk_box_append (GTK_BOX (box2), description);
|
||||||
|
|
||||||
|
g_object_set_data (G_OBJECT (item), "title", title);
|
||||||
|
g_object_set_data (G_OBJECT (item), "image", image);
|
||||||
|
g_object_set_data (G_OBJECT (item), "description", description);
|
||||||
|
|
||||||
|
gtk_list_item_set_child (item, box);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
strings_bind_item (GtkSignalListItemFactory *factory,
|
||||||
|
GtkListItem *item)
|
||||||
|
{
|
||||||
|
GtkWidget *image, *title, *description;
|
||||||
|
StringHolder *holder;
|
||||||
|
|
||||||
|
holder = gtk_list_item_get_item (item);
|
||||||
|
|
||||||
|
title = g_object_get_data (G_OBJECT (item), "title");
|
||||||
|
image = g_object_get_data (G_OBJECT (item), "image");
|
||||||
|
description = g_object_get_data (G_OBJECT (item), "description");
|
||||||
|
|
||||||
|
gtk_label_set_label (GTK_LABEL (title), holder->title);
|
||||||
|
if (image)
|
||||||
|
{
|
||||||
|
gtk_image_set_from_icon_name (GTK_IMAGE (image), holder->icon);
|
||||||
|
gtk_widget_set_visible (image, holder->icon != NULL);
|
||||||
|
}
|
||||||
|
if (description)
|
||||||
|
{
|
||||||
|
gtk_label_set_label (GTK_LABEL (description), holder->description);
|
||||||
|
gtk_widget_set_visible (description , holder->description != NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkListItemFactory *
|
||||||
|
strings_factory_new (gboolean full)
|
||||||
|
{
|
||||||
|
GtkListItemFactory *factory;
|
||||||
|
|
||||||
|
factory = gtk_signal_list_item_factory_new ();
|
||||||
|
if (full)
|
||||||
|
g_signal_connect (factory, "setup", G_CALLBACK (strings_setup_item_full), NULL);
|
||||||
|
else
|
||||||
|
g_signal_connect (factory, "setup", G_CALLBACK (strings_setup_item_single_line), NULL);
|
||||||
|
g_signal_connect (factory, "bind", G_CALLBACK (strings_bind_item), NULL);
|
||||||
|
|
||||||
|
return factory;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GListModel *
|
||||||
|
strings_model_new (const char *const *titles,
|
||||||
|
const char *const *icons,
|
||||||
|
const char *const *descriptions)
|
||||||
|
{
|
||||||
|
GListStore *store;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
store = g_list_store_new (STRING_TYPE_HOLDER);
|
||||||
|
for (i = 0; titles[i]; i++)
|
||||||
|
{
|
||||||
|
StringHolder *holder = string_holder_new (titles[i],
|
||||||
|
icons ? icons[i] : NULL,
|
||||||
|
descriptions ? descriptions[i] : NULL);
|
||||||
|
g_list_store_append (store, holder);
|
||||||
|
g_object_unref (holder);
|
||||||
|
}
|
||||||
|
|
||||||
|
return G_LIST_MODEL (store);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget *
|
||||||
|
drop_down_new_from_strings (const char *const *titles,
|
||||||
|
const char *const *icons,
|
||||||
|
const char *const *descriptions)
|
||||||
|
{
|
||||||
|
GtkWidget *widget;
|
||||||
|
GListModel *model;
|
||||||
|
GtkListItemFactory *factory;
|
||||||
|
GtkListItemFactory *list_factory;
|
||||||
|
|
||||||
|
g_return_val_if_fail (titles != NULL, NULL);
|
||||||
|
g_return_val_if_fail (icons == NULL || g_strv_length ((char **)icons) == g_strv_length ((char **)titles), NULL);
|
||||||
|
g_return_val_if_fail (descriptions == NULL || g_strv_length ((char **)icons) == g_strv_length ((char **)descriptions), NULL);
|
||||||
|
|
||||||
|
model = strings_model_new (titles, icons, descriptions);
|
||||||
|
factory = strings_factory_new (FALSE);
|
||||||
|
if (icons != NULL || descriptions != NULL)
|
||||||
|
list_factory = strings_factory_new (TRUE);
|
||||||
|
else
|
||||||
|
list_factory = NULL;
|
||||||
|
|
||||||
|
widget = g_object_new (GTK_TYPE_DROP_DOWN,
|
||||||
|
"model", model,
|
||||||
|
"factory", factory,
|
||||||
|
"list-factory", list_factory,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
g_object_unref (model);
|
||||||
|
g_object_unref (factory);
|
||||||
|
if (list_factory)
|
||||||
|
g_object_unref (list_factory);
|
||||||
|
|
||||||
|
return widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_family_name (gpointer item)
|
||||||
|
{
|
||||||
|
return g_strdup (pango_font_family_get_name (PANGO_FONT_FAMILY (item)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_title (gpointer item)
|
||||||
|
{
|
||||||
|
return g_strdup (STRING_HOLDER (item)->title);
|
||||||
|
}
|
||||||
|
|
||||||
|
GtkWidget *
|
||||||
|
do_dropdown (GtkWidget *do_widget)
|
||||||
|
{
|
||||||
|
static GtkWidget *window = NULL;
|
||||||
|
GtkWidget *button, *box, *spin, *check;
|
||||||
|
GListModel *model;
|
||||||
|
GtkExpression *expression;
|
||||||
|
const char * const times[] = { "1 minute", "2 minutes", "5 minutes", "20 minutes", NULL };
|
||||||
|
const char * const many_times[] = {
|
||||||
|
"1 minute", "2 minutes", "5 minutes", "10 minutes", "15 minutes", "20 minutes",
|
||||||
|
"25 minutes", "30 minutes", "35 minutes", "40 minutes", "45 minutes", "50 minutes",
|
||||||
|
"55 minutes", "1 hour", "2 hours", "3 hours", "5 hours", "6 hours", "7 hours",
|
||||||
|
"8 hours", "9 hours", "10 hours", "11 hours", "12 hours", NULL
|
||||||
|
};
|
||||||
|
const char * const device_titles[] = { "Digital Output", "Headphones", "Digital Output", "Analog Output", NULL };
|
||||||
|
const char * const device_icons[] = { "audio-card-symbolic", "audio-headphones-symbolic", "audio-card-symbolic", "audio-card-symbolic", NULL };
|
||||||
|
const char * const device_descriptions[] = {
|
||||||
|
"Built-in Audio", "Built-in audio", "Thinkpad Tunderbolt 3 Dock USB Audio", "Thinkpad Tunderbolt 3 Dock USB Audio", NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!window)
|
||||||
|
{
|
||||||
|
window = gtk_window_new ();
|
||||||
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
|
gtk_widget_get_display (do_widget));
|
||||||
|
gtk_window_set_title (GTK_WINDOW (window), "Drop Downs");
|
||||||
|
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
|
|
||||||
|
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
|
||||||
|
gtk_widget_set_margin_start (box, 10);
|
||||||
|
gtk_widget_set_margin_end (box, 10);
|
||||||
|
gtk_widget_set_margin_top (box, 10);
|
||||||
|
gtk_widget_set_margin_bottom (box, 10);
|
||||||
|
gtk_window_set_child (GTK_WINDOW (window), box);
|
||||||
|
|
||||||
|
button = gtk_drop_down_new ();
|
||||||
|
|
||||||
|
model = G_LIST_MODEL (pango_cairo_font_map_get_default ());
|
||||||
|
gtk_drop_down_set_model (GTK_DROP_DOWN (button), model);
|
||||||
|
gtk_drop_down_set_selected (GTK_DROP_DOWN (button), 0);
|
||||||
|
|
||||||
|
expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL,
|
||||||
|
0, NULL,
|
||||||
|
(GCallback)get_family_name,
|
||||||
|
NULL, NULL);
|
||||||
|
gtk_drop_down_set_expression (GTK_DROP_DOWN (button), expression);
|
||||||
|
gtk_expression_unref (expression);
|
||||||
|
gtk_box_append (GTK_BOX (box), button);
|
||||||
|
|
||||||
|
spin = gtk_spin_button_new_with_range (-1, g_list_model_get_n_items (G_LIST_MODEL (model)), 1);
|
||||||
|
gtk_widget_set_halign (spin, GTK_ALIGN_START);
|
||||||
|
g_object_bind_property (button, "selected", spin, "value", G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
|
||||||
|
gtk_box_append (GTK_BOX (box), spin);
|
||||||
|
|
||||||
|
check = gtk_check_button_new_with_label ("Enable search");
|
||||||
|
g_object_bind_property (button, "enable-search", check, "active", G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
|
||||||
|
gtk_box_append (GTK_BOX (box), check);
|
||||||
|
|
||||||
|
g_object_unref (model);
|
||||||
|
|
||||||
|
button = drop_down_new_from_strings (times, NULL, NULL);
|
||||||
|
gtk_box_append (GTK_BOX (box), button);
|
||||||
|
|
||||||
|
button = drop_down_new_from_strings (many_times, NULL, NULL);
|
||||||
|
gtk_drop_down_set_enable_search (GTK_DROP_DOWN (button), TRUE);
|
||||||
|
expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL,
|
||||||
|
0, NULL,
|
||||||
|
(GCallback)get_title,
|
||||||
|
NULL, NULL);
|
||||||
|
gtk_drop_down_set_expression (GTK_DROP_DOWN (button), expression);
|
||||||
|
gtk_expression_unref (expression);
|
||||||
|
gtk_box_append (GTK_BOX (box), button);
|
||||||
|
|
||||||
|
button = drop_down_new_from_strings (device_titles, device_icons, device_descriptions);
|
||||||
|
gtk_box_append (GTK_BOX (box), button);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gtk_widget_get_visible (window))
|
||||||
|
gtk_widget_show (window);
|
||||||
|
else
|
||||||
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
@@ -352,8 +352,7 @@ do_editable_cells (GtkWidget *do_widget)
|
|||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Editable Cells");
|
gtk_window_set_title (GTK_WINDOW (window), "Editable Cells");
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
|
||||||
gtk_widget_set_margin_start (vbox, 5);
|
gtk_widget_set_margin_start (vbox, 5);
|
||||||
@@ -362,15 +361,15 @@ do_editable_cells (GtkWidget *do_widget)
|
|||||||
gtk_widget_set_margin_bottom (vbox, 5);
|
gtk_widget_set_margin_bottom (vbox, 5);
|
||||||
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER (vbox),
|
gtk_box_append (GTK_BOX (vbox),
|
||||||
gtk_label_new ("Shopping list (you can edit the cells!)"));
|
gtk_label_new ("Shopping list (you can edit the cells!)"));
|
||||||
|
|
||||||
sw = gtk_scrolled_window_new (NULL, NULL);
|
sw = gtk_scrolled_window_new ();
|
||||||
gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (sw), TRUE);
|
gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (sw), TRUE);
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
||||||
GTK_POLICY_AUTOMATIC,
|
GTK_POLICY_AUTOMATIC,
|
||||||
GTK_POLICY_AUTOMATIC);
|
GTK_POLICY_AUTOMATIC);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), sw);
|
gtk_box_append (GTK_BOX (vbox), sw);
|
||||||
|
|
||||||
/* create models */
|
/* create models */
|
||||||
items_model = create_items_model ();
|
items_model = create_items_model ();
|
||||||
@@ -392,17 +391,17 @@ do_editable_cells (GtkWidget *do_widget)
|
|||||||
/* some buttons */
|
/* some buttons */
|
||||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
|
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
|
||||||
gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
|
gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), hbox);
|
gtk_box_append (GTK_BOX (vbox), hbox);
|
||||||
|
|
||||||
button = gtk_button_new_with_label ("Add item");
|
button = gtk_button_new_with_label ("Add item");
|
||||||
g_signal_connect (button, "clicked",
|
g_signal_connect (button, "clicked",
|
||||||
G_CALLBACK (add_item), treeview);
|
G_CALLBACK (add_item), treeview);
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), button);
|
gtk_box_append (GTK_BOX (hbox), button);
|
||||||
|
|
||||||
button = gtk_button_new_with_label ("Remove item");
|
button = gtk_button_new_with_label ("Remove item");
|
||||||
g_signal_connect (button, "clicked",
|
g_signal_connect (button, "clicked",
|
||||||
G_CALLBACK (remove_item), treeview);
|
G_CALLBACK (remove_item), treeview);
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), button);
|
gtk_box_append (GTK_BOX (hbox), button);
|
||||||
|
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window), 320, 200);
|
gtk_window_set_default_size (GTK_WINDOW (window), 320, 200);
|
||||||
}
|
}
|
||||||
@@ -410,7 +409,7 @@ do_editable_cells (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Entry/Entry Completion
|
/* Entry/Completion
|
||||||
*
|
*
|
||||||
* GtkEntryCompletion provides a mechanism for adding support for
|
* GtkEntryCompletion provides a mechanism for adding support for
|
||||||
* completion in GtkEntry.
|
* completion in GtkEntry.
|
||||||
@@ -12,22 +12,48 @@
|
|||||||
static GtkTreeModel *
|
static GtkTreeModel *
|
||||||
create_completion_model (void)
|
create_completion_model (void)
|
||||||
{
|
{
|
||||||
|
const char *strings[] = {
|
||||||
|
"GNOME",
|
||||||
|
"gnominious",
|
||||||
|
"Gnomonic projection",
|
||||||
|
"Gnosophy",
|
||||||
|
"total",
|
||||||
|
"totally",
|
||||||
|
"toto",
|
||||||
|
"tottery",
|
||||||
|
"totterer",
|
||||||
|
"Totten trust",
|
||||||
|
"Tottenham hotspurs",
|
||||||
|
"totipotent",
|
||||||
|
"totipotency",
|
||||||
|
"totemism",
|
||||||
|
"totem pole",
|
||||||
|
"Totara",
|
||||||
|
"totalizer",
|
||||||
|
"totalizator",
|
||||||
|
"totalitarianism",
|
||||||
|
"total parenteral nutrition",
|
||||||
|
"total eclipse",
|
||||||
|
"Totipresence",
|
||||||
|
"Totipalmi",
|
||||||
|
"zombie",
|
||||||
|
"aæx",
|
||||||
|
"aæy",
|
||||||
|
"aæz",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
int i;
|
||||||
GtkListStore *store;
|
GtkListStore *store;
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
|
|
||||||
store = gtk_list_store_new (1, G_TYPE_STRING);
|
store = gtk_list_store_new (1, G_TYPE_STRING);
|
||||||
|
|
||||||
|
for (i = 0; strings[i]; i++)
|
||||||
|
{
|
||||||
/* Append one word */
|
/* Append one word */
|
||||||
gtk_list_store_append (store, &iter);
|
gtk_list_store_append (store, &iter);
|
||||||
gtk_list_store_set (store, &iter, 0, "GNOME", -1);
|
gtk_list_store_set (store, &iter, 0, strings[i], -1);
|
||||||
|
}
|
||||||
/* Append another word */
|
|
||||||
gtk_list_store_append (store, &iter);
|
|
||||||
gtk_list_store_set (store, &iter, 0, "total", -1);
|
|
||||||
|
|
||||||
/* And another word */
|
|
||||||
gtk_list_store_append (store, &iter);
|
|
||||||
gtk_list_store_set (store, &iter, 0, "totally", -1);
|
|
||||||
|
|
||||||
return GTK_TREE_MODEL (store);
|
return GTK_TREE_MODEL (store);
|
||||||
}
|
}
|
||||||
@@ -48,11 +74,9 @@ do_entry_completion (GtkWidget *do_widget)
|
|||||||
window = gtk_window_new ();
|
window = gtk_window_new ();
|
||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Entry Completion");
|
gtk_window_set_title (GTK_WINDOW (window), "Completion");
|
||||||
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
|
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
g_signal_connect (window, "destroy",
|
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
|
||||||
gtk_widget_set_margin_start (vbox, 5);
|
gtk_widget_set_margin_start (vbox, 5);
|
||||||
@@ -62,12 +86,12 @@ do_entry_completion (GtkWidget *do_widget)
|
|||||||
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
||||||
|
|
||||||
label = gtk_label_new (NULL);
|
label = gtk_label_new (NULL);
|
||||||
gtk_label_set_markup (GTK_LABEL (label), "Completion demo, try writing <b>total</b> or <b>gnome</b> for example.");
|
gtk_label_set_markup (GTK_LABEL (label), "Try writing <b>total</b> or <b>gnome</b> for example.");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
/* Create our entry */
|
/* Create our entry */
|
||||||
entry = gtk_entry_new ();
|
entry = gtk_entry_new ();
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), entry);
|
gtk_box_append (GTK_BOX (vbox), entry);
|
||||||
|
|
||||||
/* Create the completion object */
|
/* Create the completion object */
|
||||||
completion = gtk_entry_completion_new ();
|
completion = gtk_entry_completion_new ();
|
||||||
@@ -83,12 +107,15 @@ do_entry_completion (GtkWidget *do_widget)
|
|||||||
|
|
||||||
/* Use model column 0 as the text column */
|
/* Use model column 0 as the text column */
|
||||||
gtk_entry_completion_set_text_column (completion, 0);
|
gtk_entry_completion_set_text_column (completion, 0);
|
||||||
|
|
||||||
|
gtk_entry_completion_set_inline_completion (completion, TRUE);
|
||||||
|
gtk_entry_completion_set_inline_selection (completion, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/* Entry/Entry Undo
|
/* Entry/Undo and Redo
|
||||||
*
|
*
|
||||||
* GtkEntry can provide basic Undo/Redo support using standard keyboard
|
* GtkEntry can provide basic Undo/Redo support using standard keyboard
|
||||||
* accelerators such as Primary+z to undo and Primary+Shift+z to redo.
|
* accelerators such as Control+z to undo and Control+Shift+z to redo.
|
||||||
* Additionally, Primary+y can be used to redo.
|
* Additionally, Control+y can be used to redo.
|
||||||
*
|
*
|
||||||
* Use gtk_entry_set_enable_undo() to enable undo/redo support.
|
* Use gtk_entry_set_enable_undo() to enable undo/redo support.
|
||||||
*/
|
*/
|
||||||
@@ -23,10 +23,9 @@ do_entry_undo (GtkWidget *do_widget)
|
|||||||
window = gtk_window_new ();
|
window = gtk_window_new ();
|
||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Entry Undo");
|
gtk_window_set_title (GTK_WINDOW (window), "Undo and Redo");
|
||||||
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
|
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
|
||||||
gtk_widget_set_margin_start (vbox, 5);
|
gtk_widget_set_margin_start (vbox, 5);
|
||||||
@@ -38,18 +37,18 @@ do_entry_undo (GtkWidget *do_widget)
|
|||||||
label = gtk_label_new (NULL);
|
label = gtk_label_new (NULL);
|
||||||
gtk_label_set_markup (GTK_LABEL (label),
|
gtk_label_set_markup (GTK_LABEL (label),
|
||||||
"Use Primary+z or Primary+Shift+z to undo or redo changes");
|
"Use Primary+z or Primary+Shift+z to undo or redo changes");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
/* Create our entry */
|
/* Create our entry */
|
||||||
entry = gtk_entry_new ();
|
entry = gtk_entry_new ();
|
||||||
gtk_editable_set_enable_undo (GTK_EDITABLE (entry), TRUE);
|
gtk_editable_set_enable_undo (GTK_EDITABLE (entry), TRUE);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), entry);
|
gtk_box_append (GTK_BOX (vbox), entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ static GtkWidget *window = NULL;
|
|||||||
static void
|
static void
|
||||||
response_cb (GtkDialog *dialog, gint response_id)
|
response_cb (GtkDialog *dialog, gint response_id)
|
||||||
{
|
{
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
window = NULL;
|
window = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ do_expander (GtkWidget *do_widget)
|
|||||||
|
|
||||||
expander = gtk_expander_new ("Details:");
|
expander = gtk_expander_new ("Details:");
|
||||||
gtk_widget_set_vexpand (expander, TRUE);
|
gtk_widget_set_vexpand (expander, TRUE);
|
||||||
sw = gtk_scrolled_window_new (NULL, NULL);
|
sw = gtk_scrolled_window_new ();
|
||||||
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (sw), 100);
|
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (sw), 100);
|
||||||
gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (sw), TRUE);
|
gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (sw), TRUE);
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
||||||
@@ -79,8 +79,8 @@ do_expander (GtkWidget *do_widget)
|
|||||||
"innuendo, just to make you scroll down or "
|
"innuendo, just to make you scroll down or "
|
||||||
"resize the window. Do it already !", -1);
|
"resize the window. Do it already !", -1);
|
||||||
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), tv);
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), tv);
|
||||||
gtk_container_add (GTK_CONTAINER (expander), sw);
|
gtk_expander_set_child (GTK_EXPANDER (expander), sw);
|
||||||
gtk_container_add (GTK_CONTAINER (area), expander);
|
gtk_box_append (GTK_BOX (area), expander);
|
||||||
g_signal_connect (expander, "notify::expanded",
|
g_signal_connect (expander, "notify::expanded",
|
||||||
G_CALLBACK (expander_cb), window);
|
G_CALLBACK (expander_cb), window);
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ do_expander (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,7 @@ do_filtermodel (GtkWidget *do_widget)
|
|||||||
window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
|
window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
|
||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
store = (GtkListStore*)gtk_builder_get_object (builder, "liststore1");
|
store = (GtkListStore*)gtk_builder_get_object (builder, "liststore1");
|
||||||
|
|
||||||
@@ -199,7 +198,7 @@ do_filtermodel (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -249,6 +249,14 @@ fishbowl_changes_toggled_cb (GtkToggleButton *button,
|
|||||||
gtk_button_set_icon_name (GTK_BUTTON (button), "changes-allow");
|
gtk_button_set_icon_name (GTK_BUTTON (button), "changes-allow");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
format_header_cb (GObject *object,
|
||||||
|
guint count,
|
||||||
|
double fps)
|
||||||
|
{
|
||||||
|
return g_strdup_printf ("%u Icons, %.2f fps", count, fps);
|
||||||
|
}
|
||||||
|
|
||||||
GtkWidget *
|
GtkWidget *
|
||||||
do_fishbowl (GtkWidget *do_widget)
|
do_fishbowl (GtkWidget *do_widget)
|
||||||
{
|
{
|
||||||
@@ -273,15 +281,13 @@ do_fishbowl (GtkWidget *do_widget)
|
|||||||
|
|
||||||
builder = gtk_builder_new_from_resource ("/fishbowl/fishbowl.ui");
|
builder = gtk_builder_new_from_resource ("/fishbowl/fishbowl.ui");
|
||||||
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
|
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
bowl = GTK_WIDGET (gtk_builder_get_object (builder, "bowl"));
|
bowl = GTK_WIDGET (gtk_builder_get_object (builder, "bowl"));
|
||||||
selected_widget_type = -1;
|
selected_widget_type = -1;
|
||||||
set_widget_type (GTK_FISHBOWL (bowl), 0);
|
set_widget_type (GTK_FISHBOWL (bowl), 0);
|
||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
g_signal_connect (window, "destroy",
|
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
gtk_widget_realize (window);
|
gtk_widget_realize (window);
|
||||||
g_object_unref (builder);
|
g_object_unref (builder);
|
||||||
@@ -290,7 +296,7 @@ do_fishbowl (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,22 +28,12 @@
|
|||||||
</child>
|
</child>
|
||||||
<child type="end">
|
<child type="end">
|
||||||
<object class="GtkLabel">
|
<object class="GtkLabel">
|
||||||
<property name="label">fps</property>
|
<binding name="label">
|
||||||
</object>
|
<closure type="gchararray" function="format_header_cb">
|
||||||
</child>
|
<lookup name="count">bowl</lookup>
|
||||||
<child type="end">
|
<lookup name="framerate">bowl</lookup>
|
||||||
<object class="GtkLabel">
|
</closure>
|
||||||
<property name="label" bind-source="bowl" bind-property="framerate-string"/>
|
</binding>
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child type="end">
|
|
||||||
<object class="GtkLabel">
|
|
||||||
<property name="label">Icons, </property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child type="end">
|
|
||||||
<object class="GtkLabel">
|
|
||||||
<property name="label" bind-source="bowl" bind-property="count"/>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child type="end">
|
<child type="end">
|
||||||
@@ -58,6 +48,7 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="GtkFishbowl" id="bowl">
|
<object class="GtkFishbowl" id="bowl">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
<property name="overflow">hidden</property>
|
||||||
<property name="animating">True</property>
|
<property name="animating">True</property>
|
||||||
<property name="benchmark" bind-source="changes_allow" bind-property="active" bind-flags="invert-boolean | sync-create"/>
|
<property name="benchmark" bind-source="changes_allow" bind-property="active" bind-flags="invert-boolean | sync-create"/>
|
||||||
</object>
|
</object>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* Fixed layout
|
/* Fixed Layout
|
||||||
*
|
*
|
||||||
* GtkFixed is a container that allows placing and transforming
|
* GtkFixed is a container that allows placing and transforming
|
||||||
* widgets manually.
|
* widgets manually.
|
||||||
@@ -53,7 +53,7 @@ create_faces (void)
|
|||||||
faces[i].face = gtk_frame_new (NULL);
|
faces[i].face = gtk_frame_new (NULL);
|
||||||
gtk_widget_set_size_request (faces[i].face, face_size, face_size);
|
gtk_widget_set_size_request (faces[i].face, face_size, face_size);
|
||||||
gtk_widget_add_css_class (faces[i].face, faces[i].css_class);
|
gtk_widget_add_css_class (faces[i].face, faces[i].css_class);
|
||||||
gtk_container_add (GTK_CONTAINER (fixed), faces[i].face);
|
gtk_fixed_put (GTK_FIXED (fixed), faces[i].face, 0, 0);
|
||||||
|
|
||||||
/* Set up the transformation for each face */
|
/* Set up the transformation for each face */
|
||||||
transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (w, h));
|
transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (w, h));
|
||||||
@@ -126,11 +126,11 @@ create_demo_window (GtkWidget *do_widget)
|
|||||||
|
|
||||||
window = gtk_window_new ();
|
window = gtk_window_new ();
|
||||||
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
|
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Fixed layout");
|
gtk_window_set_title (GTK_WINDOW (window), "Fixed Layout");
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
|
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
|
||||||
g_signal_connect (window, "destroy", G_CALLBACK (close_window), NULL);
|
g_signal_connect (window, "destroy", G_CALLBACK (close_window), NULL);
|
||||||
|
|
||||||
sw = gtk_scrolled_window_new (NULL, NULL);
|
sw = gtk_scrolled_window_new ();
|
||||||
gtk_window_set_child (GTK_WINDOW (window), sw);
|
gtk_window_set_child (GTK_WINDOW (window), sw);
|
||||||
|
|
||||||
fixed = gtk_fixed_new ();
|
fixed = gtk_fixed_new ();
|
||||||
@@ -139,7 +139,7 @@ create_demo_window (GtkWidget *do_widget)
|
|||||||
gtk_widget_set_valign (GTK_WIDGET (fixed), GTK_ALIGN_CENTER);
|
gtk_widget_set_valign (GTK_WIDGET (fixed), GTK_ALIGN_CENTER);
|
||||||
|
|
||||||
cube = create_faces ();
|
cube = create_faces ();
|
||||||
gtk_container_add (GTK_CONTAINER (fixed), cube);
|
gtk_fixed_put (GTK_FIXED (fixed), cube, 0, 0);
|
||||||
gtk_widget_set_overflow (fixed, GTK_OVERFLOW_VISIBLE);
|
gtk_widget_set_overflow (fixed, GTK_OVERFLOW_VISIBLE);
|
||||||
|
|
||||||
provider = gtk_css_provider_new ();
|
provider = gtk_css_provider_new ();
|
||||||
@@ -161,7 +161,7 @@ do_fixed (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (demo_window))
|
if (!gtk_widget_get_visible (demo_window))
|
||||||
gtk_widget_show (demo_window);
|
gtk_widget_show (demo_window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (demo_window);
|
gtk_window_destroy (GTK_WINDOW (demo_window));
|
||||||
|
|
||||||
return demo_window;
|
return demo_window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
/* Flow Box
|
/* Flow Box
|
||||||
*
|
*
|
||||||
* GtkFlowBox allows flexible and responsive grids which reflow
|
* GtkFlowBox allows flexible and responsive grids which reflow
|
||||||
* as needed and support sorting and filtering.
|
* as needed and support sorting and filtering. The children of
|
||||||
|
* a GtkFlowBox are regular widgets
|
||||||
*
|
*
|
||||||
* The children of a GtkFlowBox are regular widgets
|
* The dataset used here has 665 colors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
@@ -724,11 +725,9 @@ do_flowbox (GtkWidget *do_widget)
|
|||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Flow Box");
|
gtk_window_set_title (GTK_WINDOW (window), "Flow Box");
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window), 400, 600);
|
gtk_window_set_default_size (GTK_WINDOW (window), 400, 600);
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
|
|
||||||
g_signal_connect (window, "destroy",
|
scrolled = gtk_scrolled_window_new ();
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
scrolled = gtk_scrolled_window_new (NULL, NULL);
|
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
||||||
flowbox = gtk_flow_box_new ();
|
flowbox = gtk_flow_box_new ();
|
||||||
gtk_widget_set_valign (flowbox, GTK_ALIGN_START);
|
gtk_widget_set_valign (flowbox, GTK_ALIGN_START);
|
||||||
@@ -739,13 +738,13 @@ do_flowbox (GtkWidget *do_widget)
|
|||||||
gtk_window_set_child (GTK_WINDOW (window), scrolled);
|
gtk_window_set_child (GTK_WINDOW (window), scrolled);
|
||||||
|
|
||||||
for (i = 0; colors[i]; i++)
|
for (i = 0; colors[i]; i++)
|
||||||
gtk_container_add (GTK_CONTAINER (flowbox), color_swatch_new (colors[i]));
|
gtk_flow_box_insert (GTK_FLOW_BOX (flowbox), color_swatch_new (colors[i]), -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ add_check_group (GtkWidget *box,
|
|||||||
pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD));
|
pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD));
|
||||||
gtk_label_set_attributes (GTK_LABEL (label), attrs);
|
gtk_label_set_attributes (GTK_LABEL (label), attrs);
|
||||||
pango_attr_list_unref (attrs);
|
pango_attr_list_unref (attrs);
|
||||||
gtk_container_add (GTK_CONTAINER (group), label);
|
gtk_box_append (GTK_BOX (group), label);
|
||||||
|
|
||||||
for (i = 0; tags[i]; i++)
|
for (i = 0; tags[i]; i++)
|
||||||
{
|
{
|
||||||
@@ -211,7 +211,7 @@ add_check_group (GtkWidget *box,
|
|||||||
g_signal_connect (feat, "notify::inconsistent", G_CALLBACK (update_display), NULL);
|
g_signal_connect (feat, "notify::inconsistent", G_CALLBACK (update_display), NULL);
|
||||||
g_signal_connect (feat, "clicked", G_CALLBACK (feat_clicked), NULL);
|
g_signal_connect (feat, "clicked", G_CALLBACK (feat_clicked), NULL);
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER (group), feat);
|
gtk_box_append (GTK_BOX (group), feat);
|
||||||
|
|
||||||
item = g_new (FeatureItem, 1);
|
item = g_new (FeatureItem, 1);
|
||||||
item->name = tags[i];
|
item->name = tags[i];
|
||||||
@@ -223,7 +223,7 @@ add_check_group (GtkWidget *box,
|
|||||||
feature_items = g_list_prepend (feature_items, item);
|
feature_items = g_list_prepend (feature_items, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER (box), group);
|
gtk_box_append (GTK_BOX (box), group);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -248,7 +248,7 @@ add_radio_group (GtkWidget *box,
|
|||||||
pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD));
|
pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD));
|
||||||
gtk_label_set_attributes (GTK_LABEL (label), attrs);
|
gtk_label_set_attributes (GTK_LABEL (label), attrs);
|
||||||
pango_attr_list_unref (attrs);
|
pango_attr_list_unref (attrs);
|
||||||
gtk_container_add (GTK_CONTAINER (group), label);
|
gtk_box_append (GTK_BOX (group), label);
|
||||||
|
|
||||||
for (i = 0; tags[i]; i++)
|
for (i = 0; tags[i]; i++)
|
||||||
{
|
{
|
||||||
@@ -268,7 +268,7 @@ add_radio_group (GtkWidget *box,
|
|||||||
g_signal_connect (feat, "notify::active", G_CALLBACK (update_display), NULL);
|
g_signal_connect (feat, "notify::active", G_CALLBACK (update_display), NULL);
|
||||||
g_object_set_data (G_OBJECT (feat), "default", group_button);
|
g_object_set_data (G_OBJECT (feat), "default", group_button);
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER (group), feat);
|
gtk_box_append (GTK_BOX (group), feat);
|
||||||
|
|
||||||
item = g_new (FeatureItem, 1);
|
item = g_new (FeatureItem, 1);
|
||||||
item->name = tags[i];
|
item->name = tags[i];
|
||||||
@@ -280,7 +280,7 @@ add_radio_group (GtkWidget *box,
|
|||||||
feature_items = g_list_prepend (feature_items, item);
|
feature_items = g_list_prepend (feature_items, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER (box), group);
|
gtk_box_append (GTK_BOX (box), group);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1025,7 +1025,7 @@ denorm_coord (hb_ot_var_axis_info_t *axis, int coord)
|
|||||||
static void
|
static void
|
||||||
update_font_variations (void)
|
update_font_variations (void)
|
||||||
{
|
{
|
||||||
GtkWidget *child, *next;
|
GtkWidget *child;
|
||||||
PangoFont *pango_font = NULL;
|
PangoFont *pango_font = NULL;
|
||||||
hb_font_t *hb_font;
|
hb_font_t *hb_font;
|
||||||
hb_face_t *hb_face;
|
hb_face_t *hb_face;
|
||||||
@@ -1037,12 +1037,8 @@ update_font_variations (void)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
child = gtk_widget_get_first_child (variations_grid);
|
child = gtk_widget_get_first_child (variations_grid);
|
||||||
while (child != NULL)
|
while ((child = gtk_widget_get_first_child (variations_grid)))
|
||||||
{
|
gtk_grid_remove (GTK_GRID (variations_grid), child);
|
||||||
next = gtk_widget_get_next_sibling (child);
|
|
||||||
gtk_widget_destroy (child);
|
|
||||||
child = next;
|
|
||||||
}
|
|
||||||
|
|
||||||
instance_combo = NULL;
|
instance_combo = NULL;
|
||||||
|
|
||||||
@@ -1333,8 +1329,7 @@ do_font_features (GtkWidget *do_widget)
|
|||||||
|
|
||||||
font_features_font_changed ();
|
font_features_font_changed ();
|
||||||
|
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
g_object_unref (builder);
|
g_object_unref (builder);
|
||||||
|
|
||||||
@@ -1344,7 +1339,7 @@ do_font_features (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_window_present (GTK_WINDOW (window));
|
gtk_window_present (GTK_WINDOW (window));
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -281,7 +281,7 @@ do_fontrendering (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ create_axis_slider (GtkGears *gears,
|
|||||||
}
|
}
|
||||||
|
|
||||||
label = gtk_label_new (text);
|
label = gtk_label_new (text);
|
||||||
gtk_container_add (GTK_CONTAINER (box), label);
|
gtk_box_append (GTK_BOX (box), label);
|
||||||
gtk_widget_show (label);
|
gtk_widget_show (label);
|
||||||
|
|
||||||
adj = gtk_adjustment_new (gtk_gears_get_axis (gears, axis), 0.0, 360.0, 1.0, 12.0, 0.0);
|
adj = gtk_adjustment_new (gtk_gears_get_axis (gears, axis), 0.0, 360.0, 1.0, 12.0, 0.0);
|
||||||
@@ -63,7 +63,7 @@ create_axis_slider (GtkGears *gears,
|
|||||||
gears);
|
gears);
|
||||||
slider = gtk_scale_new (GTK_ORIENTATION_VERTICAL, adj);
|
slider = gtk_scale_new (GTK_ORIENTATION_VERTICAL, adj);
|
||||||
gtk_scale_set_draw_value (GTK_SCALE (slider), FALSE);
|
gtk_scale_set_draw_value (GTK_SCALE (slider), FALSE);
|
||||||
gtk_container_add (GTK_CONTAINER (box), slider);
|
gtk_box_append (GTK_BOX (box), slider);
|
||||||
gtk_widget_set_vexpand (slider, TRUE);
|
gtk_widget_set_vexpand (slider, TRUE);
|
||||||
gtk_widget_show (slider);
|
gtk_widget_show (slider);
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@ do_gears (GtkWidget *do_widget)
|
|||||||
gtk_window_set_title (GTK_WINDOW (window), "Gears");
|
gtk_window_set_title (GTK_WINDOW (window), "Gears");
|
||||||
gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
|
gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window), 640, 640);
|
gtk_window_set_default_size (GTK_WINDOW (window), 640, 640);
|
||||||
g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
|
|
||||||
overlay = gtk_overlay_new ();
|
overlay = gtk_overlay_new ();
|
||||||
gtk_widget_set_margin_start (overlay, 12);
|
gtk_widget_set_margin_start (overlay, 12);
|
||||||
@@ -111,19 +111,19 @@ do_gears (GtkWidget *do_widget)
|
|||||||
|
|
||||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE);
|
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE);
|
||||||
gtk_box_set_spacing (GTK_BOX (box), 6);
|
gtk_box_set_spacing (GTK_BOX (box), 6);
|
||||||
gtk_container_add (GTK_CONTAINER (box), hbox);
|
gtk_box_append (GTK_BOX (box), hbox);
|
||||||
|
|
||||||
gears = gtk_gears_new ();
|
gears = gtk_gears_new ();
|
||||||
gtk_widget_set_hexpand (gears, TRUE);
|
gtk_widget_set_hexpand (gears, TRUE);
|
||||||
gtk_widget_set_vexpand (gears, TRUE);
|
gtk_widget_set_vexpand (gears, TRUE);
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), gears);
|
gtk_box_append (GTK_BOX (hbox), gears);
|
||||||
|
|
||||||
for (i = 0; i < GTK_GEARS_N_AXIS; i++)
|
for (i = 0; i < GTK_GEARS_N_AXIS; i++)
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), create_axis_slider (GTK_GEARS (gears), i));
|
gtk_box_append (GTK_BOX (hbox), create_axis_slider (GTK_GEARS (gears), i));
|
||||||
|
|
||||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE);
|
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE);
|
||||||
gtk_box_set_spacing (GTK_BOX (hbox), 6);
|
gtk_box_set_spacing (GTK_BOX (hbox), 6);
|
||||||
gtk_container_add (GTK_CONTAINER (box), hbox);
|
gtk_box_append (GTK_BOX (box), hbox);
|
||||||
|
|
||||||
gtk_gears_set_fps_label (GTK_GEARS (gears), GTK_LABEL (fps_label));
|
gtk_gears_set_fps_label (GTK_GEARS (gears), GTK_LABEL (fps_label));
|
||||||
}
|
}
|
||||||
@@ -131,7 +131,7 @@ do_gears (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,17 +13,16 @@ in_files = sys.argv[2:]
|
|||||||
file_output = """
|
file_output = """
|
||||||
typedef GtkWidget *(*GDoDemoFunc) (GtkWidget *do_widget);
|
typedef GtkWidget *(*GDoDemoFunc) (GtkWidget *do_widget);
|
||||||
|
|
||||||
typedef struct _Demo Demo;
|
typedef struct _DemoData DemoData;
|
||||||
|
|
||||||
struct _Demo
|
struct _DemoData
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
const char *title;
|
const char *title;
|
||||||
const char *filename;
|
const char *filename;
|
||||||
GDoDemoFunc func;
|
GDoDemoFunc func;
|
||||||
Demo *children;
|
DemoData *children;
|
||||||
};
|
};
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Demo = namedtuple('Demo', ['name', 'title', 'file', 'func'])
|
# Demo = namedtuple('Demo', ['name', 'title', 'file', 'func'])
|
||||||
@@ -67,7 +66,7 @@ for demo in demos:
|
|||||||
i = 0
|
i = 0
|
||||||
for parent in parents:
|
for parent in parents:
|
||||||
id = parent_ids[i]
|
id = parent_ids[i]
|
||||||
file_output += "\nDemo child" + str(id) + "[] = {\n"
|
file_output += "\nDemoData child" + str(id) + "[] = {\n"
|
||||||
# iterate over all demos and check if the name starts with the given parent name
|
# iterate over all demos and check if the name starts with the given parent name
|
||||||
for child in demos:
|
for child in demos:
|
||||||
if child[1].startswith(parent + "/"):
|
if child[1].startswith(parent + "/"):
|
||||||
@@ -82,7 +81,7 @@ for parent in parents:
|
|||||||
# Sort demos by title
|
# Sort demos by title
|
||||||
demos = sorted(demos, key=lambda x: x[1])
|
demos = sorted(demos, key=lambda x: x[1])
|
||||||
|
|
||||||
file_output += "\nDemo gtk_demos[] = {\n"
|
file_output += "\nDemoData gtk_demos[] = {\n"
|
||||||
for demo in demos:
|
for demo in demos:
|
||||||
# Do not generate one of these for demos with a parent demo
|
# Do not generate one of these for demos with a parent demo
|
||||||
if "/" not in demo[1]:
|
if "/" not in demo[1]:
|
||||||
|
|||||||
@@ -149,8 +149,7 @@ do_gestures (GtkWidget *do_widget)
|
|||||||
window = gtk_window_new ();
|
window = gtk_window_new ();
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window), 400, 400);
|
gtk_window_set_default_size (GTK_WINDOW (window), 400, 400);
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Gestures");
|
gtk_window_set_title (GTK_WINDOW (window), "Gestures");
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
drawing_area = gtk_drawing_area_new ();
|
drawing_area = gtk_drawing_area_new ();
|
||||||
gtk_window_set_child (GTK_WINDOW (window), drawing_area);
|
gtk_window_set_child (GTK_WINDOW (window), drawing_area);
|
||||||
@@ -210,7 +209,7 @@ do_gestures (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -354,7 +354,7 @@ create_axis_slider (int axis)
|
|||||||
}
|
}
|
||||||
|
|
||||||
label = gtk_label_new (text);
|
label = gtk_label_new (text);
|
||||||
gtk_container_add (GTK_CONTAINER (box), label);
|
gtk_box_append (GTK_BOX (box), label);
|
||||||
gtk_widget_show (label);
|
gtk_widget_show (label);
|
||||||
|
|
||||||
adj = gtk_adjustment_new (0.0, 0.0, 360.0, 1.0, 12.0, 0.0);
|
adj = gtk_adjustment_new (0.0, 0.0, 360.0, 1.0, 12.0, 0.0);
|
||||||
@@ -362,7 +362,7 @@ create_axis_slider (int axis)
|
|||||||
G_CALLBACK (on_axis_value_change),
|
G_CALLBACK (on_axis_value_change),
|
||||||
GINT_TO_POINTER (axis));
|
GINT_TO_POINTER (axis));
|
||||||
slider = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, adj);
|
slider = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, adj);
|
||||||
gtk_container_add (GTK_CONTAINER (box), slider);
|
gtk_box_append (GTK_BOX (box), slider);
|
||||||
gtk_widget_set_hexpand (slider, TRUE);
|
gtk_widget_set_hexpand (slider, TRUE);
|
||||||
gtk_widget_show (slider);
|
gtk_widget_show (slider);
|
||||||
|
|
||||||
@@ -406,7 +406,7 @@ create_glarea_window (GtkWidget *do_widget)
|
|||||||
gl_area = gtk_gl_area_new ();
|
gl_area = gtk_gl_area_new ();
|
||||||
gtk_widget_set_hexpand (gl_area, TRUE);
|
gtk_widget_set_hexpand (gl_area, TRUE);
|
||||||
gtk_widget_set_vexpand (gl_area, TRUE);
|
gtk_widget_set_vexpand (gl_area, TRUE);
|
||||||
gtk_container_add (GTK_CONTAINER (box), gl_area);
|
gtk_box_append (GTK_BOX (box), gl_area);
|
||||||
|
|
||||||
/* We need to initialize and free GL resources, so we use
|
/* We need to initialize and free GL resources, so we use
|
||||||
* the realize and unrealize signals on the widget
|
* the realize and unrealize signals on the widget
|
||||||
@@ -418,16 +418,16 @@ create_glarea_window (GtkWidget *do_widget)
|
|||||||
g_signal_connect (gl_area, "render", G_CALLBACK (render), NULL);
|
g_signal_connect (gl_area, "render", G_CALLBACK (render), NULL);
|
||||||
|
|
||||||
controls = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE);
|
controls = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE);
|
||||||
gtk_container_add (GTK_CONTAINER (box), controls);
|
gtk_box_append (GTK_BOX (box), controls);
|
||||||
gtk_widget_set_hexpand (controls, TRUE);
|
gtk_widget_set_hexpand (controls, TRUE);
|
||||||
|
|
||||||
for (i = 0; i < N_AXIS; i++)
|
for (i = 0; i < N_AXIS; i++)
|
||||||
gtk_container_add (GTK_CONTAINER (controls), create_axis_slider (i));
|
gtk_box_append (GTK_BOX (controls), create_axis_slider (i));
|
||||||
|
|
||||||
button = gtk_button_new_with_label ("Quit");
|
button = gtk_button_new_with_label ("Quit");
|
||||||
gtk_widget_set_hexpand (button, TRUE);
|
gtk_widget_set_hexpand (button, TRUE);
|
||||||
gtk_container_add (GTK_CONTAINER (box), button);
|
gtk_box_append (GTK_BOX (box), button);
|
||||||
g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
|
g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_window_destroy), window);
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
@@ -441,7 +441,7 @@ do_glarea (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (demo_window))
|
if (!gtk_widget_get_visible (demo_window))
|
||||||
gtk_widget_show (demo_window);
|
gtk_widget_show (demo_window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (demo_window);
|
gtk_window_destroy (GTK_WINDOW (demo_window));
|
||||||
|
|
||||||
return demo_window;
|
return demo_window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ typedef struct _GtkFishbowlChild GtkFishbowlChild;
|
|||||||
struct _GtkFishbowlPrivate
|
struct _GtkFishbowlPrivate
|
||||||
{
|
{
|
||||||
GtkFishCreationFunc creation_func;
|
GtkFishCreationFunc creation_func;
|
||||||
GList *children;
|
GHashTable *children;
|
||||||
guint count;
|
guint count;
|
||||||
|
|
||||||
gint64 last_frame_time;
|
gint64 last_frame_time;
|
||||||
@@ -53,7 +53,6 @@ enum {
|
|||||||
PROP_BENCHMARK,
|
PROP_BENCHMARK,
|
||||||
PROP_COUNT,
|
PROP_COUNT,
|
||||||
PROP_FRAMERATE,
|
PROP_FRAMERATE,
|
||||||
PROP_FRAMERATE_STRING,
|
|
||||||
PROP_UPDATE_DELAY,
|
PROP_UPDATE_DELAY,
|
||||||
NUM_PROPERTIES
|
NUM_PROPERTIES
|
||||||
};
|
};
|
||||||
@@ -68,6 +67,8 @@ gtk_fishbowl_init (GtkFishbowl *fishbowl)
|
|||||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||||
|
|
||||||
priv->update_delay = G_USEC_PER_SEC;
|
priv->update_delay = G_USEC_PER_SEC;
|
||||||
|
priv->children = g_hash_table_new_full (NULL, NULL,
|
||||||
|
NULL, (GDestroyNotify) g_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -94,20 +95,18 @@ gtk_fishbowl_measure (GtkWidget *widget,
|
|||||||
{
|
{
|
||||||
GtkFishbowl *fishbowl = GTK_FISHBOWL (widget);
|
GtkFishbowl *fishbowl = GTK_FISHBOWL (widget);
|
||||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||||
|
GHashTableIter iter;
|
||||||
|
gpointer key, value;
|
||||||
GtkFishbowlChild *child;
|
GtkFishbowlChild *child;
|
||||||
GList *children;
|
|
||||||
gint child_min, child_nat;
|
gint child_min, child_nat;
|
||||||
|
|
||||||
*minimum = 0;
|
*minimum = 0;
|
||||||
*natural = 0;
|
*natural = 0;
|
||||||
|
|
||||||
for (children = priv->children; children; children = children->next)
|
g_hash_table_iter_init (&iter, priv->children);
|
||||||
|
while (g_hash_table_iter_next (&iter, &key, &value))
|
||||||
{
|
{
|
||||||
child = children->data;
|
child = value;
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (child->widget))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
|
|
||||||
if (orientation == GTK_ORIENTATION_HORIZONTAL)
|
if (orientation == GTK_ORIENTATION_HORIZONTAL)
|
||||||
{
|
{
|
||||||
@@ -137,14 +136,13 @@ gtk_fishbowl_size_allocate (GtkWidget *widget,
|
|||||||
GtkFishbowlChild *child;
|
GtkFishbowlChild *child;
|
||||||
GtkAllocation child_allocation;
|
GtkAllocation child_allocation;
|
||||||
GtkRequisition child_requisition;
|
GtkRequisition child_requisition;
|
||||||
GList *children;
|
GHashTableIter iter;
|
||||||
|
gpointer key, value;
|
||||||
|
|
||||||
for (children = priv->children; children; children = children->next)
|
g_hash_table_iter_init (&iter, priv->children);
|
||||||
|
while (g_hash_table_iter_next (&iter, &key, &value))
|
||||||
{
|
{
|
||||||
child = children->data;
|
child = value;
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (child->widget))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
gtk_widget_get_preferred_size (child->widget, &child_requisition, NULL);
|
gtk_widget_get_preferred_size (child->widget, &child_requisition, NULL);
|
||||||
child_allocation.x = round (child->x * (width - child_requisition.width));
|
child_allocation.x = round (child->x * (width - child_requisition.width));
|
||||||
@@ -182,7 +180,7 @@ gtk_fishbowl_add (GtkFishbowl *fishbowl,
|
|||||||
|
|
||||||
gtk_widget_set_parent (widget, GTK_WIDGET (fishbowl));
|
gtk_widget_set_parent (widget, GTK_WIDGET (fishbowl));
|
||||||
|
|
||||||
priv->children = g_list_prepend (priv->children, child_info);
|
g_hash_table_insert (priv->children, widget, child_info);
|
||||||
priv->count++;
|
priv->count++;
|
||||||
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_COUNT]);
|
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_COUNT]);
|
||||||
}
|
}
|
||||||
@@ -192,34 +190,26 @@ gtk_fishbowl_remove (GtkFishbowl *fishbowl,
|
|||||||
GtkWidget *widget)
|
GtkWidget *widget)
|
||||||
{
|
{
|
||||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||||
GtkFishbowlChild *child;
|
|
||||||
GtkWidget *widget_bowl = GTK_WIDGET (fishbowl);
|
|
||||||
GList *children;
|
|
||||||
|
|
||||||
for (children = priv->children; children; children = children->next)
|
if (g_hash_table_remove (priv->children, widget))
|
||||||
{
|
{
|
||||||
child = children->data;
|
|
||||||
|
|
||||||
if (child->widget == widget)
|
|
||||||
{
|
|
||||||
gboolean was_visible = gtk_widget_get_visible (widget);
|
|
||||||
|
|
||||||
gtk_widget_unparent (widget);
|
gtk_widget_unparent (widget);
|
||||||
|
|
||||||
priv->children = g_list_remove_link (priv->children, children);
|
|
||||||
g_list_free (children);
|
|
||||||
g_free (child);
|
|
||||||
|
|
||||||
if (was_visible && gtk_widget_get_visible (widget_bowl))
|
|
||||||
gtk_widget_queue_resize (widget_bowl);
|
|
||||||
|
|
||||||
priv->count--;
|
priv->count--;
|
||||||
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_COUNT]);
|
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_COUNT]);
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_fishbowl_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
GtkFishbowl *fishbowl = GTK_FISHBOWL (object);
|
||||||
|
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||||
|
|
||||||
|
g_hash_table_destroy (priv->children);
|
||||||
|
priv->children = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_fishbowl_dispose (GObject *object)
|
gtk_fishbowl_dispose (GObject *object)
|
||||||
{
|
{
|
||||||
@@ -289,14 +279,6 @@ gtk_fishbowl_get_property (GObject *object,
|
|||||||
g_value_set_double (value, gtk_fishbowl_get_framerate (fishbowl));
|
g_value_set_double (value, gtk_fishbowl_get_framerate (fishbowl));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_FRAMERATE_STRING:
|
|
||||||
{
|
|
||||||
char *s = g_strdup_printf ("%.2f", gtk_fishbowl_get_framerate (fishbowl));
|
|
||||||
g_value_set_string (value, s);
|
|
||||||
g_free (s);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROP_UPDATE_DELAY:
|
case PROP_UPDATE_DELAY:
|
||||||
g_value_set_int64 (value, gtk_fishbowl_get_update_delay (fishbowl));
|
g_value_set_int64 (value, gtk_fishbowl_get_update_delay (fishbowl));
|
||||||
break;
|
break;
|
||||||
@@ -313,6 +295,7 @@ gtk_fishbowl_class_init (GtkFishbowlClass *klass)
|
|||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->finalize = gtk_fishbowl_finalize;
|
||||||
object_class->dispose = gtk_fishbowl_dispose;
|
object_class->dispose = gtk_fishbowl_dispose;
|
||||||
object_class->set_property = gtk_fishbowl_set_property;
|
object_class->set_property = gtk_fishbowl_set_property;
|
||||||
object_class->get_property = gtk_fishbowl_get_property;
|
object_class->get_property = gtk_fishbowl_get_property;
|
||||||
@@ -350,13 +333,6 @@ gtk_fishbowl_class_init (GtkFishbowlClass *klass)
|
|||||||
0,
|
0,
|
||||||
G_PARAM_READABLE);
|
G_PARAM_READABLE);
|
||||||
|
|
||||||
props[PROP_FRAMERATE_STRING] =
|
|
||||||
g_param_spec_string ("framerate-string",
|
|
||||||
"Framerate as string",
|
|
||||||
"Framerate as string, with 2 decimals",
|
|
||||||
NULL,
|
|
||||||
G_PARAM_READABLE);
|
|
||||||
|
|
||||||
props[PROP_UPDATE_DELAY] =
|
props[PROP_UPDATE_DELAY] =
|
||||||
g_param_spec_int64 ("update-delay",
|
g_param_spec_int64 ("update-delay",
|
||||||
"Update delay",
|
"Update delay",
|
||||||
@@ -508,7 +484,6 @@ gtk_fishbowl_do_update (GtkFishbowl *fishbowl)
|
|||||||
priv->framerate = ((int)(priv->framerate * 100))/100.0;
|
priv->framerate = ((int)(priv->framerate * 100))/100.0;
|
||||||
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_FRAMERATE]);
|
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_FRAMERATE]);
|
||||||
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_FRAMERATE_STRING]);
|
|
||||||
|
|
||||||
if (!priv->benchmark)
|
if (!priv->benchmark)
|
||||||
return;
|
return;
|
||||||
@@ -552,8 +527,9 @@ gtk_fishbowl_tick (GtkWidget *widget,
|
|||||||
GtkFishbowl *fishbowl = GTK_FISHBOWL (widget);
|
GtkFishbowl *fishbowl = GTK_FISHBOWL (widget);
|
||||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||||
GtkFishbowlChild *child;
|
GtkFishbowlChild *child;
|
||||||
GList *l;
|
|
||||||
gint64 frame_time, elapsed;
|
gint64 frame_time, elapsed;
|
||||||
|
GHashTableIter iter;
|
||||||
|
gpointer key, value;
|
||||||
gboolean do_update;
|
gboolean do_update;
|
||||||
|
|
||||||
frame_time = gdk_frame_clock_get_frame_time (gtk_widget_get_frame_clock (widget));
|
frame_time = gdk_frame_clock_get_frame_time (gtk_widget_get_frame_clock (widget));
|
||||||
@@ -565,9 +541,10 @@ gtk_fishbowl_tick (GtkWidget *widget,
|
|||||||
if (elapsed == frame_time)
|
if (elapsed == frame_time)
|
||||||
return G_SOURCE_CONTINUE;
|
return G_SOURCE_CONTINUE;
|
||||||
|
|
||||||
for (l = priv->children; l; l = l->next)
|
g_hash_table_iter_init (&iter, priv->children);
|
||||||
|
while (g_hash_table_iter_next (&iter, &key, &value))
|
||||||
{
|
{
|
||||||
child = l->data;
|
child = value;
|
||||||
|
|
||||||
child->x += child->dx * ((double) elapsed / G_USEC_PER_SEC);
|
child->x += child->dx * ((double) elapsed / G_USEC_PER_SEC);
|
||||||
child->y += child->dy * ((double) elapsed / G_USEC_PER_SEC);
|
child->y += child->dy * ((double) elapsed / G_USEC_PER_SEC);
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ gtk_gears_class_init (GtkGearsClass *klass)
|
|||||||
* @param v the vertex to fill
|
* @param v the vertex to fill
|
||||||
* @param x the x coordinate
|
* @param x the x coordinate
|
||||||
* @param y the y coordinate
|
* @param y the y coordinate
|
||||||
* @param z the z coortinate
|
* @param z the z coordinate
|
||||||
* @param n pointer to the normal table
|
* @param n pointer to the normal table
|
||||||
*
|
*
|
||||||
* @return the operation error code
|
* @return the operation error code
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ do_headerbar (GtkWidget *do_widget)
|
|||||||
window = gtk_window_new ();
|
window = gtk_window_new ();
|
||||||
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
|
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Welcome to Facebook - Log in, sign up or learn more");
|
gtk_window_set_title (GTK_WINDOW (window), "Welcome to Facebook - Log in, sign up or learn more");
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
|
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
|
||||||
|
|
||||||
header = gtk_header_bar_new ();
|
header = gtk_header_bar_new ();
|
||||||
@@ -43,10 +43,10 @@ do_headerbar (GtkWidget *do_widget)
|
|||||||
gtk_widget_add_css_class (box, "linked");
|
gtk_widget_add_css_class (box, "linked");
|
||||||
button = gtk_button_new ();
|
button = gtk_button_new ();
|
||||||
gtk_button_set_child (GTK_BUTTON (button), gtk_image_new_from_icon_name ("pan-start-symbolic"));
|
gtk_button_set_child (GTK_BUTTON (button), gtk_image_new_from_icon_name ("pan-start-symbolic"));
|
||||||
gtk_container_add (GTK_CONTAINER (box), button);
|
gtk_box_append (GTK_BOX (box), button);
|
||||||
button = gtk_button_new ();
|
button = gtk_button_new ();
|
||||||
gtk_button_set_child (GTK_BUTTON (button), gtk_image_new_from_icon_name ("pan-end-symbolic"));
|
gtk_button_set_child (GTK_BUTTON (button), gtk_image_new_from_icon_name ("pan-end-symbolic"));
|
||||||
gtk_container_add (GTK_CONTAINER (box), button);
|
gtk_box_append (GTK_BOX (box), button);
|
||||||
|
|
||||||
gtk_header_bar_pack_start (GTK_HEADER_BAR (header), box);
|
gtk_header_bar_pack_start (GTK_HEADER_BAR (header), box);
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ do_headerbar (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -237,9 +237,7 @@ do_hypertext (GtkWidget *do_widget)
|
|||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window), 450, 450);
|
gtk_window_set_default_size (GTK_WINDOW (window), 450, 450);
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
g_signal_connect (window, "destroy",
|
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
view = gtk_text_view_new ();
|
view = gtk_text_view_new ();
|
||||||
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD);
|
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD);
|
||||||
@@ -262,7 +260,7 @@ do_hypertext (GtkWidget *do_widget)
|
|||||||
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
|
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
|
||||||
gtk_text_buffer_set_enable_undo (buffer, TRUE);
|
gtk_text_buffer_set_enable_undo (buffer, TRUE);
|
||||||
|
|
||||||
sw = gtk_scrolled_window_new (NULL, NULL);
|
sw = gtk_scrolled_window_new ();
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
||||||
GTK_POLICY_AUTOMATIC,
|
GTK_POLICY_AUTOMATIC,
|
||||||
GTK_POLICY_AUTOMATIC);
|
GTK_POLICY_AUTOMATIC);
|
||||||
@@ -275,7 +273,7 @@ do_hypertext (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ static GtkWidget *window = NULL;
|
|||||||
static GtkWidget *scrolledwindow;
|
static GtkWidget *scrolledwindow;
|
||||||
static int selected;
|
static int selected;
|
||||||
|
|
||||||
#define N_WIDGET_TYPES 4
|
#define N_WIDGET_TYPES 6
|
||||||
|
|
||||||
|
|
||||||
static int hincrement = 5;
|
static int hincrement = 5;
|
||||||
@@ -64,6 +64,7 @@ populate_icons (void)
|
|||||||
gtk_grid_attach (GTK_GRID (grid), create_icon (), left, top, 1, 1);
|
gtk_grid_attach (GTK_GRID (grid), create_icon (), left, top, 1, 1);
|
||||||
|
|
||||||
hincrement = 0;
|
hincrement = 0;
|
||||||
|
vincrement = 5;
|
||||||
|
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
|
||||||
GTK_POLICY_NEVER,
|
GTK_POLICY_NEVER,
|
||||||
@@ -100,6 +101,7 @@ populate_text (gboolean hilight)
|
|||||||
gtk_text_view_set_buffer (GTK_TEXT_VIEW (textview), buffer);
|
gtk_text_view_set_buffer (GTK_TEXT_VIEW (textview), buffer);
|
||||||
|
|
||||||
hincrement = 0;
|
hincrement = 0;
|
||||||
|
vincrement = 5;
|
||||||
|
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
|
||||||
GTK_POLICY_NEVER,
|
GTK_POLICY_NEVER,
|
||||||
@@ -124,6 +126,7 @@ populate_image (void)
|
|||||||
gtk_picture_set_can_shrink (GTK_PICTURE (image), FALSE);
|
gtk_picture_set_can_shrink (GTK_PICTURE (image), FALSE);
|
||||||
|
|
||||||
hincrement = 5;
|
hincrement = 5;
|
||||||
|
vincrement = 5;
|
||||||
|
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
|
||||||
GTK_POLICY_AUTOMATIC,
|
GTK_POLICY_AUTOMATIC,
|
||||||
@@ -131,6 +134,42 @@ populate_image (void)
|
|||||||
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolledwindow), image);
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolledwindow), image);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern GtkWidget *create_weather_view (void);
|
||||||
|
|
||||||
|
static void
|
||||||
|
populate_list (void)
|
||||||
|
{
|
||||||
|
GtkWidget *list;
|
||||||
|
|
||||||
|
list = create_weather_view ();
|
||||||
|
|
||||||
|
hincrement = 5;
|
||||||
|
vincrement = 0;
|
||||||
|
|
||||||
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
|
||||||
|
GTK_POLICY_AUTOMATIC,
|
||||||
|
GTK_POLICY_AUTOMATIC);
|
||||||
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolledwindow), list);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern GtkWidget *create_color_grid (void);
|
||||||
|
|
||||||
|
static void
|
||||||
|
populate_grid (void)
|
||||||
|
{
|
||||||
|
GtkWidget *list;
|
||||||
|
|
||||||
|
list = create_color_grid ();
|
||||||
|
|
||||||
|
hincrement = 0;
|
||||||
|
vincrement = 5;
|
||||||
|
|
||||||
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
|
||||||
|
GTK_POLICY_AUTOMATIC,
|
||||||
|
GTK_POLICY_AUTOMATIC);
|
||||||
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolledwindow), list);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_widget_type (int type)
|
set_widget_type (int type)
|
||||||
{
|
{
|
||||||
@@ -164,6 +203,16 @@ set_widget_type (int type)
|
|||||||
populate_image ();
|
populate_image ();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
gtk_window_set_title (GTK_WINDOW (window), "Scrolling a list");
|
||||||
|
populate_list ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
gtk_window_set_title (GTK_WINDOW (window), "Scrolling a grid");
|
||||||
|
populate_grid ();
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
@@ -209,23 +258,23 @@ do_iconscroll (GtkWidget *do_widget)
|
|||||||
|
|
||||||
builder = gtk_builder_new_from_resource ("/iconscroll/iconscroll.ui");
|
builder = gtk_builder_new_from_resource ("/iconscroll/iconscroll.ui");
|
||||||
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
|
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
g_signal_connect (window, "destroy",
|
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
scrolledwindow = GTK_WIDGET (gtk_builder_get_object (builder, "scrolledwindow"));
|
scrolledwindow = GTK_WIDGET (gtk_builder_get_object (builder, "scrolledwindow"));
|
||||||
gtk_widget_realize (window);
|
gtk_widget_realize (window);
|
||||||
hadjustment = GTK_ADJUSTMENT (gtk_builder_get_object (builder, "hadjustment"));
|
hadjustment = GTK_ADJUSTMENT (gtk_builder_get_object (builder, "hadjustment"));
|
||||||
vadjustment = GTK_ADJUSTMENT (gtk_builder_get_object (builder, "vadjustment"));
|
vadjustment = GTK_ADJUSTMENT (gtk_builder_get_object (builder, "vadjustment"));
|
||||||
set_widget_type (0);
|
set_widget_type (0);
|
||||||
|
|
||||||
|
g_object_unref (builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ home_clicked (GtkButton *item,
|
|||||||
|
|
||||||
static void close_window(void)
|
static void close_window(void)
|
||||||
{
|
{
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
window = NULL;
|
window = NULL;
|
||||||
|
|
||||||
g_object_unref (file_pixbuf);
|
g_object_unref (file_pixbuf);
|
||||||
@@ -266,24 +266,24 @@ do_iconview (GtkWidget *do_widget)
|
|||||||
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
||||||
|
|
||||||
tool_bar = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
tool_bar = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), tool_bar);
|
gtk_box_append (GTK_BOX (vbox), tool_bar);
|
||||||
|
|
||||||
up_button = gtk_button_new_with_mnemonic ("_Up");
|
up_button = gtk_button_new_with_mnemonic ("_Up");
|
||||||
gtk_widget_set_sensitive (GTK_WIDGET (up_button), FALSE);
|
gtk_widget_set_sensitive (GTK_WIDGET (up_button), FALSE);
|
||||||
gtk_container_add (GTK_CONTAINER (tool_bar), up_button);
|
gtk_box_append (GTK_BOX (tool_bar), up_button);
|
||||||
|
|
||||||
home_button = gtk_button_new_with_mnemonic ("_Home");
|
home_button = gtk_button_new_with_mnemonic ("_Home");
|
||||||
gtk_container_add (GTK_CONTAINER (tool_bar), home_button);
|
gtk_box_append (GTK_BOX (tool_bar), home_button);
|
||||||
|
|
||||||
|
|
||||||
sw = gtk_scrolled_window_new (NULL, NULL);
|
sw = gtk_scrolled_window_new ();
|
||||||
gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (sw), TRUE);
|
gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (sw), TRUE);
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
||||||
GTK_POLICY_AUTOMATIC,
|
GTK_POLICY_AUTOMATIC,
|
||||||
GTK_POLICY_AUTOMATIC);
|
GTK_POLICY_AUTOMATIC);
|
||||||
gtk_widget_set_vexpand (sw, TRUE);
|
gtk_widget_set_vexpand (sw, TRUE);
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), sw);
|
gtk_box_append (GTK_BOX (vbox), sw);
|
||||||
|
|
||||||
/* Create the store and fill it with the contents of '/' */
|
/* Create the store and fill it with the contents of '/' */
|
||||||
parent = g_strdup ("/");
|
parent = g_strdup ("/");
|
||||||
@@ -320,7 +320,7 @@ do_iconview (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,9 +111,7 @@ do_iconview_edit (GtkWidget *do_widget)
|
|||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Editing and Drag-and-Drop");
|
gtk_window_set_title (GTK_WINDOW (window), "Editing and Drag-and-Drop");
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
g_signal_connect (window, "destroy",
|
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
store = create_store ();
|
store = create_store ();
|
||||||
fill_store (store);
|
fill_store (store);
|
||||||
@@ -152,7 +150,7 @@ do_iconview_edit (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ progressive_timeout (gpointer data)
|
|||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
|
|
||||||
g_signal_connect (dialog, "response",
|
g_signal_connect (dialog, "response",
|
||||||
G_CALLBACK (gtk_widget_destroy), NULL);
|
G_CALLBACK (gtk_window_destroy), NULL);
|
||||||
|
|
||||||
g_object_unref (image_stream);
|
g_object_unref (image_stream);
|
||||||
image_stream = NULL;
|
image_stream = NULL;
|
||||||
@@ -119,7 +119,7 @@ progressive_timeout (gpointer data)
|
|||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
|
|
||||||
g_signal_connect (dialog, "response",
|
g_signal_connect (dialog, "response",
|
||||||
G_CALLBACK (gtk_widget_destroy), NULL);
|
G_CALLBACK (gtk_window_destroy), NULL);
|
||||||
|
|
||||||
g_object_unref (image_stream);
|
g_object_unref (image_stream);
|
||||||
image_stream = NULL;
|
image_stream = NULL;
|
||||||
@@ -152,7 +152,7 @@ progressive_timeout (gpointer data)
|
|||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
|
|
||||||
g_signal_connect (dialog, "response",
|
g_signal_connect (dialog, "response",
|
||||||
G_CALLBACK (gtk_widget_destroy), NULL);
|
G_CALLBACK (gtk_window_destroy), NULL);
|
||||||
|
|
||||||
gtk_widget_show (dialog);
|
gtk_widget_show (dialog);
|
||||||
|
|
||||||
@@ -189,7 +189,7 @@ progressive_timeout (gpointer data)
|
|||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
|
|
||||||
g_signal_connect (dialog, "response",
|
g_signal_connect (dialog, "response",
|
||||||
G_CALLBACK (gtk_widget_destroy), NULL);
|
G_CALLBACK (gtk_window_destroy), NULL);
|
||||||
|
|
||||||
gtk_widget_show (dialog);
|
gtk_widget_show (dialog);
|
||||||
|
|
||||||
@@ -223,7 +223,7 @@ progressive_timeout (gpointer data)
|
|||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
|
|
||||||
g_signal_connect (dialog, "response",
|
g_signal_connect (dialog, "response",
|
||||||
G_CALLBACK (gtk_widget_destroy), NULL);
|
G_CALLBACK (gtk_window_destroy), NULL);
|
||||||
|
|
||||||
gtk_widget_show (dialog);
|
gtk_widget_show (dialog);
|
||||||
|
|
||||||
@@ -293,24 +293,16 @@ static void
|
|||||||
toggle_sensitivity_callback (GtkWidget *togglebutton,
|
toggle_sensitivity_callback (GtkWidget *togglebutton,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GtkContainer *container = user_data;
|
GtkWidget *child;
|
||||||
GList *list;
|
|
||||||
GList *tmp;
|
|
||||||
|
|
||||||
list = gtk_container_get_children (container);
|
for (child = gtk_widget_get_first_child (GTK_WIDGET (user_data));
|
||||||
|
child != NULL;
|
||||||
tmp = list;
|
child = gtk_widget_get_next_sibling (child))
|
||||||
while (tmp != NULL)
|
|
||||||
{
|
{
|
||||||
/* don't disable our toggle */
|
/* don't disable our toggle */
|
||||||
if (GTK_WIDGET (tmp->data) != togglebutton)
|
if (child != togglebutton)
|
||||||
gtk_widget_set_sensitive (GTK_WIDGET (tmp->data),
|
gtk_widget_set_sensitive (child, !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (togglebutton)));
|
||||||
!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (togglebutton)));
|
|
||||||
|
|
||||||
tmp = tmp->next;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_list_free (list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -335,9 +327,8 @@ do_images (GtkWidget *do_widget)
|
|||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Images");
|
gtk_window_set_title (GTK_WINDOW (window), "Images");
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
|
|
||||||
g_signal_connect (window, "destroy",
|
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
g_signal_connect (window, "destroy",
|
g_signal_connect (window, "destroy",
|
||||||
G_CALLBACK (cleanup_callback), NULL);
|
G_CALLBACK (cleanup_callback), NULL);
|
||||||
|
|
||||||
@@ -349,20 +340,20 @@ do_images (GtkWidget *do_widget)
|
|||||||
gtk_window_set_child (GTK_WINDOW (window), base_vbox);
|
gtk_window_set_child (GTK_WINDOW (window), base_vbox);
|
||||||
|
|
||||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 16);
|
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 16);
|
||||||
gtk_container_add (GTK_CONTAINER (base_vbox), hbox);
|
gtk_box_append (GTK_BOX (base_vbox), hbox);
|
||||||
|
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), vbox);
|
gtk_box_append (GTK_BOX (hbox), vbox);
|
||||||
|
|
||||||
label = gtk_label_new (NULL);
|
label = gtk_label_new (NULL);
|
||||||
gtk_label_set_markup (GTK_LABEL (label),
|
gtk_label_set_markup (GTK_LABEL (label),
|
||||||
"<u>Image loaded from a file</u>");
|
"<u>Image loaded from a file</u>");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
frame = gtk_frame_new (NULL);
|
frame = gtk_frame_new (NULL);
|
||||||
gtk_widget_set_halign (frame, GTK_ALIGN_CENTER);
|
gtk_widget_set_halign (frame, GTK_ALIGN_CENTER);
|
||||||
gtk_widget_set_valign (frame, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign (frame, GTK_ALIGN_CENTER);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), frame);
|
gtk_box_append (GTK_BOX (vbox), frame);
|
||||||
|
|
||||||
image = gtk_image_new_from_icon_name ("gtk3-demo");
|
image = gtk_image_new_from_icon_name ("gtk3-demo");
|
||||||
gtk_image_set_icon_size (GTK_IMAGE (image), GTK_ICON_SIZE_LARGE);
|
gtk_image_set_icon_size (GTK_IMAGE (image), GTK_ICON_SIZE_LARGE);
|
||||||
@@ -375,12 +366,12 @@ do_images (GtkWidget *do_widget)
|
|||||||
label = gtk_label_new (NULL);
|
label = gtk_label_new (NULL);
|
||||||
gtk_label_set_markup (GTK_LABEL (label),
|
gtk_label_set_markup (GTK_LABEL (label),
|
||||||
"<u>Animation loaded from a file</u>");
|
"<u>Animation loaded from a file</u>");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
frame = gtk_frame_new (NULL);
|
frame = gtk_frame_new (NULL);
|
||||||
gtk_widget_set_halign (frame, GTK_ALIGN_CENTER);
|
gtk_widget_set_halign (frame, GTK_ALIGN_CENTER);
|
||||||
gtk_widget_set_valign (frame, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign (frame, GTK_ALIGN_CENTER);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), frame);
|
gtk_box_append (GTK_BOX (vbox), frame);
|
||||||
|
|
||||||
picture = gtk_picture_new_for_resource ("/images/floppybuddy.gif");
|
picture = gtk_picture_new_for_resource ("/images/floppybuddy.gif");
|
||||||
|
|
||||||
@@ -391,12 +382,12 @@ do_images (GtkWidget *do_widget)
|
|||||||
label = gtk_label_new (NULL);
|
label = gtk_label_new (NULL);
|
||||||
gtk_label_set_markup (GTK_LABEL (label),
|
gtk_label_set_markup (GTK_LABEL (label),
|
||||||
"<u>Symbolic themed icon</u>");
|
"<u>Symbolic themed icon</u>");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
frame = gtk_frame_new (NULL);
|
frame = gtk_frame_new (NULL);
|
||||||
gtk_widget_set_halign (frame, GTK_ALIGN_CENTER);
|
gtk_widget_set_halign (frame, GTK_ALIGN_CENTER);
|
||||||
gtk_widget_set_valign (frame, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign (frame, GTK_ALIGN_CENTER);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), frame);
|
gtk_box_append (GTK_BOX (vbox), frame);
|
||||||
|
|
||||||
gicon = g_themed_icon_new_with_default_fallbacks ("battery-caution-charging-symbolic");
|
gicon = g_themed_icon_new_with_default_fallbacks ("battery-caution-charging-symbolic");
|
||||||
image = gtk_image_new_from_gicon (gicon);
|
image = gtk_image_new_from_gicon (gicon);
|
||||||
@@ -407,17 +398,17 @@ do_images (GtkWidget *do_widget)
|
|||||||
|
|
||||||
/* Progressive */
|
/* Progressive */
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), vbox);
|
gtk_box_append (GTK_BOX (hbox), vbox);
|
||||||
|
|
||||||
label = gtk_label_new (NULL);
|
label = gtk_label_new (NULL);
|
||||||
gtk_label_set_markup (GTK_LABEL (label),
|
gtk_label_set_markup (GTK_LABEL (label),
|
||||||
"<u>Progressive image loading</u>");
|
"<u>Progressive image loading</u>");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
frame = gtk_frame_new (NULL);
|
frame = gtk_frame_new (NULL);
|
||||||
gtk_widget_set_halign (frame, GTK_ALIGN_CENTER);
|
gtk_widget_set_halign (frame, GTK_ALIGN_CENTER);
|
||||||
gtk_widget_set_valign (frame, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign (frame, GTK_ALIGN_CENTER);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), frame);
|
gtk_box_append (GTK_BOX (vbox), frame);
|
||||||
|
|
||||||
/* Create an empty image for now; the progressive loader
|
/* Create an empty image for now; the progressive loader
|
||||||
* will create the pixbuf and fill it in.
|
* will create the pixbuf and fill it in.
|
||||||
@@ -429,17 +420,17 @@ do_images (GtkWidget *do_widget)
|
|||||||
|
|
||||||
/* Video */
|
/* Video */
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), vbox);
|
gtk_box_append (GTK_BOX (hbox), vbox);
|
||||||
|
|
||||||
label = gtk_label_new (NULL);
|
label = gtk_label_new (NULL);
|
||||||
gtk_label_set_markup (GTK_LABEL (label),
|
gtk_label_set_markup (GTK_LABEL (label),
|
||||||
"<u>Displaying video</u>");
|
"<u>Displaying video</u>");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
frame = gtk_frame_new (NULL);
|
frame = gtk_frame_new (NULL);
|
||||||
gtk_widget_set_halign (frame, GTK_ALIGN_CENTER);
|
gtk_widget_set_halign (frame, GTK_ALIGN_CENTER);
|
||||||
gtk_widget_set_valign (frame, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign (frame, GTK_ALIGN_CENTER);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), frame);
|
gtk_box_append (GTK_BOX (vbox), frame);
|
||||||
|
|
||||||
video = gtk_video_new_for_resource ("/images/gtk-logo.webm");
|
video = gtk_video_new_for_resource ("/images/gtk-logo.webm");
|
||||||
gtk_media_stream_set_loop (gtk_video_get_media_stream (GTK_VIDEO (video)), TRUE);
|
gtk_media_stream_set_loop (gtk_video_get_media_stream (GTK_VIDEO (video)), TRUE);
|
||||||
@@ -447,22 +438,22 @@ do_images (GtkWidget *do_widget)
|
|||||||
|
|
||||||
/* Widget paintables */
|
/* Widget paintables */
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), vbox);
|
gtk_box_append (GTK_BOX (hbox), vbox);
|
||||||
|
|
||||||
label = gtk_label_new (NULL);
|
label = gtk_label_new (NULL);
|
||||||
gtk_label_set_markup (GTK_LABEL (label),
|
gtk_label_set_markup (GTK_LABEL (label),
|
||||||
"<u>GtkWidgetPaintable</u>");
|
"<u>GtkWidgetPaintable</u>");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
paintable = gtk_widget_paintable_new (do_widget);
|
paintable = gtk_widget_paintable_new (do_widget);
|
||||||
picture = gtk_picture_new_for_paintable (paintable);
|
picture = gtk_picture_new_for_paintable (paintable);
|
||||||
gtk_widget_set_size_request (picture, 100, 100);
|
gtk_widget_set_size_request (picture, 100, 100);
|
||||||
gtk_widget_set_valign (picture, GTK_ALIGN_START);
|
gtk_widget_set_valign (picture, GTK_ALIGN_START);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), picture);
|
gtk_box_append (GTK_BOX (vbox), picture);
|
||||||
|
|
||||||
/* Sensitivity control */
|
/* Sensitivity control */
|
||||||
button = gtk_toggle_button_new_with_mnemonic ("_Insensitive");
|
button = gtk_toggle_button_new_with_mnemonic ("_Insensitive");
|
||||||
gtk_container_add (GTK_CONTAINER (base_vbox), button);
|
gtk_box_append (GTK_BOX (base_vbox), button);
|
||||||
|
|
||||||
g_signal_connect (button, "toggled",
|
g_signal_connect (button, "toggled",
|
||||||
G_CALLBACK (toggle_sensitivity_callback),
|
G_CALLBACK (toggle_sensitivity_callback),
|
||||||
@@ -472,7 +463,7 @@ do_images (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,10 +29,8 @@ on_bar_response (GtkInfoBar *info_bar,
|
|||||||
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
|
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
|
||||||
"Your response has id %d", response_id);
|
"Your response has id %d", response_id);
|
||||||
|
|
||||||
g_signal_connect_swapped (dialog,
|
g_signal_connect_swapped (dialog, "response",
|
||||||
"response",
|
G_CALLBACK (gtk_window_destroy), dialog);
|
||||||
G_CALLBACK (gtk_widget_destroy),
|
|
||||||
dialog);
|
|
||||||
|
|
||||||
gtk_widget_show (dialog);
|
gtk_widget_show (dialog);
|
||||||
}
|
}
|
||||||
@@ -58,8 +56,7 @@ do_infobar (GtkWidget *do_widget)
|
|||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Info Bars");
|
gtk_window_set_title (GTK_WINDOW (window), "Info Bars");
|
||||||
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
|
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
gtk_widget_set_margin_start (vbox, 8);
|
gtk_widget_set_margin_start (vbox, 8);
|
||||||
@@ -69,73 +66,73 @@ do_infobar (GtkWidget *do_widget)
|
|||||||
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
||||||
|
|
||||||
bar = gtk_info_bar_new ();
|
bar = gtk_info_bar_new ();
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), bar);
|
gtk_box_append (GTK_BOX (vbox), bar);
|
||||||
gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_INFO);
|
gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_INFO);
|
||||||
label = gtk_label_new ("This is an info bar with message type GTK_MESSAGE_INFO");
|
label = gtk_label_new ("This is an info bar with message type GTK_MESSAGE_INFO");
|
||||||
gtk_label_set_wrap (GTK_LABEL (label), TRUE);
|
gtk_label_set_wrap (GTK_LABEL (label), TRUE);
|
||||||
gtk_label_set_xalign (GTK_LABEL (label), 0);
|
gtk_label_set_xalign (GTK_LABEL (label), 0);
|
||||||
gtk_container_add (GTK_CONTAINER (bar), label);
|
gtk_info_bar_add_child (GTK_INFO_BAR (bar), label);
|
||||||
|
|
||||||
button = gtk_toggle_button_new_with_label ("Message");
|
button = gtk_toggle_button_new_with_label ("Message");
|
||||||
g_object_bind_property (bar, "revealed", button, "active", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
g_object_bind_property (bar, "revealed", button, "active", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
||||||
gtk_container_add (GTK_CONTAINER (actions), button);
|
gtk_box_append (GTK_BOX (actions), button);
|
||||||
|
|
||||||
bar = gtk_info_bar_new ();
|
bar = gtk_info_bar_new ();
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), bar);
|
gtk_box_append (GTK_BOX (vbox), bar);
|
||||||
gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_WARNING);
|
gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_WARNING);
|
||||||
label = gtk_label_new ("This is an info bar with message type GTK_MESSAGE_WARNING");
|
label = gtk_label_new ("This is an info bar with message type GTK_MESSAGE_WARNING");
|
||||||
gtk_label_set_wrap (GTK_LABEL (label), TRUE);
|
gtk_label_set_wrap (GTK_LABEL (label), TRUE);
|
||||||
gtk_label_set_xalign (GTK_LABEL (label), 0);
|
gtk_label_set_xalign (GTK_LABEL (label), 0);
|
||||||
gtk_container_add (GTK_CONTAINER (bar), label);
|
gtk_info_bar_add_child (GTK_INFO_BAR (bar), label);
|
||||||
|
|
||||||
button = gtk_toggle_button_new_with_label ("Warning");
|
button = gtk_toggle_button_new_with_label ("Warning");
|
||||||
g_object_bind_property (bar, "revealed", button, "active", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
g_object_bind_property (bar, "revealed", button, "active", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
||||||
gtk_container_add (GTK_CONTAINER (actions), button);
|
gtk_box_append (GTK_BOX (actions), button);
|
||||||
|
|
||||||
bar = gtk_info_bar_new_with_buttons (_("_OK"), GTK_RESPONSE_OK, NULL);
|
bar = gtk_info_bar_new_with_buttons (_("_OK"), GTK_RESPONSE_OK, NULL);
|
||||||
gtk_info_bar_set_show_close_button (GTK_INFO_BAR (bar), TRUE);
|
gtk_info_bar_set_show_close_button (GTK_INFO_BAR (bar), TRUE);
|
||||||
g_signal_connect (bar, "response", G_CALLBACK (on_bar_response), window);
|
g_signal_connect (bar, "response", G_CALLBACK (on_bar_response), window);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), bar);
|
gtk_box_append (GTK_BOX (vbox), bar);
|
||||||
gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_QUESTION);
|
gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_QUESTION);
|
||||||
label = gtk_label_new ("This is an info bar with message type GTK_MESSAGE_QUESTION");
|
label = gtk_label_new ("This is an info bar with message type GTK_MESSAGE_QUESTION");
|
||||||
gtk_label_set_wrap (GTK_LABEL (label), TRUE);
|
gtk_label_set_wrap (GTK_LABEL (label), TRUE);
|
||||||
gtk_label_set_xalign (GTK_LABEL (label), 0);
|
gtk_label_set_xalign (GTK_LABEL (label), 0);
|
||||||
gtk_container_add (GTK_CONTAINER (bar), label);
|
gtk_info_bar_add_child (GTK_INFO_BAR (bar), label);
|
||||||
gtk_info_bar_set_default_response (GTK_INFO_BAR (bar), GTK_RESPONSE_OK);
|
gtk_info_bar_set_default_response (GTK_INFO_BAR (bar), GTK_RESPONSE_OK);
|
||||||
|
|
||||||
button = gtk_toggle_button_new_with_label ("Question");
|
button = gtk_toggle_button_new_with_label ("Question");
|
||||||
g_object_bind_property (bar, "revealed", button, "active", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
g_object_bind_property (bar, "revealed", button, "active", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
||||||
gtk_container_add (GTK_CONTAINER (actions), button);
|
gtk_box_append (GTK_BOX (actions), button);
|
||||||
|
|
||||||
bar = gtk_info_bar_new ();
|
bar = gtk_info_bar_new ();
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), bar);
|
gtk_box_append (GTK_BOX (vbox), bar);
|
||||||
gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_ERROR);
|
gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_ERROR);
|
||||||
label = gtk_label_new ("This is an info bar with message type GTK_MESSAGE_ERROR");
|
label = gtk_label_new ("This is an info bar with message type GTK_MESSAGE_ERROR");
|
||||||
gtk_label_set_wrap (GTK_LABEL (label), TRUE);
|
gtk_label_set_wrap (GTK_LABEL (label), TRUE);
|
||||||
gtk_label_set_xalign (GTK_LABEL (label), 0);
|
gtk_label_set_xalign (GTK_LABEL (label), 0);
|
||||||
gtk_container_add (GTK_CONTAINER (bar), label);
|
gtk_info_bar_add_child (GTK_INFO_BAR (bar), label);
|
||||||
|
|
||||||
button = gtk_toggle_button_new_with_label ("Error");
|
button = gtk_toggle_button_new_with_label ("Error");
|
||||||
g_object_bind_property (bar, "revealed", button, "active", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
g_object_bind_property (bar, "revealed", button, "active", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER (actions), button);
|
gtk_box_append (GTK_BOX (actions), button);
|
||||||
|
|
||||||
bar = gtk_info_bar_new ();
|
bar = gtk_info_bar_new ();
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), bar);
|
gtk_box_append (GTK_BOX (vbox), bar);
|
||||||
gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_OTHER);
|
gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_OTHER);
|
||||||
label = gtk_label_new ("This is an info bar with message type GTK_MESSAGE_OTHER");
|
label = gtk_label_new ("This is an info bar with message type GTK_MESSAGE_OTHER");
|
||||||
gtk_label_set_wrap (GTK_LABEL (label), TRUE);
|
gtk_label_set_wrap (GTK_LABEL (label), TRUE);
|
||||||
gtk_label_set_xalign (GTK_LABEL (label), 0);
|
gtk_label_set_xalign (GTK_LABEL (label), 0);
|
||||||
gtk_container_add (GTK_CONTAINER (bar), label);
|
gtk_info_bar_add_child (GTK_INFO_BAR (bar), label);
|
||||||
|
|
||||||
button = gtk_toggle_button_new_with_label ("Other");
|
button = gtk_toggle_button_new_with_label ("Other");
|
||||||
g_object_bind_property (bar, "revealed", button, "active", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
g_object_bind_property (bar, "revealed", button, "active", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
||||||
gtk_container_add (GTK_CONTAINER (actions), button);
|
gtk_box_append (GTK_BOX (actions), button);
|
||||||
|
|
||||||
frame = gtk_frame_new ("An example of different info bars");
|
frame = gtk_frame_new ("An example of different info bars");
|
||||||
gtk_widget_set_margin_top (frame, 8);
|
gtk_widget_set_margin_top (frame, 8);
|
||||||
gtk_widget_set_margin_bottom (frame, 8);
|
gtk_widget_set_margin_bottom (frame, 8);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), frame);
|
gtk_box_append (GTK_BOX (vbox), frame);
|
||||||
|
|
||||||
gtk_widget_set_halign (actions, GTK_ALIGN_CENTER);
|
gtk_widget_set_halign (actions, GTK_ALIGN_CENTER);
|
||||||
|
|
||||||
@@ -149,7 +146,7 @@ do_infobar (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ response_cb (GtkWidget *dialog,
|
|||||||
gint response_id,
|
gint response_id,
|
||||||
gpointer data)
|
gpointer data)
|
||||||
{
|
{
|
||||||
gtk_widget_destroy (dialog);
|
gtk_window_destroy (GTK_WINDOW (dialog));
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -59,8 +59,7 @@ do_links (GtkWidget *do_widget)
|
|||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Links");
|
gtk_window_set_title (GTK_WINDOW (window), "Links");
|
||||||
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
|
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\""
|
label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\""
|
||||||
"title=\"plain text\">text</a> may be marked up "
|
"title=\"plain text\">text</a> may be marked up "
|
||||||
@@ -88,7 +87,7 @@ do_links (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -257,9 +257,7 @@ do_list_store (GtkWidget *do_widget)
|
|||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "List Store");
|
gtk_window_set_title (GTK_WINDOW (window), "List Store");
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
g_signal_connect (window, "destroy",
|
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
|
||||||
gtk_widget_set_margin_start (vbox, 8);
|
gtk_widget_set_margin_start (vbox, 8);
|
||||||
@@ -269,14 +267,14 @@ do_list_store (GtkWidget *do_widget)
|
|||||||
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
||||||
|
|
||||||
label = gtk_label_new ("This is the bug list (note: not based on real data, it would be nice to have a nice ODBC interface to bugzilla or so, though).");
|
label = gtk_label_new ("This is the bug list (note: not based on real data, it would be nice to have a nice ODBC interface to bugzilla or so, though).");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
sw = gtk_scrolled_window_new (NULL, NULL);
|
sw = gtk_scrolled_window_new ();
|
||||||
gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (sw), TRUE);
|
gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (sw), TRUE);
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
||||||
GTK_POLICY_NEVER,
|
GTK_POLICY_NEVER,
|
||||||
GTK_POLICY_AUTOMATIC);
|
GTK_POLICY_AUTOMATIC);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), sw);
|
gtk_box_append (GTK_BOX (vbox), sw);
|
||||||
|
|
||||||
/* create tree model */
|
/* create tree model */
|
||||||
model = create_model ();
|
model = create_model ();
|
||||||
@@ -309,7 +307,7 @@ do_list_store (GtkWidget *do_widget)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
window = NULL;
|
window = NULL;
|
||||||
if (timeout != 0)
|
if (timeout != 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -236,7 +236,6 @@ reshare_clicked (GtkMessageRow *row,
|
|||||||
|
|
||||||
priv->message->n_reshares++;
|
priv->message->n_reshares++;
|
||||||
gtk_message_row_update (row);
|
gtk_message_row_update (row);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -255,11 +254,12 @@ gtk_message_row_state_flags_changed (GtkWidget *widget,
|
|||||||
{
|
{
|
||||||
GtkMessageRowPrivate *priv = GTK_MESSAGE_ROW (widget)->priv;
|
GtkMessageRowPrivate *priv = GTK_MESSAGE_ROW (widget)->priv;
|
||||||
GtkStateFlags flags;
|
GtkStateFlags flags;
|
||||||
|
gboolean visible;
|
||||||
|
|
||||||
flags = gtk_widget_get_state_flags (widget);
|
flags = gtk_widget_get_state_flags (widget);
|
||||||
|
|
||||||
gtk_widget_set_visible (priv->extra_buttons_box,
|
visible = flags & (GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_SELECTED) ? TRUE : FALSE;
|
||||||
flags & (GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_SELECTED));
|
gtk_widget_set_visible (priv->extra_buttons_box, visible);
|
||||||
|
|
||||||
GTK_WIDGET_CLASS (gtk_message_row_parent_class)->state_flags_changed (widget, previous_state_flags);
|
GTK_WIDGET_CLASS (gtk_message_row_parent_class)->state_flags_changed (widget, previous_state_flags);
|
||||||
}
|
}
|
||||||
@@ -351,22 +351,17 @@ do_listbox (GtkWidget *do_widget)
|
|||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "List Box");
|
gtk_window_set_title (GTK_WINDOW (window), "List Box");
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window),
|
gtk_window_set_default_size (GTK_WINDOW (window), 400, 600);
|
||||||
400, 600);
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
|
|
||||||
/* NULL window variable when window is closed */
|
|
||||||
g_signal_connect (window, "destroy",
|
|
||||||
G_CALLBACK (gtk_widget_destroyed),
|
|
||||||
&window);
|
|
||||||
|
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
|
||||||
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
||||||
label = gtk_label_new ("Messages from GTK and friends");
|
label = gtk_label_new ("Messages from GTK and friends");
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
scrolled = gtk_scrolled_window_new (NULL, NULL);
|
scrolled = gtk_scrolled_window_new ();
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
||||||
gtk_widget_set_vexpand (scrolled, TRUE);
|
gtk_widget_set_vexpand (scrolled, TRUE);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), scrolled);
|
gtk_box_append (GTK_BOX (vbox), scrolled);
|
||||||
listbox = gtk_list_box_new ();
|
listbox = gtk_list_box_new ();
|
||||||
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolled), listbox);
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolled), listbox);
|
||||||
|
|
||||||
@@ -382,7 +377,7 @@ do_listbox (GtkWidget *do_widget)
|
|||||||
message = gtk_message_new (lines[i]);
|
message = gtk_message_new (lines[i]);
|
||||||
row = gtk_message_row_new (message);
|
row = gtk_message_row_new (message);
|
||||||
gtk_widget_show (GTK_WIDGET (row));
|
gtk_widget_show (GTK_WIDGET (row));
|
||||||
gtk_container_add (GTK_CONTAINER (listbox), GTK_WIDGET (row));
|
gtk_list_box_insert (GTK_LIST_BOX (listbox), GTK_WIDGET (row), -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_strfreev (lines);
|
g_strfreev (lines);
|
||||||
@@ -392,7 +387,7 @@ do_listbox (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -150,7 +150,7 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton" id="favorite-buttton">
|
<object class="GtkButton" id="favorite-button">
|
||||||
<property name="label" translatable="yes">Favorite</property>
|
<property name="label" translatable="yes">Favorite</property>
|
||||||
<property name="receives-default">1</property>
|
<property name="receives-default">1</property>
|
||||||
<property name="has-frame">0</property>
|
<property name="has-frame">0</property>
|
||||||
|
|||||||
202
demos/gtk-demo/listview_applauncher.c
Normal file
202
demos/gtk-demo/listview_applauncher.c
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
/* Lists/Application launcher
|
||||||
|
*
|
||||||
|
* This demo uses the GtkListView widget as a fancy application launcher.
|
||||||
|
*
|
||||||
|
* It is also a very small introduction to listviews.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
/* This is the function that creates the #GListModel that we need.
|
||||||
|
* GTK list widgets need a #GListModel to display, as models support change
|
||||||
|
* notifications.
|
||||||
|
* Unfortunately various older APIs do not provide list models, so we create
|
||||||
|
* our own.
|
||||||
|
*/
|
||||||
|
static GListModel *
|
||||||
|
create_application_list (void)
|
||||||
|
{
|
||||||
|
GListStore *store;
|
||||||
|
GList *apps, *l;
|
||||||
|
|
||||||
|
/* We use a #GListStore here, which is a simple array-like list implementation
|
||||||
|
* for manual management.
|
||||||
|
* List models need to know what type of data they provide, so we need to
|
||||||
|
* provide the type here. As we want to do a list of applications, #GAppInfo
|
||||||
|
* is the object we provide.
|
||||||
|
*/
|
||||||
|
store = g_list_store_new (G_TYPE_APP_INFO);
|
||||||
|
|
||||||
|
apps = g_app_info_get_all ();
|
||||||
|
|
||||||
|
for (l = apps; l; l = l->next)
|
||||||
|
g_list_store_append (store, l->data);
|
||||||
|
|
||||||
|
g_list_free_full (apps, g_object_unref);
|
||||||
|
|
||||||
|
return G_LIST_MODEL (store);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is the function we use for setting up new listitems to display.
|
||||||
|
* We add just an #GtkImage and a #GtkKabel here to display the application's
|
||||||
|
* icon and name, as this is just a simple demo.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
setup_listitem_cb (GtkListItemFactory *factory,
|
||||||
|
GtkListItem *list_item)
|
||||||
|
{
|
||||||
|
GtkWidget *box;
|
||||||
|
GtkWidget *image;
|
||||||
|
GtkWidget *label;
|
||||||
|
|
||||||
|
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
|
||||||
|
image = gtk_image_new ();
|
||||||
|
gtk_image_set_icon_size (GTK_IMAGE (image), GTK_ICON_SIZE_LARGE);
|
||||||
|
gtk_box_append (GTK_BOX (box), image);
|
||||||
|
label = gtk_label_new ("");
|
||||||
|
gtk_box_append (GTK_BOX (box), label);
|
||||||
|
gtk_list_item_set_child (list_item, box);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Here we need to prepare the listitem for displaying its item. We get the
|
||||||
|
* listitem already set up from the previous function, so we can reuse the
|
||||||
|
* #GtkImage widget we set up above.
|
||||||
|
* We get the item - which we know is a #GAppInfo because it comes out of
|
||||||
|
* the model we set up above, grab its icon and display it.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
bind_listitem_cb (GtkListItemFactory *factory,
|
||||||
|
GtkListItem *list_item)
|
||||||
|
{
|
||||||
|
GtkWidget *image;
|
||||||
|
GtkWidget *label;
|
||||||
|
GAppInfo *app_info;
|
||||||
|
|
||||||
|
image = gtk_widget_get_first_child (gtk_list_item_get_child (list_item));
|
||||||
|
label = gtk_widget_get_next_sibling (image);
|
||||||
|
app_info = gtk_list_item_get_item (list_item);
|
||||||
|
|
||||||
|
gtk_image_set_from_gicon (GTK_IMAGE (image), g_app_info_get_icon (app_info));
|
||||||
|
gtk_label_set_label (GTK_LABEL (label), g_app_info_get_display_name (app_info));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In more complex code, we would also need functions to unbind and teardown
|
||||||
|
* the listitem, but this is simple code, so the default implementations are
|
||||||
|
* enough. If we had connected signals, this step would have been necessary.
|
||||||
|
*
|
||||||
|
* The #GtkSignalListItemFactory documentation contains more information about
|
||||||
|
* this step.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This function is called whenever an item in the list is activated. This is
|
||||||
|
* the simple way to allow reacting to the Enter key or double-clicking on a
|
||||||
|
* listitem.
|
||||||
|
* Of course, it is possible to use far more complex interactions by turning
|
||||||
|
* off activation and adding buttons or other widgets in the setup function
|
||||||
|
* above, but this is a simple demo, so we'll use the simple way.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
activate_cb (GtkListView *list,
|
||||||
|
guint position,
|
||||||
|
gpointer unused)
|
||||||
|
{
|
||||||
|
GAppInfo *app_info;
|
||||||
|
GdkAppLaunchContext *context;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
app_info = g_list_model_get_item (gtk_list_view_get_model (list), position);
|
||||||
|
|
||||||
|
/* Prepare the context for launching the application and launch it. This
|
||||||
|
* code is explained in detail in the documentation for #GdkAppLaunchContext
|
||||||
|
* and #GAppInfo.
|
||||||
|
*/
|
||||||
|
context = gdk_display_get_app_launch_context (gtk_widget_get_display (GTK_WIDGET (list)));
|
||||||
|
if (!g_app_info_launch (app_info,
|
||||||
|
NULL,
|
||||||
|
G_APP_LAUNCH_CONTEXT (context),
|
||||||
|
&error))
|
||||||
|
{
|
||||||
|
GtkWidget *dialog;
|
||||||
|
|
||||||
|
/* And because error handling is important, even a simple demo has it:
|
||||||
|
* We display an error dialog that something went wrong.
|
||||||
|
*/
|
||||||
|
dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (list))),
|
||||||
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
|
||||||
|
GTK_MESSAGE_ERROR,
|
||||||
|
GTK_BUTTONS_CLOSE,
|
||||||
|
"Could not launch %s", g_app_info_get_display_name (app_info));
|
||||||
|
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", error->message);
|
||||||
|
g_clear_error (&error);
|
||||||
|
gtk_widget_show (dialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_object_unref (context);
|
||||||
|
g_object_unref (app_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget *window = NULL;
|
||||||
|
|
||||||
|
GtkWidget *
|
||||||
|
do_listview_applauncher (GtkWidget *do_widget)
|
||||||
|
{
|
||||||
|
if (window == NULL)
|
||||||
|
{
|
||||||
|
GtkWidget *list, *sw;
|
||||||
|
GListModel *model;
|
||||||
|
GtkListItemFactory *factory;
|
||||||
|
|
||||||
|
/* Create a window and set a few defaults */
|
||||||
|
window = gtk_window_new ();
|
||||||
|
gtk_window_set_default_size (GTK_WINDOW (window), 640, 320);
|
||||||
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
|
gtk_widget_get_display (do_widget));
|
||||||
|
gtk_window_set_title (GTK_WINDOW (window), "Application Launcher");
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *) &window);
|
||||||
|
|
||||||
|
/* The #GtkListitemFactory is what is used to create #GtkListItems
|
||||||
|
* to display the data from the model. So it is absolutely necessary
|
||||||
|
* to create one.
|
||||||
|
* We will use a #GtkSignalListItemFactory because it is the simplest
|
||||||
|
* one to use. Different ones are available for different use cases.
|
||||||
|
* The most powerful one is #GtkBuilderListItemFactory which uses
|
||||||
|
* #GtkBuilder .ui files, so it requires little code.
|
||||||
|
*/
|
||||||
|
factory = gtk_signal_list_item_factory_new ();
|
||||||
|
g_signal_connect (factory, "setup", G_CALLBACK (setup_listitem_cb), NULL);
|
||||||
|
g_signal_connect (factory, "bind", G_CALLBACK (bind_listitem_cb), NULL);
|
||||||
|
|
||||||
|
/* Create the list widget here.
|
||||||
|
*/
|
||||||
|
list = gtk_list_view_new_with_factory (factory);
|
||||||
|
/* We connect the activate signal here. It's the function we defined
|
||||||
|
* above for launching the selected application.
|
||||||
|
*/
|
||||||
|
g_signal_connect (list, "activate", G_CALLBACK (activate_cb), NULL);
|
||||||
|
|
||||||
|
/* And of course we need to set the data model. Here we call the function
|
||||||
|
* we wrote above that gives us the list of applications. Then we set
|
||||||
|
* it on the list widget.
|
||||||
|
* The list will now take items from the model and use the factory
|
||||||
|
* to create as many listitems as it needs to show itself to the user.
|
||||||
|
*/
|
||||||
|
model = create_application_list ();
|
||||||
|
gtk_list_view_set_model (GTK_LIST_VIEW (list), model);
|
||||||
|
g_object_unref (model);
|
||||||
|
|
||||||
|
/* List widgets should always be contained in a #GtkScrolledWindow,
|
||||||
|
* because otherwise they might get too large or they might not
|
||||||
|
* be scrollable.
|
||||||
|
*/
|
||||||
|
sw = gtk_scrolled_window_new ();
|
||||||
|
gtk_window_set_child (GTK_WINDOW (window), sw);
|
||||||
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), list);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gtk_widget_get_visible (window))
|
||||||
|
gtk_widget_show (window);
|
||||||
|
else
|
||||||
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
506
demos/gtk-demo/listview_clocks.c
Normal file
506
demos/gtk-demo/listview_clocks.c
Normal file
@@ -0,0 +1,506 @@
|
|||||||
|
/* Lists/Clocks
|
||||||
|
*
|
||||||
|
* This demo displays the time in different timezones.
|
||||||
|
*
|
||||||
|
* The goal is to show how to set up expressions that track changes
|
||||||
|
* in objects and make them update widgets. For that, we create a
|
||||||
|
* GtkClock object that updates its time every second and then use
|
||||||
|
* various ways to display that time.
|
||||||
|
*
|
||||||
|
* Typically, this will be done using GtkBuilder .ui files with the
|
||||||
|
* help of the <binding> tag, but this demo shows the code that runs
|
||||||
|
* behind that.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
#define GTK_TYPE_CLOCK (gtk_clock_get_type ())
|
||||||
|
G_DECLARE_FINAL_TYPE (GtkClock, gtk_clock, GTK, CLOCK, GObject)
|
||||||
|
|
||||||
|
/* This is our object. It's just a timezone */
|
||||||
|
typedef struct _GtkClock GtkClock;
|
||||||
|
struct _GtkClock
|
||||||
|
{
|
||||||
|
GObject parent_instance;
|
||||||
|
|
||||||
|
/* We allow this to be NULL for the local timezone */
|
||||||
|
GTimeZone *timezone;
|
||||||
|
/* Name of the location we're displaying time for */
|
||||||
|
char *location;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PROP_0,
|
||||||
|
PROP_LOCATION,
|
||||||
|
PROP_TIME,
|
||||||
|
PROP_TIMEZONE,
|
||||||
|
|
||||||
|
N_PROPS
|
||||||
|
};
|
||||||
|
|
||||||
|
/* This function returns the current time in the clock's timezone.
|
||||||
|
* Note that this returns a new object every time, so we need to
|
||||||
|
* remember to unref it after use.
|
||||||
|
*/
|
||||||
|
static GDateTime *
|
||||||
|
gtk_clock_get_time (GtkClock *clock)
|
||||||
|
{
|
||||||
|
if (clock->timezone)
|
||||||
|
return g_date_time_new_now (clock->timezone);
|
||||||
|
else
|
||||||
|
return g_date_time_new_now_local ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Here, we implement the functionality required by the GdkPaintable
|
||||||
|
* interface. This way we have a trivial way to display an analog clock.
|
||||||
|
* It also allows demonstrating how to directly use objects in the
|
||||||
|
* listview later by making this object do something interesting.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
gtk_clock_snapshot (GdkPaintable *paintable,
|
||||||
|
GdkSnapshot *snapshot,
|
||||||
|
double width,
|
||||||
|
double height)
|
||||||
|
{
|
||||||
|
GtkClock *self = GTK_CLOCK (paintable);
|
||||||
|
GDateTime *time;
|
||||||
|
GskRoundedRect outline;
|
||||||
|
|
||||||
|
#define BLACK ((GdkRGBA) { 0, 0, 0, 1 })
|
||||||
|
|
||||||
|
/* save/restore() is necessary so we can undo the transforms we start
|
||||||
|
* out with.
|
||||||
|
*/
|
||||||
|
gtk_snapshot_save (snapshot);
|
||||||
|
|
||||||
|
/* First, we move the (0, 0) point to the center of the area so
|
||||||
|
* we can draw everything relative to it.
|
||||||
|
*/
|
||||||
|
gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (width / 2, height / 2));
|
||||||
|
|
||||||
|
/* Next we scale it, so that we can pretend that the clock is
|
||||||
|
* 100px in size. That way, we don't need to do any complicated
|
||||||
|
* math later. We use MIN() here so that we use the smaller
|
||||||
|
* dimension for sizing. That way we don't overdraw but keep
|
||||||
|
* the aspect ratio.
|
||||||
|
*/
|
||||||
|
gtk_snapshot_scale (snapshot, MIN (width, height) / 100.0, MIN (width, height) / 100.0);
|
||||||
|
|
||||||
|
/* Now we have a circle with diameter 100px (and radius 50px) that
|
||||||
|
* has its (0, 0) point at the center. Let's draw a simple clock into it.
|
||||||
|
*/
|
||||||
|
time = gtk_clock_get_time (self);
|
||||||
|
|
||||||
|
/* First, draw a circle. This is a neat little trick to draw a circle
|
||||||
|
* without requiring Cairo.
|
||||||
|
*/
|
||||||
|
gsk_rounded_rect_init_from_rect (&outline, &GRAPHENE_RECT_INIT(-50, -50, 100, 100), 50);
|
||||||
|
gtk_snapshot_append_border (snapshot,
|
||||||
|
&outline,
|
||||||
|
(float[4]) { 4, 4, 4, 4 },
|
||||||
|
(GdkRGBA [4]) { BLACK, BLACK, BLACK, BLACK });
|
||||||
|
|
||||||
|
/* Next, draw the hour hand.
|
||||||
|
* We do this using tranforms again: Instead of computing where the angle
|
||||||
|
* points to, we just rotate everything and then draw the hand as if it
|
||||||
|
* was :00. We don't even need to care about am/pm here because rotations
|
||||||
|
* just work.
|
||||||
|
*/
|
||||||
|
gtk_snapshot_save (snapshot);
|
||||||
|
gtk_snapshot_rotate (snapshot, 30 * g_date_time_get_hour (time) + 0.5 * g_date_time_get_minute (time));
|
||||||
|
gsk_rounded_rect_init_from_rect (&outline, &GRAPHENE_RECT_INIT(-2, -23, 4, 25), 2);
|
||||||
|
gtk_snapshot_push_rounded_clip (snapshot, &outline);
|
||||||
|
gtk_snapshot_append_color (snapshot, &BLACK, &outline.bounds);
|
||||||
|
gtk_snapshot_pop (snapshot);
|
||||||
|
gtk_snapshot_restore (snapshot);
|
||||||
|
|
||||||
|
/* And the same as above for the minute hand. Just make this one longer
|
||||||
|
* so people can tell the hands apart.
|
||||||
|
*/
|
||||||
|
gtk_snapshot_save (snapshot);
|
||||||
|
gtk_snapshot_rotate (snapshot, 6 * g_date_time_get_minute (time));
|
||||||
|
gsk_rounded_rect_init_from_rect (&outline, &GRAPHENE_RECT_INIT(-2, -43, 4, 45), 2);
|
||||||
|
gtk_snapshot_push_rounded_clip (snapshot, &outline);
|
||||||
|
gtk_snapshot_append_color (snapshot, &BLACK, &outline.bounds);
|
||||||
|
gtk_snapshot_pop (snapshot);
|
||||||
|
gtk_snapshot_restore (snapshot);
|
||||||
|
|
||||||
|
/* and finally, the second indicator. */
|
||||||
|
gtk_snapshot_save (snapshot);
|
||||||
|
gtk_snapshot_rotate (snapshot, 6 * g_date_time_get_second (time));
|
||||||
|
gsk_rounded_rect_init_from_rect (&outline, &GRAPHENE_RECT_INIT(-2, -43, 4, 10), 2);
|
||||||
|
gtk_snapshot_push_rounded_clip (snapshot, &outline);
|
||||||
|
gtk_snapshot_append_color (snapshot, &BLACK, &outline.bounds);
|
||||||
|
gtk_snapshot_pop (snapshot);
|
||||||
|
gtk_snapshot_restore (snapshot);
|
||||||
|
|
||||||
|
/* And finally, don't forget to restore the initial save() that
|
||||||
|
* we did for the initial transformations.
|
||||||
|
*/
|
||||||
|
gtk_snapshot_restore (snapshot);
|
||||||
|
|
||||||
|
g_date_time_unref (time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Our desired size is 100px. That sounds okay for an analog clock */
|
||||||
|
static int
|
||||||
|
gtk_clock_get_intrinsic_width (GdkPaintable *paintable)
|
||||||
|
{
|
||||||
|
return 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
gtk_clock_get_intrinsic_height (GdkPaintable *paintable)
|
||||||
|
{
|
||||||
|
return 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize the paintable interface. This way we turn our clocks
|
||||||
|
* into objects that can be drawn. There are more functions to this
|
||||||
|
* interface to define desired size, but this is enough.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
gtk_clock_paintable_init (GdkPaintableInterface *iface)
|
||||||
|
{
|
||||||
|
iface->snapshot = gtk_clock_snapshot;
|
||||||
|
iface->get_intrinsic_width = gtk_clock_get_intrinsic_width;
|
||||||
|
iface->get_intrinsic_height = gtk_clock_get_intrinsic_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finally, we define the type. The important part is adding the
|
||||||
|
* paintable interface, so GTK knows that this object can indeed
|
||||||
|
* be drawn.
|
||||||
|
*/
|
||||||
|
G_DEFINE_TYPE_WITH_CODE (GtkClock, gtk_clock, G_TYPE_OBJECT,
|
||||||
|
G_IMPLEMENT_INTERFACE (GDK_TYPE_PAINTABLE,
|
||||||
|
gtk_clock_paintable_init))
|
||||||
|
|
||||||
|
static GParamSpec *properties[N_PROPS] = { NULL, };
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_clock_get_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
GtkClock *self = GTK_CLOCK (object);
|
||||||
|
|
||||||
|
switch (property_id)
|
||||||
|
{
|
||||||
|
case PROP_LOCATION:
|
||||||
|
g_value_set_string (value, self->location);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_TIME:
|
||||||
|
g_value_take_boxed (value, gtk_clock_get_time (self));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_TIMEZONE:
|
||||||
|
g_value_set_boxed (value, self->timezone);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_clock_set_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
const GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
GtkClock *self = GTK_CLOCK (object);
|
||||||
|
|
||||||
|
switch (property_id)
|
||||||
|
{
|
||||||
|
case PROP_LOCATION:
|
||||||
|
self->location = g_value_dup_string (value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_TIMEZONE:
|
||||||
|
self->timezone = g_value_dup_boxed (value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is the list of all the ticking clocks */
|
||||||
|
static GSList *ticking_clocks = NULL;
|
||||||
|
|
||||||
|
/* This is the ID of the timeout source that is updating all
|
||||||
|
* ticking clocks.
|
||||||
|
*/
|
||||||
|
static guint ticking_clock_id = 0;
|
||||||
|
|
||||||
|
/* Every second, this function is called to tell everybody that
|
||||||
|
* the clocks are ticking.
|
||||||
|
*/
|
||||||
|
static gboolean
|
||||||
|
gtk_clock_tick (gpointer unused)
|
||||||
|
{
|
||||||
|
GSList *l;
|
||||||
|
|
||||||
|
for (l = ticking_clocks; l; l = l->next)
|
||||||
|
{
|
||||||
|
GtkClock *clock = l->data;
|
||||||
|
|
||||||
|
/* We will now return a different value for the time property,
|
||||||
|
* so notify about that.
|
||||||
|
*/
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (clock), properties[PROP_TIME]);
|
||||||
|
|
||||||
|
/* We will also draw the hands of the clock differently.
|
||||||
|
* So notify about that, too.
|
||||||
|
*/
|
||||||
|
gdk_paintable_invalidate_contents (GDK_PAINTABLE (clock));
|
||||||
|
}
|
||||||
|
|
||||||
|
return G_SOURCE_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_clock_stop_ticking (GtkClock *self)
|
||||||
|
{
|
||||||
|
ticking_clocks = g_slist_remove (ticking_clocks, self);
|
||||||
|
|
||||||
|
/* If no clock is remaining, stop running the tick updates */
|
||||||
|
if (ticking_clocks == NULL && ticking_clock_id != 0)
|
||||||
|
g_clear_handle_id (&ticking_clock_id, g_source_remove);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_clock_start_ticking (GtkClock *self)
|
||||||
|
{
|
||||||
|
/* if no clock is ticking yet, start */
|
||||||
|
if (ticking_clock_id == 0)
|
||||||
|
ticking_clock_id = g_timeout_add_seconds (1, gtk_clock_tick, NULL);
|
||||||
|
|
||||||
|
ticking_clocks = g_slist_prepend (ticking_clocks, self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_clock_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
GtkClock *self = GTK_CLOCK (object);
|
||||||
|
|
||||||
|
gtk_clock_stop_ticking (self);
|
||||||
|
|
||||||
|
g_free (self->location);
|
||||||
|
g_clear_pointer (&self->timezone, g_time_zone_unref);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (gtk_clock_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_clock_class_init (GtkClockClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
gobject_class->get_property = gtk_clock_get_property;
|
||||||
|
gobject_class->set_property = gtk_clock_set_property;
|
||||||
|
gobject_class->finalize = gtk_clock_finalize;
|
||||||
|
|
||||||
|
properties[PROP_LOCATION] =
|
||||||
|
g_param_spec_string ("location", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||||
|
properties[PROP_TIME] =
|
||||||
|
g_param_spec_boxed ("time", NULL, NULL, G_TYPE_DATE_TIME, G_PARAM_READABLE);
|
||||||
|
properties[PROP_TIMEZONE] =
|
||||||
|
g_param_spec_boxed ("timezone", NULL, NULL, G_TYPE_TIME_ZONE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||||
|
|
||||||
|
g_object_class_install_properties (gobject_class, N_PROPS, properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_clock_init (GtkClock *self)
|
||||||
|
{
|
||||||
|
gtk_clock_start_ticking (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkClock *
|
||||||
|
gtk_clock_new (const char *location,
|
||||||
|
GTimeZone *_tz)
|
||||||
|
{
|
||||||
|
GtkClock *result;
|
||||||
|
|
||||||
|
result = g_object_new (GTK_TYPE_CLOCK,
|
||||||
|
"location", location,
|
||||||
|
"timezone", _tz,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
g_clear_pointer (&_tz, g_time_zone_unref);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GListModel *
|
||||||
|
create_clocks_model (void)
|
||||||
|
{
|
||||||
|
GListStore *result;
|
||||||
|
GtkClock *clock;
|
||||||
|
|
||||||
|
result = g_list_store_new (GTK_TYPE_CLOCK);
|
||||||
|
|
||||||
|
/* local time */
|
||||||
|
clock = gtk_clock_new ("local", NULL);
|
||||||
|
g_list_store_append (result, clock);
|
||||||
|
g_object_unref (clock);
|
||||||
|
/* UTC time */
|
||||||
|
clock = gtk_clock_new ("UTC", g_time_zone_new_utc ());
|
||||||
|
g_list_store_append (result, clock);
|
||||||
|
g_object_unref (clock);
|
||||||
|
/* A bunch of timezones with GTK hackers */
|
||||||
|
clock = gtk_clock_new ("San Francisco", g_time_zone_new ("America/Los_Angeles"));
|
||||||
|
g_list_store_append (result, clock);
|
||||||
|
g_object_unref (clock);
|
||||||
|
clock = gtk_clock_new ("Xalapa", g_time_zone_new ("America/Mexico_City"));
|
||||||
|
g_list_store_append (result, clock);
|
||||||
|
g_object_unref (clock);
|
||||||
|
clock = gtk_clock_new ("Boston", g_time_zone_new ("America/New_York"));
|
||||||
|
g_list_store_append (result, clock);
|
||||||
|
g_object_unref (clock);
|
||||||
|
clock = gtk_clock_new ("London", g_time_zone_new ("Europe/London"));
|
||||||
|
g_list_store_append (result, clock);
|
||||||
|
g_object_unref (clock);
|
||||||
|
clock = gtk_clock_new ("Berlin", g_time_zone_new ("Europe/Berlin"));
|
||||||
|
g_list_store_append (result, clock);
|
||||||
|
g_object_unref (clock);
|
||||||
|
clock = gtk_clock_new ("Moscow", g_time_zone_new ("Europe/Moscow"));
|
||||||
|
g_list_store_append (result, clock);
|
||||||
|
g_object_unref (clock);
|
||||||
|
clock = gtk_clock_new ("New Delhi", g_time_zone_new ("Asia/Kolkata"));
|
||||||
|
g_list_store_append (result, clock);
|
||||||
|
g_object_unref (clock);
|
||||||
|
clock = gtk_clock_new ("Shanghai", g_time_zone_new ("Asia/Shanghai"));
|
||||||
|
g_list_store_append (result, clock);
|
||||||
|
g_object_unref (clock);
|
||||||
|
|
||||||
|
return G_LIST_MODEL (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
convert_time_to_string (GObject *image,
|
||||||
|
GDateTime *time,
|
||||||
|
gpointer unused)
|
||||||
|
{
|
||||||
|
return g_date_time_format (time, "%x\n%X");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* And this function is the crux for this whole demo.
|
||||||
|
* It shows how to use expressions to set up bindings.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
setup_listitem_cb (GtkListItemFactory *factory,
|
||||||
|
GtkListItem *list_item)
|
||||||
|
{
|
||||||
|
GtkWidget *box, *picture, *location_label, *time_label;
|
||||||
|
GtkExpression *clock_expression, *expression;
|
||||||
|
|
||||||
|
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
|
gtk_list_item_set_child (list_item, box);
|
||||||
|
|
||||||
|
/* First, we create an expression that gets us the clock from the listitem:
|
||||||
|
* 1. Create an expression that gets the list item.
|
||||||
|
* 2. Use that expression's "item" property to get the clock
|
||||||
|
*/
|
||||||
|
expression = gtk_constant_expression_new (GTK_TYPE_LIST_ITEM, list_item);
|
||||||
|
clock_expression = gtk_property_expression_new (GTK_TYPE_LIST_ITEM, expression, "item");
|
||||||
|
|
||||||
|
/* Bind the clock's location to a label.
|
||||||
|
* This is easy: We just get the "location" property of the clock.
|
||||||
|
*/
|
||||||
|
expression = gtk_property_expression_new (GTK_TYPE_CLOCK,
|
||||||
|
gtk_expression_ref (clock_expression),
|
||||||
|
"location");
|
||||||
|
/* Now create the label and bind the expression to it. */
|
||||||
|
location_label = gtk_label_new (NULL);
|
||||||
|
gtk_expression_bind (expression, location_label, "label", location_label);
|
||||||
|
gtk_box_append (GTK_BOX (box), location_label);
|
||||||
|
|
||||||
|
|
||||||
|
/* Here we bind the item itself to a GdkPicture.
|
||||||
|
* This is simply done by using the clock expression itself.
|
||||||
|
*/
|
||||||
|
expression = gtk_expression_ref (clock_expression);
|
||||||
|
/* Now create the widget and bind the expression to it. */
|
||||||
|
picture = gtk_picture_new ();
|
||||||
|
gtk_expression_bind (expression, picture, "paintable", picture);
|
||||||
|
gtk_box_append (GTK_BOX (box), picture);
|
||||||
|
|
||||||
|
|
||||||
|
/* And finally, everything comes together.
|
||||||
|
* We create a label for displaying the time as text.
|
||||||
|
* For that, we need to transform the "GDateTime" of the
|
||||||
|
* time property into a string so that the label can display it.
|
||||||
|
*/
|
||||||
|
expression = gtk_property_expression_new (GTK_TYPE_CLOCK,
|
||||||
|
gtk_expression_ref (clock_expression),
|
||||||
|
"time");
|
||||||
|
expression = gtk_cclosure_expression_new (G_TYPE_STRING,
|
||||||
|
NULL,
|
||||||
|
1, (GtkExpression *[1]) { expression },
|
||||||
|
G_CALLBACK (convert_time_to_string),
|
||||||
|
NULL, NULL);
|
||||||
|
/* Now create the label and bind the expression to it. */
|
||||||
|
time_label = gtk_label_new (NULL);
|
||||||
|
gtk_expression_bind (expression, time_label, "label", time_label);
|
||||||
|
gtk_box_append (GTK_BOX (box), time_label);
|
||||||
|
|
||||||
|
gtk_expression_unref (clock_expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget *window = NULL;
|
||||||
|
|
||||||
|
GtkWidget *
|
||||||
|
do_listview_clocks (GtkWidget *do_widget)
|
||||||
|
{
|
||||||
|
if (window == NULL)
|
||||||
|
{
|
||||||
|
GtkWidget *gridview, *sw;
|
||||||
|
GtkListItemFactory *factory;
|
||||||
|
GListModel *model;
|
||||||
|
GtkNoSelection *selection;
|
||||||
|
|
||||||
|
/* This is the normal window setup code every demo does */
|
||||||
|
window = gtk_window_new ();
|
||||||
|
gtk_window_set_title (GTK_WINDOW (window), "Clocks");
|
||||||
|
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
|
||||||
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
|
gtk_widget_get_display (do_widget));
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *) &window);
|
||||||
|
|
||||||
|
/* List widgets go into a scrolled window. Always. */
|
||||||
|
sw = gtk_scrolled_window_new ();
|
||||||
|
gtk_window_set_child (GTK_WINDOW (window), sw);
|
||||||
|
|
||||||
|
/* Create the factory that creates the listitems. Because we
|
||||||
|
* used bindings above during setup, we only need to connect
|
||||||
|
* to the setup signal.
|
||||||
|
* The bindings take care of the bind step.
|
||||||
|
*/
|
||||||
|
factory = gtk_signal_list_item_factory_new ();
|
||||||
|
g_signal_connect (factory, "setup", G_CALLBACK (setup_listitem_cb), NULL);
|
||||||
|
|
||||||
|
gridview = gtk_grid_view_new_with_factory (factory);
|
||||||
|
gtk_scrollable_set_hscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL);
|
||||||
|
gtk_scrollable_set_vscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL);
|
||||||
|
|
||||||
|
model = create_clocks_model ();
|
||||||
|
selection = gtk_no_selection_new (model);
|
||||||
|
gtk_grid_view_set_model (GTK_GRID_VIEW (gridview), G_LIST_MODEL (selection));
|
||||||
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), gridview);
|
||||||
|
g_object_unref (selection);
|
||||||
|
g_object_unref (model);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gtk_widget_get_visible (window))
|
||||||
|
gtk_widget_show (window);
|
||||||
|
else
|
||||||
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
979
demos/gtk-demo/listview_colors.c
Normal file
979
demos/gtk-demo/listview_colors.c
Normal file
@@ -0,0 +1,979 @@
|
|||||||
|
/* Lists/Colors
|
||||||
|
*
|
||||||
|
* This demo displays a grid of colors.
|
||||||
|
*
|
||||||
|
* It is using a GtkGridView, and shows how to display
|
||||||
|
* and sort the data in various ways. The controls for
|
||||||
|
* this are implemented using GtkDropDown.
|
||||||
|
*
|
||||||
|
* The dataset used here has up to 16 777 216 items.
|
||||||
|
*
|
||||||
|
* Note that this demo also functions as a performance
|
||||||
|
* test for some of the list model machinery, and the
|
||||||
|
* biggest sizes here can lock up the application for
|
||||||
|
* extended times when used with sorting.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define GTK_TYPE_COLOR (gtk_color_get_type ())
|
||||||
|
G_DECLARE_FINAL_TYPE (GtkColor, gtk_color, GTK, COLOR, GObject)
|
||||||
|
|
||||||
|
/* This is our object. It's just a color */
|
||||||
|
typedef struct _GtkColor GtkColor;
|
||||||
|
struct _GtkColor
|
||||||
|
{
|
||||||
|
GObject parent_instance;
|
||||||
|
|
||||||
|
char *name;
|
||||||
|
GdkRGBA color;
|
||||||
|
int h, s, v;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PROP_0,
|
||||||
|
PROP_NAME,
|
||||||
|
PROP_COLOR,
|
||||||
|
PROP_RED,
|
||||||
|
PROP_GREEN,
|
||||||
|
PROP_BLUE,
|
||||||
|
PROP_HUE,
|
||||||
|
PROP_SATURATION,
|
||||||
|
PROP_VALUE,
|
||||||
|
|
||||||
|
N_COLOR_PROPS
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_color_snapshot (GdkPaintable *paintable,
|
||||||
|
GdkSnapshot *snapshot,
|
||||||
|
double width,
|
||||||
|
double height)
|
||||||
|
{
|
||||||
|
GtkColor *self = GTK_COLOR (paintable);
|
||||||
|
|
||||||
|
gtk_snapshot_append_color (snapshot, &self->color, &GRAPHENE_RECT_INIT (0, 0, width, height));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
gtk_color_get_intrinsic_width (GdkPaintable *paintable)
|
||||||
|
{
|
||||||
|
return 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
gtk_color_get_intrinsic_height (GdkPaintable *paintable)
|
||||||
|
{
|
||||||
|
return 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_color_paintable_init (GdkPaintableInterface *iface)
|
||||||
|
{
|
||||||
|
iface->snapshot = gtk_color_snapshot;
|
||||||
|
iface->get_intrinsic_width = gtk_color_get_intrinsic_width;
|
||||||
|
iface->get_intrinsic_height = gtk_color_get_intrinsic_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Finally, we define the type. The important part is adding the paintable
|
||||||
|
* interface, so GTK knows that this object can indeed be drawm.
|
||||||
|
*/
|
||||||
|
G_DEFINE_TYPE_WITH_CODE (GtkColor, gtk_color, G_TYPE_OBJECT,
|
||||||
|
G_IMPLEMENT_INTERFACE (GDK_TYPE_PAINTABLE,
|
||||||
|
gtk_color_paintable_init))
|
||||||
|
|
||||||
|
static GParamSpec *color_properties[N_COLOR_PROPS] = { NULL, };
|
||||||
|
|
||||||
|
static void
|
||||||
|
rgb_to_hsv (GdkRGBA *rgba,
|
||||||
|
gdouble *h_out,
|
||||||
|
gdouble *s_out,
|
||||||
|
gdouble *v_out)
|
||||||
|
{
|
||||||
|
gdouble red, green, blue;
|
||||||
|
gdouble h, s, v;
|
||||||
|
gdouble min, max;
|
||||||
|
gdouble delta;
|
||||||
|
|
||||||
|
red = rgba->red;
|
||||||
|
green = rgba->green;
|
||||||
|
blue = rgba->blue;
|
||||||
|
|
||||||
|
h = 0.0;
|
||||||
|
|
||||||
|
if (red > green)
|
||||||
|
{
|
||||||
|
if (red > blue)
|
||||||
|
max = red;
|
||||||
|
else
|
||||||
|
max = blue;
|
||||||
|
|
||||||
|
if (green < blue)
|
||||||
|
min = green;
|
||||||
|
else
|
||||||
|
min = blue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (green > blue)
|
||||||
|
max = green;
|
||||||
|
else
|
||||||
|
max = blue;
|
||||||
|
|
||||||
|
if (red < blue)
|
||||||
|
min = red;
|
||||||
|
else
|
||||||
|
min = blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = max;
|
||||||
|
|
||||||
|
if (max != 0.0)
|
||||||
|
s = (max - min) / max;
|
||||||
|
else
|
||||||
|
s = 0.0;
|
||||||
|
|
||||||
|
if (s == 0.0)
|
||||||
|
h = 0.0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delta = max - min;
|
||||||
|
|
||||||
|
if (red == max)
|
||||||
|
h = (green - blue) / delta;
|
||||||
|
else if (green == max)
|
||||||
|
h = 2 + (blue - red) / delta;
|
||||||
|
else if (blue == max)
|
||||||
|
h = 4 + (red - green) / delta;
|
||||||
|
|
||||||
|
h /= 6.0;
|
||||||
|
|
||||||
|
if (h < 0.0)
|
||||||
|
h += 1.0;
|
||||||
|
else if (h > 1.0)
|
||||||
|
h -= 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*h_out = h;
|
||||||
|
*s_out = s;
|
||||||
|
*v_out = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_color_get_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
GtkColor *self = GTK_COLOR (object);
|
||||||
|
|
||||||
|
switch (property_id)
|
||||||
|
{
|
||||||
|
case PROP_NAME:
|
||||||
|
g_value_set_string (value, self->name);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_COLOR:
|
||||||
|
g_value_set_boxed (value, &self->color);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_RED:
|
||||||
|
g_value_set_float (value, self->color.red);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_GREEN:
|
||||||
|
g_value_set_float (value, self->color.green);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_BLUE:
|
||||||
|
g_value_set_float (value, self->color.blue);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_HUE:
|
||||||
|
g_value_set_int (value, self->h);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_SATURATION:
|
||||||
|
g_value_set_int (value, self->s);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_VALUE:
|
||||||
|
g_value_set_int (value, self->v);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_color_set_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
const GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
GtkColor *self = GTK_COLOR (object);
|
||||||
|
double h, s, v;
|
||||||
|
|
||||||
|
switch (property_id)
|
||||||
|
{
|
||||||
|
case PROP_NAME:
|
||||||
|
self->name = g_value_dup_string (value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_COLOR:
|
||||||
|
self->color = *(GdkRGBA *) g_value_dup_boxed (value);
|
||||||
|
rgb_to_hsv (&self->color, &h, &s, &v);
|
||||||
|
self->h = round (360 * h);
|
||||||
|
self->s = round (100 * s);
|
||||||
|
self->v = round (100 * v);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_color_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
GtkColor *self = GTK_COLOR (object);
|
||||||
|
|
||||||
|
g_free (self->name);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (gtk_color_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_color_class_init (GtkColorClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
gobject_class->get_property = gtk_color_get_property;
|
||||||
|
gobject_class->set_property = gtk_color_set_property;
|
||||||
|
gobject_class->finalize = gtk_color_finalize;
|
||||||
|
|
||||||
|
color_properties[PROP_NAME] =
|
||||||
|
g_param_spec_string ("name", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||||
|
color_properties[PROP_COLOR] =
|
||||||
|
g_param_spec_boxed ("color", NULL, NULL, GDK_TYPE_RGBA, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||||
|
color_properties[PROP_RED] =
|
||||||
|
g_param_spec_float ("red", NULL, NULL, 0, 1, 0, G_PARAM_READABLE);
|
||||||
|
color_properties[PROP_GREEN] =
|
||||||
|
g_param_spec_float ("green", NULL, NULL, 0, 1, 0, G_PARAM_READABLE);
|
||||||
|
color_properties[PROP_BLUE] =
|
||||||
|
g_param_spec_float ("blue", NULL, NULL, 0, 1, 0, G_PARAM_READABLE);
|
||||||
|
color_properties[PROP_HUE] =
|
||||||
|
g_param_spec_int ("hue", NULL, NULL, 0, 360, 0, G_PARAM_READABLE);
|
||||||
|
color_properties[PROP_SATURATION] =
|
||||||
|
g_param_spec_int ("saturation", NULL, NULL, 0, 100, 0, G_PARAM_READABLE);
|
||||||
|
color_properties[PROP_VALUE] =
|
||||||
|
g_param_spec_int ("value", NULL, NULL, 0, 100, 0, G_PARAM_READABLE);
|
||||||
|
|
||||||
|
g_object_class_install_properties (gobject_class, N_COLOR_PROPS, color_properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_color_init (GtkColor *self)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkColor *
|
||||||
|
gtk_color_new (const char *name,
|
||||||
|
float r, float g, float b)
|
||||||
|
{
|
||||||
|
GtkColor *result;
|
||||||
|
GdkRGBA color = { r, g, b, 1.0 };
|
||||||
|
|
||||||
|
result = g_object_new (GTK_TYPE_COLOR,
|
||||||
|
"name", name,
|
||||||
|
"color", &color,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define N_COLORS (256 * 256 * 256)
|
||||||
|
|
||||||
|
#define GTK_TYPE_COLOR_LIST (gtk_color_list_get_type ())
|
||||||
|
G_DECLARE_FINAL_TYPE (GtkColorList, gtk_color_list, GTK, COLOR_LIST, GObject)
|
||||||
|
|
||||||
|
enum {
|
||||||
|
LIST_PROP_0,
|
||||||
|
LIST_PROP_SIZE,
|
||||||
|
|
||||||
|
N_LIST_PROPS
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _GtkColorList GtkColorList;
|
||||||
|
struct _GtkColorList
|
||||||
|
{
|
||||||
|
GObject parent_instance;
|
||||||
|
|
||||||
|
GtkColor **colors; /* Always N_COLORS */
|
||||||
|
|
||||||
|
guint size; /* How many colors we allow */
|
||||||
|
};
|
||||||
|
|
||||||
|
static GType
|
||||||
|
gtk_color_list_get_item_type (GListModel *list)
|
||||||
|
{
|
||||||
|
return GTK_TYPE_COLOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
gtk_color_list_get_n_items (GListModel *list)
|
||||||
|
{
|
||||||
|
GtkColorList *self = GTK_COLOR_LIST (list);
|
||||||
|
|
||||||
|
return self->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
position_to_color (guint position)
|
||||||
|
{
|
||||||
|
static guint map[] = {
|
||||||
|
0xFF0000, 0x00FF00, 0x0000FF,
|
||||||
|
0x7F0000, 0x007F00, 0x00007F,
|
||||||
|
0x3F0000, 0x003F00, 0x00003F,
|
||||||
|
0x1F0000, 0x001F00, 0x00001F,
|
||||||
|
0x0F0000, 0x000F00, 0x00000F,
|
||||||
|
0x070000, 0x000700, 0x000007,
|
||||||
|
0x030000, 0x000300, 0x000003,
|
||||||
|
0x010000, 0x000100, 0x000001
|
||||||
|
};
|
||||||
|
guint result, i;
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (map); i++)
|
||||||
|
{
|
||||||
|
if (position & (1 << i))
|
||||||
|
result ^= map[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gpointer
|
||||||
|
gtk_color_list_get_item (GListModel *list,
|
||||||
|
guint position)
|
||||||
|
{
|
||||||
|
GtkColorList *self = GTK_COLOR_LIST (list);
|
||||||
|
|
||||||
|
if (position >= self->size)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
position = position_to_color (position);
|
||||||
|
|
||||||
|
if (self->colors[position] == NULL)
|
||||||
|
{
|
||||||
|
guint red, green, blue;
|
||||||
|
|
||||||
|
red = (position >> 16) & 0xFF;
|
||||||
|
green = (position >> 8) & 0xFF;
|
||||||
|
blue = position & 0xFF;
|
||||||
|
|
||||||
|
self->colors[position] = gtk_color_new ("", red / 255., green / 255., blue / 255.);
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_object_ref (self->colors[position]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_color_list_model_init (GListModelInterface *iface)
|
||||||
|
{
|
||||||
|
iface->get_item_type = gtk_color_list_get_item_type;
|
||||||
|
iface->get_n_items = gtk_color_list_get_n_items;
|
||||||
|
iface->get_item = gtk_color_list_get_item;
|
||||||
|
}
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_CODE (GtkColorList, gtk_color_list, G_TYPE_OBJECT,
|
||||||
|
G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL,
|
||||||
|
gtk_color_list_model_init))
|
||||||
|
|
||||||
|
static GParamSpec *list_properties[N_LIST_PROPS] = { NULL, };
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_color_list_get_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
GtkColorList *self = GTK_COLOR_LIST (object);
|
||||||
|
|
||||||
|
switch (property_id)
|
||||||
|
{
|
||||||
|
case LIST_PROP_SIZE:
|
||||||
|
g_value_set_uint (value, self->size);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_color_list_set_size (GtkColorList *self,
|
||||||
|
guint size)
|
||||||
|
{
|
||||||
|
guint old_size = self->size;
|
||||||
|
|
||||||
|
self->size = size;
|
||||||
|
if (self->size > old_size)
|
||||||
|
g_list_model_items_changed (G_LIST_MODEL (self), old_size, 0, self->size - old_size);
|
||||||
|
else if (old_size > self->size)
|
||||||
|
g_list_model_items_changed (G_LIST_MODEL (self), self->size, old_size - self->size, 0);
|
||||||
|
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (self), list_properties[LIST_PROP_SIZE]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_color_list_set_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
const GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
GtkColorList *self = GTK_COLOR_LIST (object);
|
||||||
|
|
||||||
|
switch (property_id)
|
||||||
|
{
|
||||||
|
case LIST_PROP_SIZE:
|
||||||
|
gtk_color_list_set_size (self, g_value_get_uint (value));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_color_list_dispose (GObject *object)
|
||||||
|
{
|
||||||
|
GtkColorList *self = GTK_COLOR_LIST (object);
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
for (i = 0; i < N_COLORS; i++)
|
||||||
|
{
|
||||||
|
g_clear_object (&self->colors[i]);
|
||||||
|
}
|
||||||
|
g_free (self->colors);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (gtk_color_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_color_list_class_init (GtkColorListClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
gobject_class->get_property = gtk_color_list_get_property;
|
||||||
|
gobject_class->set_property = gtk_color_list_set_property;
|
||||||
|
gobject_class->dispose = gtk_color_list_dispose;
|
||||||
|
|
||||||
|
list_properties[LIST_PROP_SIZE] =
|
||||||
|
g_param_spec_uint ("size", NULL, NULL, 0, N_COLORS, 0, G_PARAM_READWRITE);
|
||||||
|
|
||||||
|
g_object_class_install_properties (gobject_class, N_LIST_PROPS, list_properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_color_list_init (GtkColorList *self)
|
||||||
|
{
|
||||||
|
GBytes *data;
|
||||||
|
char **lines;
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
self->colors = g_new0 (GtkColor *, N_COLORS);
|
||||||
|
|
||||||
|
data = g_resources_lookup_data ("/listview_colors/color.names.txt", 0, NULL);
|
||||||
|
lines = g_strsplit (g_bytes_get_data (data, NULL), "\n", 0);
|
||||||
|
|
||||||
|
for (i = 0; lines[i]; i++)
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
char **fields;
|
||||||
|
int red, green, blue;
|
||||||
|
guint pos;
|
||||||
|
|
||||||
|
if (lines[i][0] == '#' || lines[i][0] == '\0')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
fields = g_strsplit (lines[i], " ", 0);
|
||||||
|
name = fields[1];
|
||||||
|
red = atoi (fields[3]);
|
||||||
|
green = atoi (fields[4]);
|
||||||
|
blue = atoi (fields[5]);
|
||||||
|
|
||||||
|
pos = ((red & 0xFF) << 16) | ((green & 0xFF) << 8) | blue;
|
||||||
|
if (self->colors[pos] == NULL)
|
||||||
|
self->colors[pos] = gtk_color_new (name, red / 255., green / 255., blue / 255.);
|
||||||
|
|
||||||
|
g_strfreev (fields);
|
||||||
|
}
|
||||||
|
g_strfreev (lines);
|
||||||
|
|
||||||
|
g_bytes_unref (data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GListModel *
|
||||||
|
gtk_color_list_new (guint size)
|
||||||
|
{
|
||||||
|
return g_object_new (GTK_TYPE_COLOR_LIST,
|
||||||
|
"size", size,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_rgb_markup (gpointer this,
|
||||||
|
GtkColor *color)
|
||||||
|
{
|
||||||
|
if (!color)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return g_strdup_printf ("<b>R:</b> %d <b>G:</b> %d <b>B:</b> %d",
|
||||||
|
(int)(color->color.red * 255),
|
||||||
|
(int)(color->color.green * 255),
|
||||||
|
(int)(color->color.blue * 255));
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_hsv_markup (gpointer this,
|
||||||
|
GtkColor *color)
|
||||||
|
{
|
||||||
|
if (!color)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return g_strdup_printf ("<b>H:</b> %d <b>S:</b> %d <b>V:</b> %d",
|
||||||
|
color->h,
|
||||||
|
color->s,
|
||||||
|
color->v);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
setup_simple_listitem_cb (GtkListItemFactory *factory,
|
||||||
|
GtkListItem *list_item)
|
||||||
|
{
|
||||||
|
GtkWidget *picture;
|
||||||
|
GtkExpression *color_expression, *expression;
|
||||||
|
|
||||||
|
expression = gtk_constant_expression_new (GTK_TYPE_LIST_ITEM, list_item);
|
||||||
|
color_expression = gtk_property_expression_new (GTK_TYPE_LIST_ITEM, expression, "item");
|
||||||
|
|
||||||
|
picture = gtk_picture_new ();
|
||||||
|
gtk_widget_set_size_request (picture, 32, 32);
|
||||||
|
gtk_expression_bind (color_expression, picture, "paintable", NULL);
|
||||||
|
|
||||||
|
gtk_list_item_set_child (list_item, picture);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
setup_listitem_cb (GtkListItemFactory *factory,
|
||||||
|
GtkListItem *list_item)
|
||||||
|
{
|
||||||
|
GtkWidget *box, *picture, *name_label, *rgb_label, *hsv_label;
|
||||||
|
GtkExpression *color_expression, *expression;
|
||||||
|
GtkExpression *params[1];
|
||||||
|
|
||||||
|
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
|
gtk_list_item_set_child (list_item, box);
|
||||||
|
|
||||||
|
expression = gtk_constant_expression_new (GTK_TYPE_LIST_ITEM, list_item);
|
||||||
|
color_expression = gtk_property_expression_new (GTK_TYPE_LIST_ITEM, expression, "item");
|
||||||
|
|
||||||
|
expression = gtk_property_expression_new (GTK_TYPE_COLOR,
|
||||||
|
gtk_expression_ref (color_expression),
|
||||||
|
"name");
|
||||||
|
name_label = gtk_label_new (NULL);
|
||||||
|
gtk_expression_bind (expression, name_label, "label", NULL);
|
||||||
|
gtk_box_append (GTK_BOX (box), name_label);
|
||||||
|
|
||||||
|
expression = gtk_expression_ref (color_expression);
|
||||||
|
picture = gtk_picture_new ();
|
||||||
|
gtk_expression_bind (expression, picture, "paintable", NULL);
|
||||||
|
gtk_box_append (GTK_BOX (box), picture);
|
||||||
|
|
||||||
|
params[0] = gtk_expression_ref (color_expression);
|
||||||
|
expression = gtk_cclosure_expression_new (G_TYPE_STRING,
|
||||||
|
NULL,
|
||||||
|
1, params,
|
||||||
|
(GCallback)get_rgb_markup,
|
||||||
|
NULL, NULL);
|
||||||
|
|
||||||
|
rgb_label = gtk_label_new (NULL);
|
||||||
|
gtk_label_set_use_markup (GTK_LABEL (rgb_label), TRUE);
|
||||||
|
gtk_expression_bind (expression, rgb_label, "label", NULL);
|
||||||
|
gtk_box_append (GTK_BOX (box), rgb_label);
|
||||||
|
|
||||||
|
params[0] = gtk_expression_ref (color_expression);
|
||||||
|
expression = gtk_cclosure_expression_new (G_TYPE_STRING,
|
||||||
|
NULL,
|
||||||
|
1, params,
|
||||||
|
(GCallback)get_hsv_markup,
|
||||||
|
NULL, NULL);
|
||||||
|
|
||||||
|
hsv_label = gtk_label_new (NULL);
|
||||||
|
gtk_label_set_use_markup (GTK_LABEL (hsv_label), TRUE);
|
||||||
|
gtk_expression_bind (expression, hsv_label, "label", NULL);
|
||||||
|
gtk_box_append (GTK_BOX (box), hsv_label);
|
||||||
|
|
||||||
|
gtk_expression_unref (color_expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_title (gpointer item,
|
||||||
|
const char *title)
|
||||||
|
{
|
||||||
|
g_object_set_data (G_OBJECT (item), "title", (gpointer)title);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_title (gpointer item)
|
||||||
|
{
|
||||||
|
return g_strdup ((char *)g_object_get_data (G_OBJECT (item), "title"));
|
||||||
|
}
|
||||||
|
|
||||||
|
GtkWidget *
|
||||||
|
create_color_grid (void)
|
||||||
|
{
|
||||||
|
GtkWidget *gridview;
|
||||||
|
GtkListItemFactory *factory;
|
||||||
|
GListModel *model, *selection;
|
||||||
|
|
||||||
|
gridview = gtk_grid_view_new ();
|
||||||
|
gtk_scrollable_set_hscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL);
|
||||||
|
gtk_scrollable_set_vscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL);
|
||||||
|
|
||||||
|
factory = gtk_signal_list_item_factory_new ();
|
||||||
|
g_signal_connect (factory, "setup", G_CALLBACK (setup_simple_listitem_cb), NULL);
|
||||||
|
gtk_grid_view_set_factory (GTK_GRID_VIEW (gridview), factory);
|
||||||
|
g_object_unref (factory);
|
||||||
|
|
||||||
|
gtk_grid_view_set_max_columns (GTK_GRID_VIEW (gridview), 24);
|
||||||
|
gtk_grid_view_set_enable_rubberband (GTK_GRID_VIEW (gridview), TRUE);
|
||||||
|
|
||||||
|
model = G_LIST_MODEL (gtk_sort_list_model_new (gtk_color_list_new (0), NULL));
|
||||||
|
|
||||||
|
selection = G_LIST_MODEL (gtk_multi_selection_new (model));
|
||||||
|
gtk_grid_view_set_model (GTK_GRID_VIEW (gridview), selection);
|
||||||
|
g_object_unref (selection);
|
||||||
|
g_object_unref (model);
|
||||||
|
|
||||||
|
return gridview;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
add_colors (GtkWidget *widget,
|
||||||
|
GdkFrameClock *clock,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
GtkColorList *colors = data;
|
||||||
|
guint limit;
|
||||||
|
|
||||||
|
limit = GPOINTER_TO_UINT (g_object_get_data (data, "limit"));
|
||||||
|
gtk_color_list_set_size (colors, MIN (limit, colors->size + MAX (1, limit / 4096)));
|
||||||
|
|
||||||
|
if (colors->size >= limit)
|
||||||
|
return G_SOURCE_REMOVE;
|
||||||
|
else
|
||||||
|
return G_SOURCE_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
refill (GtkWidget *button,
|
||||||
|
GtkColorList *colors)
|
||||||
|
{
|
||||||
|
gtk_color_list_set_size (colors, 0);
|
||||||
|
gtk_widget_add_tick_callback (button, add_colors, g_object_ref (colors), g_object_unref);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
limit_changed_cb (GtkDropDown *dropdown,
|
||||||
|
GParamSpec *pspec,
|
||||||
|
GtkColorList *colors)
|
||||||
|
{
|
||||||
|
guint new_limit, old_limit;
|
||||||
|
|
||||||
|
old_limit = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (colors), "limit"));
|
||||||
|
new_limit = 1 << (3 * (gtk_drop_down_get_selected (dropdown) + 1));
|
||||||
|
|
||||||
|
g_object_set_data (G_OBJECT (colors), "limit", GUINT_TO_POINTER (new_limit));
|
||||||
|
|
||||||
|
if (old_limit == colors->size)
|
||||||
|
gtk_color_list_set_size (colors, new_limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
limit_changed_cb2 (GtkDropDown *dropdown,
|
||||||
|
GParamSpec *pspec,
|
||||||
|
GtkLabel *label)
|
||||||
|
{
|
||||||
|
char *string;
|
||||||
|
int len;
|
||||||
|
guint limit;
|
||||||
|
|
||||||
|
limit = 1 << (3 * (gtk_drop_down_get_selected (dropdown) + 1));
|
||||||
|
|
||||||
|
string = g_strdup_printf ("%'u", limit);
|
||||||
|
len = g_utf8_strlen (string, -1);
|
||||||
|
g_free (string);
|
||||||
|
|
||||||
|
gtk_label_set_width_chars (label, len + 2); /* for " /" */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
items_changed_cb (GListModel *model,
|
||||||
|
guint position,
|
||||||
|
guint removed,
|
||||||
|
guint added,
|
||||||
|
GtkWidget *label)
|
||||||
|
{
|
||||||
|
guint n = g_list_model_get_n_items (model);
|
||||||
|
char *text;
|
||||||
|
|
||||||
|
text = g_strdup_printf ("%'u /", n);
|
||||||
|
gtk_label_set_label (GTK_LABEL (label), text);
|
||||||
|
g_free (text);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
setup_number_item (GtkSignalListItemFactory *factory,
|
||||||
|
GtkListItem *item)
|
||||||
|
{
|
||||||
|
GtkWidget *label;
|
||||||
|
PangoAttrList *attrs;
|
||||||
|
|
||||||
|
label = gtk_label_new ("");
|
||||||
|
gtk_label_set_xalign (GTK_LABEL (label), 1);
|
||||||
|
|
||||||
|
attrs = pango_attr_list_new ();
|
||||||
|
pango_attr_list_insert (attrs, pango_attr_font_features_new ("tnum"));
|
||||||
|
gtk_label_set_attributes (GTK_LABEL (label), attrs);
|
||||||
|
pango_attr_list_unref (attrs);
|
||||||
|
|
||||||
|
gtk_list_item_set_child (item, label);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
bind_number_item (GtkSignalListItemFactory *factory,
|
||||||
|
GtkListItem *item)
|
||||||
|
{
|
||||||
|
GtkWidget *label;
|
||||||
|
guint limit;
|
||||||
|
char *string;
|
||||||
|
|
||||||
|
label = gtk_list_item_get_child (item);
|
||||||
|
|
||||||
|
limit = 1 << (3 * (gtk_list_item_get_position (item) + 1));
|
||||||
|
string = g_strdup_printf ("%'u", limit);
|
||||||
|
gtk_label_set_label (GTK_LABEL (label), string);
|
||||||
|
g_free (string);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget *window = NULL;
|
||||||
|
|
||||||
|
GtkWidget *
|
||||||
|
do_listview_colors (GtkWidget *do_widget)
|
||||||
|
{
|
||||||
|
if (window == NULL)
|
||||||
|
{
|
||||||
|
GtkWidget *header, *gridview, *sw, *box, *dropdown;
|
||||||
|
GtkListItemFactory *factory;
|
||||||
|
GListStore *factories;
|
||||||
|
GListModel *model;
|
||||||
|
GtkSorter *sorter;
|
||||||
|
GtkSorter *multi_sorter;
|
||||||
|
GListStore *sorters;
|
||||||
|
GtkExpression *expression;
|
||||||
|
GtkWidget *button;
|
||||||
|
GtkWidget *label;
|
||||||
|
PangoAttrList *attrs;
|
||||||
|
char *string;
|
||||||
|
guint len;
|
||||||
|
|
||||||
|
window = gtk_window_new ();
|
||||||
|
gtk_window_set_title (GTK_WINDOW (window), "Colors");
|
||||||
|
header = gtk_header_bar_new ();
|
||||||
|
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), TRUE);
|
||||||
|
gtk_window_set_titlebar (GTK_WINDOW (window), header);
|
||||||
|
|
||||||
|
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
|
||||||
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
|
gtk_widget_get_display (do_widget));
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer*)&window);
|
||||||
|
|
||||||
|
sw = gtk_scrolled_window_new ();
|
||||||
|
gtk_window_set_child (GTK_WINDOW (window), sw);
|
||||||
|
|
||||||
|
gridview = create_color_grid ();
|
||||||
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), gridview);
|
||||||
|
model = gtk_grid_view_get_model (GTK_GRID_VIEW (gridview));
|
||||||
|
g_object_get (model, "model", &model, NULL);
|
||||||
|
|
||||||
|
button = gtk_button_new_with_mnemonic ("_Refill");
|
||||||
|
g_signal_connect (button, "clicked",
|
||||||
|
G_CALLBACK (refill),
|
||||||
|
gtk_sort_list_model_get_model (GTK_SORT_LIST_MODEL (model)));
|
||||||
|
|
||||||
|
gtk_header_bar_pack_start (GTK_HEADER_BAR (header), button);
|
||||||
|
|
||||||
|
label = gtk_label_new ("0 /");
|
||||||
|
attrs = pango_attr_list_new ();
|
||||||
|
pango_attr_list_insert (attrs, pango_attr_font_features_new ("tnum"));
|
||||||
|
gtk_label_set_attributes (GTK_LABEL (label), attrs);
|
||||||
|
pango_attr_list_unref (attrs);
|
||||||
|
string = g_strdup_printf ("%'u", 4096);
|
||||||
|
len = g_utf8_strlen (string, -1);
|
||||||
|
g_free (string);
|
||||||
|
gtk_label_set_width_chars (GTK_LABEL (label), len + 2);
|
||||||
|
gtk_label_set_xalign (GTK_LABEL (label), 1);
|
||||||
|
|
||||||
|
g_signal_connect (gtk_grid_view_get_model (GTK_GRID_VIEW (gridview)),
|
||||||
|
"items-changed", G_CALLBACK (items_changed_cb), label);
|
||||||
|
gtk_header_bar_pack_start (GTK_HEADER_BAR (header), label);
|
||||||
|
|
||||||
|
dropdown = gtk_drop_down_new ();
|
||||||
|
gtk_drop_down_set_from_strings (GTK_DROP_DOWN (dropdown), (const char *[]) { "8", "64", "512", "4096", "32768", "262144", "2097152", "16777216", NULL });
|
||||||
|
g_signal_connect (dropdown, "notify::selected",
|
||||||
|
G_CALLBACK (limit_changed_cb),
|
||||||
|
gtk_sort_list_model_get_model (GTK_SORT_LIST_MODEL (model)));
|
||||||
|
g_signal_connect (dropdown, "notify::selected",
|
||||||
|
G_CALLBACK (limit_changed_cb2),
|
||||||
|
label);
|
||||||
|
factory = gtk_signal_list_item_factory_new ();
|
||||||
|
g_signal_connect (factory, "setup", G_CALLBACK (setup_number_item), NULL);
|
||||||
|
g_signal_connect (factory, "bind", G_CALLBACK (bind_number_item), NULL);
|
||||||
|
gtk_drop_down_set_factory (GTK_DROP_DOWN (dropdown), factory);
|
||||||
|
g_object_unref (factory);
|
||||||
|
gtk_drop_down_set_selected (GTK_DROP_DOWN (dropdown), 3); /* 4096 */
|
||||||
|
gtk_header_bar_pack_start (GTK_HEADER_BAR (header), dropdown);
|
||||||
|
|
||||||
|
sorters = g_list_store_new (GTK_TYPE_SORTER);
|
||||||
|
|
||||||
|
/* An empty multisorter doesn't do any sorting and the sortmodel is
|
||||||
|
* smart enough to know that.
|
||||||
|
*/
|
||||||
|
sorter = gtk_multi_sorter_new ();
|
||||||
|
set_title (sorter, "Unsorted");
|
||||||
|
g_list_store_append (sorters, sorter);
|
||||||
|
g_object_unref (sorter);
|
||||||
|
|
||||||
|
sorter = gtk_string_sorter_new (gtk_property_expression_new (GTK_TYPE_COLOR, NULL, "name"));
|
||||||
|
set_title (sorter, "Name");
|
||||||
|
g_list_store_append (sorters, sorter);
|
||||||
|
g_object_unref (sorter);
|
||||||
|
|
||||||
|
multi_sorter = gtk_multi_sorter_new ();
|
||||||
|
|
||||||
|
sorter = gtk_numeric_sorter_new (gtk_property_expression_new (GTK_TYPE_COLOR, NULL, "red"));
|
||||||
|
gtk_numeric_sorter_set_sort_order (GTK_NUMERIC_SORTER (sorter), GTK_SORT_DESCENDING);
|
||||||
|
set_title (sorter, "Red");
|
||||||
|
g_list_store_append (sorters, sorter);
|
||||||
|
gtk_multi_sorter_append (GTK_MULTI_SORTER (multi_sorter), sorter);
|
||||||
|
|
||||||
|
sorter = gtk_numeric_sorter_new (gtk_property_expression_new (GTK_TYPE_COLOR, NULL, "green"));
|
||||||
|
gtk_numeric_sorter_set_sort_order (GTK_NUMERIC_SORTER (sorter), GTK_SORT_DESCENDING);
|
||||||
|
set_title (sorter, "Green");
|
||||||
|
g_list_store_append (sorters, sorter);
|
||||||
|
gtk_multi_sorter_append (GTK_MULTI_SORTER (multi_sorter), sorter);
|
||||||
|
|
||||||
|
sorter = gtk_numeric_sorter_new (gtk_property_expression_new (GTK_TYPE_COLOR, NULL, "blue"));
|
||||||
|
gtk_numeric_sorter_set_sort_order (GTK_NUMERIC_SORTER (sorter), GTK_SORT_DESCENDING);
|
||||||
|
set_title (sorter, "Blue");
|
||||||
|
g_list_store_append (sorters, sorter);
|
||||||
|
gtk_multi_sorter_append (GTK_MULTI_SORTER (multi_sorter), sorter);
|
||||||
|
|
||||||
|
set_title (multi_sorter, "RGB");
|
||||||
|
g_list_store_append (sorters, multi_sorter);
|
||||||
|
g_object_unref (multi_sorter);
|
||||||
|
|
||||||
|
multi_sorter = gtk_multi_sorter_new ();
|
||||||
|
|
||||||
|
sorter = gtk_numeric_sorter_new (gtk_property_expression_new (GTK_TYPE_COLOR, NULL, "hue"));
|
||||||
|
gtk_numeric_sorter_set_sort_order (GTK_NUMERIC_SORTER (sorter), GTK_SORT_DESCENDING);
|
||||||
|
set_title (sorter, "Hue");
|
||||||
|
g_list_store_append (sorters, sorter);
|
||||||
|
gtk_multi_sorter_append (GTK_MULTI_SORTER (multi_sorter), sorter);
|
||||||
|
|
||||||
|
sorter = gtk_numeric_sorter_new (gtk_property_expression_new (GTK_TYPE_COLOR, NULL, "saturation"));
|
||||||
|
gtk_numeric_sorter_set_sort_order (GTK_NUMERIC_SORTER (sorter), GTK_SORT_DESCENDING);
|
||||||
|
set_title (sorter, "Saturation");
|
||||||
|
g_list_store_append (sorters, sorter);
|
||||||
|
gtk_multi_sorter_append (GTK_MULTI_SORTER (multi_sorter), sorter);
|
||||||
|
|
||||||
|
sorter = gtk_numeric_sorter_new (gtk_property_expression_new (GTK_TYPE_COLOR, NULL, "value"));
|
||||||
|
gtk_numeric_sorter_set_sort_order (GTK_NUMERIC_SORTER (sorter), GTK_SORT_DESCENDING);
|
||||||
|
set_title (sorter, "Value");
|
||||||
|
g_list_store_append (sorters, sorter);
|
||||||
|
gtk_multi_sorter_append (GTK_MULTI_SORTER (multi_sorter), sorter);
|
||||||
|
|
||||||
|
set_title (multi_sorter, "HSV");
|
||||||
|
g_list_store_append (sorters, multi_sorter);
|
||||||
|
g_object_unref (multi_sorter);
|
||||||
|
|
||||||
|
dropdown = gtk_drop_down_new ();
|
||||||
|
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
|
||||||
|
gtk_box_append (GTK_BOX (box), gtk_label_new ("Sort by:"));
|
||||||
|
gtk_box_append (GTK_BOX (box), dropdown);
|
||||||
|
gtk_header_bar_pack_end (GTK_HEADER_BAR (header), box);
|
||||||
|
|
||||||
|
expression = gtk_cclosure_expression_new (G_TYPE_STRING,
|
||||||
|
NULL,
|
||||||
|
0, NULL,
|
||||||
|
(GCallback)get_title,
|
||||||
|
NULL, NULL);
|
||||||
|
gtk_drop_down_set_expression (GTK_DROP_DOWN (dropdown), expression);
|
||||||
|
gtk_expression_unref (expression);
|
||||||
|
|
||||||
|
gtk_drop_down_set_model (GTK_DROP_DOWN (dropdown), G_LIST_MODEL (sorters));
|
||||||
|
g_object_unref (sorters);
|
||||||
|
|
||||||
|
g_object_bind_property (dropdown, "selected-item", model, "sorter", G_BINDING_SYNC_CREATE);
|
||||||
|
|
||||||
|
factories = g_list_store_new (GTK_TYPE_LIST_ITEM_FACTORY);
|
||||||
|
|
||||||
|
factory = gtk_signal_list_item_factory_new ();
|
||||||
|
g_signal_connect (factory, "setup", G_CALLBACK (setup_simple_listitem_cb), NULL);
|
||||||
|
set_title (factory, "Colors");
|
||||||
|
g_list_store_append (factories, factory);
|
||||||
|
|
||||||
|
factory = gtk_signal_list_item_factory_new ();
|
||||||
|
g_signal_connect (factory, "setup", G_CALLBACK (setup_listitem_cb), NULL);
|
||||||
|
set_title (factory, "Everything");
|
||||||
|
g_list_store_append (factories, factory);
|
||||||
|
|
||||||
|
dropdown = gtk_drop_down_new ();
|
||||||
|
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
|
||||||
|
gtk_box_append (GTK_BOX (box), gtk_label_new ("Show:"));
|
||||||
|
gtk_box_append (GTK_BOX (box), dropdown);
|
||||||
|
gtk_header_bar_pack_end (GTK_HEADER_BAR (header), box);
|
||||||
|
|
||||||
|
expression = gtk_cclosure_expression_new (G_TYPE_STRING,
|
||||||
|
NULL,
|
||||||
|
0, NULL,
|
||||||
|
(GCallback)get_title,
|
||||||
|
NULL, NULL);
|
||||||
|
gtk_drop_down_set_expression (GTK_DROP_DOWN (dropdown), expression);
|
||||||
|
gtk_expression_unref (expression);
|
||||||
|
|
||||||
|
gtk_drop_down_set_model (GTK_DROP_DOWN (dropdown), G_LIST_MODEL (factories));
|
||||||
|
g_object_unref (factories);
|
||||||
|
|
||||||
|
g_object_bind_property (dropdown, "selected-item", gridview, "factory", G_BINDING_SYNC_CREATE);
|
||||||
|
g_object_unref (model);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gtk_widget_get_visible (window))
|
||||||
|
gtk_widget_show (window);
|
||||||
|
else
|
||||||
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
281
demos/gtk-demo/listview_filebrowser.c
Normal file
281
demos/gtk-demo/listview_filebrowser.c
Normal file
@@ -0,0 +1,281 @@
|
|||||||
|
/* Lists/File browser
|
||||||
|
*
|
||||||
|
* This demo shows off the different layouts that are quickly achievable
|
||||||
|
* with GtkListview and GtkGridView by implementing a file browser with
|
||||||
|
* different views.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <glib/gi18n.h>
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
static GtkWidget *window = NULL;
|
||||||
|
|
||||||
|
/* Create a simple object that holds the data for the different views */
|
||||||
|
typedef struct _FileBrowserView FileBrowserView;
|
||||||
|
struct _FileBrowserView
|
||||||
|
{
|
||||||
|
GObject parent_instance;
|
||||||
|
|
||||||
|
GtkListItemFactory *factory;
|
||||||
|
char *icon_name;
|
||||||
|
char *title;
|
||||||
|
GtkOrientation orientation;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PROP_0,
|
||||||
|
PROP_FACTORY,
|
||||||
|
PROP_ICON_NAME,
|
||||||
|
PROP_TITLE,
|
||||||
|
PROP_ORIENTATION,
|
||||||
|
|
||||||
|
N_PROPS
|
||||||
|
};
|
||||||
|
|
||||||
|
#define FILE_BROWSER_TYPE_VIEW (file_browser_view_get_type ())
|
||||||
|
G_DECLARE_FINAL_TYPE (FileBrowserView, file_browser_view, FILE_BROWSER, VIEW, GObject);
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (FileBrowserView, file_browser_view, G_TYPE_OBJECT);
|
||||||
|
static GParamSpec *properties[N_PROPS] = { NULL, };
|
||||||
|
|
||||||
|
static void
|
||||||
|
file_browser_view_get_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
FileBrowserView *self = FILE_BROWSER_VIEW (object);
|
||||||
|
|
||||||
|
switch (property_id)
|
||||||
|
{
|
||||||
|
case PROP_FACTORY:
|
||||||
|
g_value_set_object (value, self->factory);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_ICON_NAME:
|
||||||
|
g_value_set_string (value, self->icon_name);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_TITLE:
|
||||||
|
g_value_set_string (value, self->title);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_ORIENTATION:
|
||||||
|
g_value_set_enum (value, self->orientation);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
file_browser_view_set_property (GObject *object,
|
||||||
|
guint prop_id,
|
||||||
|
const GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
FileBrowserView *self = FILE_BROWSER_VIEW (object);
|
||||||
|
|
||||||
|
switch (prop_id)
|
||||||
|
{
|
||||||
|
case PROP_FACTORY:
|
||||||
|
g_set_object (&self->factory, g_value_get_object (value));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_ICON_NAME:
|
||||||
|
g_free (self->icon_name);
|
||||||
|
self->icon_name = g_value_dup_string (value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_TITLE:
|
||||||
|
g_free (self->title);
|
||||||
|
self->title = g_value_dup_string (value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_ORIENTATION:
|
||||||
|
self->orientation = g_value_get_enum (value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
file_browser_view_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
FileBrowserView *self = FILE_BROWSER_VIEW (object);
|
||||||
|
|
||||||
|
g_object_unref (self->factory);
|
||||||
|
g_free (self->icon_name);
|
||||||
|
g_free (self->title);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (file_browser_view_parent_class)->dispose (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
file_browser_view_class_init (FileBrowserViewClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
gobject_class->get_property = file_browser_view_get_property;
|
||||||
|
gobject_class->set_property = file_browser_view_set_property;
|
||||||
|
gobject_class->finalize = file_browser_view_finalize;
|
||||||
|
|
||||||
|
properties[PROP_FACTORY] =
|
||||||
|
g_param_spec_object ("factory",
|
||||||
|
"factory",
|
||||||
|
"factory to use in the main view",
|
||||||
|
GTK_TYPE_LIST_ITEM_FACTORY,
|
||||||
|
G_PARAM_READWRITE);
|
||||||
|
properties[PROP_ICON_NAME] =
|
||||||
|
g_param_spec_string ("icon-name",
|
||||||
|
"icon name",
|
||||||
|
"icon to display for selecting this view",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READWRITE);
|
||||||
|
properties[PROP_TITLE] =
|
||||||
|
g_param_spec_string ("title",
|
||||||
|
"title",
|
||||||
|
"title to display for selecting this view",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READWRITE);
|
||||||
|
properties[PROP_ORIENTATION] =
|
||||||
|
g_param_spec_enum ("orientation",
|
||||||
|
"orientation",
|
||||||
|
"orientation of the view",
|
||||||
|
GTK_TYPE_ORIENTATION,
|
||||||
|
GTK_ORIENTATION_VERTICAL,
|
||||||
|
G_PARAM_READWRITE);
|
||||||
|
|
||||||
|
g_object_class_install_properties (gobject_class, N_PROPS, properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void file_browser_view_init (FileBrowserView *self)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
filebrowser_get_display_name (GObject *object,
|
||||||
|
GFileInfo *info)
|
||||||
|
{
|
||||||
|
if (!info)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return g_strdup (g_file_info_get_attribute_string (info, "standard::display-name"));
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
filebrowser_get_content_type (GObject *object,
|
||||||
|
GFileInfo *info)
|
||||||
|
{
|
||||||
|
if (!info)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return g_strdup (g_file_info_get_attribute_string (info, "standard::content-type"));
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
filebrowser_get_size (GObject *object,
|
||||||
|
GFileInfo *info)
|
||||||
|
{
|
||||||
|
if (!info)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return g_format_size (g_file_info_get_attribute_uint64 (info, "standard::size"));
|
||||||
|
}
|
||||||
|
|
||||||
|
GIcon *
|
||||||
|
filebrowser_get_icon (GObject *object,
|
||||||
|
GFileInfo *info)
|
||||||
|
{
|
||||||
|
GIcon *icon;
|
||||||
|
|
||||||
|
if (info)
|
||||||
|
icon = G_ICON (g_file_info_get_attribute_object (info, "standard::icon"));
|
||||||
|
else
|
||||||
|
icon = NULL;
|
||||||
|
|
||||||
|
if (icon)
|
||||||
|
g_object_ref (icon);
|
||||||
|
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
filebrowser_up_clicked_cb (GtkButton *button,
|
||||||
|
GtkDirectoryList *list)
|
||||||
|
{
|
||||||
|
GFile *file;
|
||||||
|
|
||||||
|
file = g_file_get_parent (gtk_directory_list_get_file (list));
|
||||||
|
if (file == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gtk_directory_list_set_file (list, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
filebrowser_view_activated_cb (GtkGridView *view,
|
||||||
|
guint pos,
|
||||||
|
GtkDirectoryList *list)
|
||||||
|
{
|
||||||
|
GFileInfo *info;
|
||||||
|
|
||||||
|
info = g_list_model_get_item (gtk_grid_view_get_model (view), pos);
|
||||||
|
if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY)
|
||||||
|
gtk_directory_list_set_file (list, G_FILE (g_file_info_get_attribute_object (info, "standard::file")));
|
||||||
|
|
||||||
|
g_object_unref (info);
|
||||||
|
}
|
||||||
|
|
||||||
|
GtkWidget *
|
||||||
|
do_listview_filebrowser (GtkWidget *do_widget)
|
||||||
|
{
|
||||||
|
if (!window)
|
||||||
|
{
|
||||||
|
GtkWidget *view;
|
||||||
|
GtkBuilder *builder;
|
||||||
|
GtkDirectoryList *dirlist;
|
||||||
|
GFile *file;
|
||||||
|
char *cwd;
|
||||||
|
GtkCssProvider *provider;
|
||||||
|
|
||||||
|
provider = gtk_css_provider_new ();
|
||||||
|
gtk_css_provider_load_from_resource (provider, "/listview_filebrowser/listview_filebrowser.css");
|
||||||
|
gtk_style_context_add_provider_for_display (gdk_display_get_default (),
|
||||||
|
GTK_STYLE_PROVIDER (provider),
|
||||||
|
800);
|
||||||
|
g_object_unref (provider);
|
||||||
|
|
||||||
|
builder = gtk_builder_new_from_resource ("/listview_filebrowser/listview_filebrowser.ui");
|
||||||
|
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
|
||||||
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
|
gtk_widget_get_display (do_widget));
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *) &window);
|
||||||
|
|
||||||
|
/* Create the model and fill it with the contents of the current directory */
|
||||||
|
cwd = g_get_current_dir ();
|
||||||
|
file = g_file_new_for_path (cwd);
|
||||||
|
g_free (cwd);
|
||||||
|
dirlist = GTK_DIRECTORY_LIST (gtk_builder_get_object (builder, "dirlist"));
|
||||||
|
gtk_directory_list_set_file (dirlist, file);
|
||||||
|
g_object_unref (file);
|
||||||
|
|
||||||
|
/* grab focus in the view */
|
||||||
|
view = GTK_WIDGET (gtk_builder_get_object (builder, "view"));
|
||||||
|
gtk_widget_grab_focus (view);
|
||||||
|
|
||||||
|
g_object_unref (builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gtk_widget_get_visible (window))
|
||||||
|
gtk_widget_show (window);
|
||||||
|
else
|
||||||
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
11
demos/gtk-demo/listview_filebrowser.css
Normal file
11
demos/gtk-demo/listview_filebrowser.css
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
list.viewswitcher {
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
list.viewswitcher > row {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
list.viewswitcher row:selected {
|
||||||
|
background: gray;
|
||||||
|
}
|
||||||
249
demos/gtk-demo/listview_filebrowser.ui
Normal file
249
demos/gtk-demo/listview_filebrowser.ui
Normal file
@@ -0,0 +1,249 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<object class="GListStore" id="viewlist">
|
||||||
|
<property name="item-type">FileBrowserView</property>
|
||||||
|
<child>
|
||||||
|
<object class="FileBrowserView">
|
||||||
|
<property name="factory">
|
||||||
|
<object class="GtkBuilderListItemFactory">
|
||||||
|
<property name="bytes"><![CDATA[
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="GtkListItem">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkBox">
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage">
|
||||||
|
<binding name="gicon">
|
||||||
|
<closure type="GIcon" function="filebrowser_get_icon">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</closure>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<binding name="label">
|
||||||
|
<closure type="gchararray" function="filebrowser_get_display_name">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</closure>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
|
]]></property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
<property name="icon-name">view-list-symbolic</property>
|
||||||
|
<property name="title" translatable="yes">List</property>
|
||||||
|
<property name="orientation">horizontal</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="FileBrowserView">
|
||||||
|
<property name="icon-name">view-grid-symbolic</property>
|
||||||
|
<property name="title" translatable="yes">Grid</property>
|
||||||
|
<property name="factory">
|
||||||
|
<object class="GtkBuilderListItemFactory">
|
||||||
|
<property name="bytes"><![CDATA[
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="GtkListItem">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage">
|
||||||
|
<property name="icon-size">large</property>
|
||||||
|
<binding name="gicon">
|
||||||
|
<closure type="GIcon" function="filebrowser_get_icon">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</closure>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="wrap">1</property>
|
||||||
|
<property name="wrap-mode">word-char</property>
|
||||||
|
<property name="lines">2</property>
|
||||||
|
<property name="ellipsize">end</property>
|
||||||
|
<property name="width-chars">10</property>
|
||||||
|
<property name="max-width-chars">30</property>
|
||||||
|
<binding name="label">
|
||||||
|
<closure type="gchararray" function="filebrowser_get_display_name">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</closure>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
|
]]></property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="FileBrowserView">
|
||||||
|
<property name="icon-name">view-paged-symbolic</property>
|
||||||
|
<property name="title" translatable="yes">Paged</property>
|
||||||
|
<property name="factory">
|
||||||
|
<object class="GtkBuilderListItemFactory">
|
||||||
|
<property name="bytes"><![CDATA[
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="GtkListItem">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkBox">
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage">
|
||||||
|
<property name="icon-size">large</property>
|
||||||
|
<binding name="gicon">
|
||||||
|
<closure type="GIcon" function="filebrowser_get_icon">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</closure>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<binding name="label">
|
||||||
|
<closure type="gchararray" function="filebrowser_get_display_name">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</closure>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<binding name="label">
|
||||||
|
<closure type="gchararray" function="filebrowser_get_size">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</closure>
|
||||||
|
</binding>
|
||||||
|
<style>
|
||||||
|
<class name="dim-label"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<binding name="label">
|
||||||
|
<closure type="gchararray" function="filebrowser_get_content_type">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</closure>
|
||||||
|
</binding>
|
||||||
|
<style>
|
||||||
|
<class name="dim-label"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
|
]]></property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">horizontal</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<object class="GtkDirectoryList" id="dirlist">
|
||||||
|
<property name="attributes">standard::name,standard::display-name,standard::icon,standard::size,standard::content-type</property>
|
||||||
|
</object>
|
||||||
|
<object class="GtkWindow" id="window">
|
||||||
|
<property name="title" translatable="yes">File browser</property>
|
||||||
|
<property name="default-width">600</property>
|
||||||
|
<property name="default-height">400</property>
|
||||||
|
<child type="titlebar">
|
||||||
|
<object class="GtkHeaderBar" id="">
|
||||||
|
<property name="show-title-buttons">1</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton">
|
||||||
|
<property name="icon-name">go-up-symbolic</property>
|
||||||
|
<signal name="clicked" handler="filebrowser_up_clicked_cb" object="dirlist" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child type="end">
|
||||||
|
<object class="GtkListView">
|
||||||
|
<property name="valign">center</property>
|
||||||
|
<property name="orientation">horizontal</property>
|
||||||
|
<style>
|
||||||
|
<class name="linked"/>
|
||||||
|
<class name="viewswitcher"/>
|
||||||
|
</style>
|
||||||
|
<property name="model">
|
||||||
|
<object class="GtkSingleSelection" id="selected-view">
|
||||||
|
<property name="model">viewlist</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
<property name="factory">
|
||||||
|
<object class="GtkBuilderListItemFactory">
|
||||||
|
<property name="bytes"><![CDATA[
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="GtkListItem">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkImage">
|
||||||
|
<binding name="icon-name">
|
||||||
|
<lookup type="FileBrowserView" name="icon-name">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</lookup>
|
||||||
|
</binding>
|
||||||
|
<binding name="tooltip-text">
|
||||||
|
<lookup type="FileBrowserView" name="title">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</lookup>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
|
]]></property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkScrolledWindow">
|
||||||
|
<property name="can-focus">1</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkGridView" id="view">
|
||||||
|
<property name="model">dirlist</property>
|
||||||
|
<property name="max-columns">15</property>
|
||||||
|
<binding name="factory">
|
||||||
|
<lookup name="factory" type="FileBrowserView">
|
||||||
|
<lookup name="selected-item">selected-view</lookup>
|
||||||
|
</lookup>
|
||||||
|
</binding>
|
||||||
|
<binding name="orientation">
|
||||||
|
<lookup name="orientation" type="FileBrowserView">
|
||||||
|
<lookup name="selected-item">selected-view</lookup>
|
||||||
|
</lookup>
|
||||||
|
</binding>
|
||||||
|
<signal name="activate" handler="filebrowser_view_activated_cb" object="dirlist" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</interface>
|
||||||
472
demos/gtk-demo/listview_minesweeper.c
Normal file
472
demos/gtk-demo/listview_minesweeper.c
Normal file
@@ -0,0 +1,472 @@
|
|||||||
|
/* Lists/Minesweeper
|
||||||
|
*
|
||||||
|
* This demo shows how to develop a user interface for small game using a
|
||||||
|
* gridview.
|
||||||
|
*
|
||||||
|
* It demonstrates how to use the activate signal and single-press behavior
|
||||||
|
* to implement rather different interaction behavior to a typical list.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <glib/gi18n.h>
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
/*** The cell object ***/
|
||||||
|
|
||||||
|
/* Create an object that holds the data for a cell in the game */
|
||||||
|
typedef struct _SweeperCell SweeperCell;
|
||||||
|
struct _SweeperCell
|
||||||
|
{
|
||||||
|
GObject parent_instance;
|
||||||
|
|
||||||
|
gboolean is_mine;
|
||||||
|
gboolean is_visible;
|
||||||
|
guint neighbor_mines;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
CELL_PROP_0,
|
||||||
|
CELL_PROP_LABEL,
|
||||||
|
|
||||||
|
N_CELL_PROPS
|
||||||
|
};
|
||||||
|
|
||||||
|
#define SWEEPER_TYPE_CELL (sweeper_cell_get_type ())
|
||||||
|
G_DECLARE_FINAL_TYPE (SweeperCell, sweeper_cell, SWEEPER, CELL, GObject);
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (SweeperCell, sweeper_cell, G_TYPE_OBJECT);
|
||||||
|
static GParamSpec *cell_properties[N_CELL_PROPS] = { NULL, };
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
sweeper_cell_get_label (SweeperCell *self)
|
||||||
|
{
|
||||||
|
static const char *minecount_labels[10] = { "", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
||||||
|
|
||||||
|
if (!self->is_visible)
|
||||||
|
return "?";
|
||||||
|
|
||||||
|
if (self->is_mine)
|
||||||
|
return "💣";
|
||||||
|
|
||||||
|
return minecount_labels[self->neighbor_mines];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_cell_get_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
SweeperCell *self = SWEEPER_CELL (object);
|
||||||
|
|
||||||
|
switch (property_id)
|
||||||
|
{
|
||||||
|
case CELL_PROP_LABEL:
|
||||||
|
g_value_set_string (value, sweeper_cell_get_label (self));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_cell_class_init (SweeperCellClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
gobject_class->get_property = sweeper_cell_get_property;
|
||||||
|
|
||||||
|
cell_properties[CELL_PROP_LABEL] =
|
||||||
|
g_param_spec_string ("label",
|
||||||
|
"label",
|
||||||
|
"label to display for this row",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
|
||||||
|
g_object_class_install_properties (gobject_class, N_CELL_PROPS, cell_properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_cell_init (SweeperCell *self)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_cell_reveal (SweeperCell *self)
|
||||||
|
{
|
||||||
|
if (self->is_visible)
|
||||||
|
return;
|
||||||
|
|
||||||
|
self->is_visible = TRUE;
|
||||||
|
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (self), cell_properties[CELL_PROP_LABEL]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static SweeperCell *
|
||||||
|
sweeper_cell_new (void)
|
||||||
|
{
|
||||||
|
return g_object_new (SWEEPER_TYPE_CELL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** The board object ***/
|
||||||
|
|
||||||
|
/* Create an object that holds the data for the game */
|
||||||
|
typedef struct _SweeperGame SweeperGame;
|
||||||
|
struct _SweeperGame
|
||||||
|
{
|
||||||
|
GObject parent_instance;
|
||||||
|
|
||||||
|
GPtrArray *cells;
|
||||||
|
guint width;
|
||||||
|
guint height;
|
||||||
|
gboolean playing;
|
||||||
|
gboolean win;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
GAME_PROP_0,
|
||||||
|
GAME_PROP_HEIGHT,
|
||||||
|
GAME_PROP_PLAYING,
|
||||||
|
GAME_PROP_WIDTH,
|
||||||
|
GAME_PROP_WIN,
|
||||||
|
|
||||||
|
N_GAME_PROPS
|
||||||
|
};
|
||||||
|
|
||||||
|
#define SWEEPER_TYPE_GAME (sweeper_game_get_type ())
|
||||||
|
G_DECLARE_FINAL_TYPE (SweeperGame, sweeper_game, SWEEPER, GAME, GObject);
|
||||||
|
|
||||||
|
static GType
|
||||||
|
sweeper_game_list_model_get_item_type (GListModel *model)
|
||||||
|
{
|
||||||
|
return SWEEPER_TYPE_GAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
sweeper_game_list_model_get_n_items (GListModel *model)
|
||||||
|
{
|
||||||
|
SweeperGame *self = SWEEPER_GAME (model);
|
||||||
|
|
||||||
|
return self->width * self->height;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gpointer
|
||||||
|
sweeper_game_list_model_get_item (GListModel *model,
|
||||||
|
guint position)
|
||||||
|
{
|
||||||
|
SweeperGame *self = SWEEPER_GAME (model);
|
||||||
|
|
||||||
|
return g_object_ref (g_ptr_array_index (self->cells, position));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_game_list_model_init (GListModelInterface *iface)
|
||||||
|
{
|
||||||
|
iface->get_item_type = sweeper_game_list_model_get_item_type;
|
||||||
|
iface->get_n_items = sweeper_game_list_model_get_n_items;
|
||||||
|
iface->get_item = sweeper_game_list_model_get_item;
|
||||||
|
}
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_CODE (SweeperGame, sweeper_game, G_TYPE_OBJECT,
|
||||||
|
G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, sweeper_game_list_model_init))
|
||||||
|
|
||||||
|
static GParamSpec *game_properties[N_GAME_PROPS] = { NULL, };
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_game_dispose (GObject *object)
|
||||||
|
{
|
||||||
|
SweeperGame *self = SWEEPER_GAME (object);
|
||||||
|
|
||||||
|
g_clear_pointer (&self->cells, g_ptr_array_unref);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (sweeper_game_parent_class)->dispose (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_game_get_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
SweeperGame *self = SWEEPER_GAME (object);
|
||||||
|
|
||||||
|
switch (property_id)
|
||||||
|
{
|
||||||
|
case GAME_PROP_HEIGHT:
|
||||||
|
g_value_set_uint (value, self->height);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GAME_PROP_PLAYING:
|
||||||
|
g_value_set_boolean (value, self->playing);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GAME_PROP_WIDTH:
|
||||||
|
g_value_set_uint (value, self->width);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GAME_PROP_WIN:
|
||||||
|
g_value_set_boolean (value, self->win);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_game_class_init (SweeperGameClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
gobject_class->dispose = sweeper_game_dispose;
|
||||||
|
gobject_class->get_property = sweeper_game_get_property;
|
||||||
|
|
||||||
|
game_properties[GAME_PROP_HEIGHT] =
|
||||||
|
g_param_spec_uint ("height",
|
||||||
|
"height",
|
||||||
|
"height of the game grid",
|
||||||
|
1, G_MAXUINT, 8,
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
|
||||||
|
game_properties[GAME_PROP_PLAYING] =
|
||||||
|
g_param_spec_boolean ("playing",
|
||||||
|
"playing",
|
||||||
|
"if the game is still going on",
|
||||||
|
FALSE,
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
|
||||||
|
game_properties[GAME_PROP_WIDTH] =
|
||||||
|
g_param_spec_uint ("width",
|
||||||
|
"width",
|
||||||
|
"width of the game grid",
|
||||||
|
1, G_MAXUINT, 8,
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
|
||||||
|
game_properties[GAME_PROP_WIN] =
|
||||||
|
g_param_spec_boolean ("win",
|
||||||
|
"win",
|
||||||
|
"if the game was won",
|
||||||
|
FALSE,
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
|
||||||
|
g_object_class_install_properties (gobject_class, N_GAME_PROPS, game_properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_game_reset_board (SweeperGame *self,
|
||||||
|
guint width,
|
||||||
|
guint height)
|
||||||
|
{
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
g_ptr_array_set_size (self->cells, 0);
|
||||||
|
|
||||||
|
for (i = 0; i < width * height; i++)
|
||||||
|
{
|
||||||
|
g_ptr_array_add (self->cells, sweeper_cell_new ());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self->width != width)
|
||||||
|
{
|
||||||
|
self->width = width;
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (self), game_properties[GAME_PROP_WIDTH]);
|
||||||
|
}
|
||||||
|
if (self->height != height)
|
||||||
|
{
|
||||||
|
self->height = height;
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (self), game_properties[GAME_PROP_HEIGHT]);
|
||||||
|
}
|
||||||
|
if (!self->playing)
|
||||||
|
{
|
||||||
|
self->playing = TRUE;
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (self), game_properties[GAME_PROP_PLAYING]);
|
||||||
|
}
|
||||||
|
if (self->win)
|
||||||
|
{
|
||||||
|
self->win = FALSE;
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (self), game_properties[GAME_PROP_WIN]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_game_place_mines (SweeperGame *self,
|
||||||
|
guint n_mines)
|
||||||
|
{
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
for (i = 0; i < n_mines; i++)
|
||||||
|
{
|
||||||
|
SweeperCell *cell;
|
||||||
|
|
||||||
|
do {
|
||||||
|
cell = g_ptr_array_index (self->cells, g_random_int_range (0, self->cells->len));
|
||||||
|
} while (cell->is_mine);
|
||||||
|
|
||||||
|
cell->is_mine = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static SweeperCell *
|
||||||
|
get_cell (SweeperGame *self,
|
||||||
|
guint x,
|
||||||
|
guint y)
|
||||||
|
{
|
||||||
|
return g_ptr_array_index (self->cells, y * self->width + x);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_game_count_neighbor_mines (SweeperGame *self,
|
||||||
|
guint width,
|
||||||
|
guint height)
|
||||||
|
{
|
||||||
|
guint x, y, x2, y2;
|
||||||
|
|
||||||
|
for (y = 0; y < height; y++)
|
||||||
|
{
|
||||||
|
for (x = 0; x < width; x++)
|
||||||
|
{
|
||||||
|
SweeperCell *cell = get_cell (self, x, y);
|
||||||
|
|
||||||
|
for (y2 = MAX (1, y) - 1; y2 < MIN (height, y + 2); y2++)
|
||||||
|
{
|
||||||
|
for (x2 = MAX (1, x) - 1; x2 < MIN (width, x + 2); x2++)
|
||||||
|
{
|
||||||
|
SweeperCell *other = get_cell (self, x2, y2);
|
||||||
|
|
||||||
|
if (other->is_mine)
|
||||||
|
cell->neighbor_mines++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_game_new_game (SweeperGame *self,
|
||||||
|
guint width,
|
||||||
|
guint height,
|
||||||
|
guint n_mines)
|
||||||
|
{
|
||||||
|
guint n_items_before;
|
||||||
|
|
||||||
|
g_return_if_fail (n_mines <= width * height);
|
||||||
|
|
||||||
|
n_items_before = self->width * self->height;
|
||||||
|
|
||||||
|
g_object_freeze_notify (G_OBJECT (self));
|
||||||
|
|
||||||
|
sweeper_game_reset_board (self, width, height);
|
||||||
|
sweeper_game_place_mines (self, n_mines);
|
||||||
|
sweeper_game_count_neighbor_mines (self, width, height);
|
||||||
|
|
||||||
|
g_list_model_items_changed (G_LIST_MODEL (self), 0, n_items_before, width * height);
|
||||||
|
|
||||||
|
g_object_thaw_notify (G_OBJECT (self));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_game_init (SweeperGame *self)
|
||||||
|
{
|
||||||
|
self->cells = g_ptr_array_new_with_free_func (g_object_unref);
|
||||||
|
|
||||||
|
sweeper_game_new_game (self, 8, 8, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_game_end (SweeperGame *self,
|
||||||
|
gboolean win)
|
||||||
|
{
|
||||||
|
if (self->playing)
|
||||||
|
{
|
||||||
|
self->playing = FALSE;
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (self), game_properties[GAME_PROP_PLAYING]);
|
||||||
|
}
|
||||||
|
if (self->win != win)
|
||||||
|
{
|
||||||
|
self->win = win;
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (self), game_properties[GAME_PROP_WIN]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_game_check_finished (SweeperGame *self)
|
||||||
|
{
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
if (!self->playing)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < self->cells->len; i++)
|
||||||
|
{
|
||||||
|
SweeperCell *cell = g_ptr_array_index (self->cells, i);
|
||||||
|
|
||||||
|
/* There's still a non-revealed cell that isn't a mine */
|
||||||
|
if (!cell->is_visible && !cell->is_mine)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sweeper_game_end (self, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sweeper_game_reveal_cell (SweeperGame *self,
|
||||||
|
guint position)
|
||||||
|
{
|
||||||
|
SweeperCell *cell;
|
||||||
|
|
||||||
|
if (!self->playing)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cell = g_ptr_array_index (self->cells, position);
|
||||||
|
sweeper_cell_reveal (cell);
|
||||||
|
|
||||||
|
if (cell->is_mine)
|
||||||
|
sweeper_game_end (self, FALSE);
|
||||||
|
|
||||||
|
sweeper_game_check_finished (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
minesweeper_cell_clicked_cb (GtkGridView *gridview,
|
||||||
|
guint pos,
|
||||||
|
SweeperGame *game)
|
||||||
|
{
|
||||||
|
sweeper_game_reveal_cell (game, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
minesweeper_new_game_cb (GtkButton *button,
|
||||||
|
SweeperGame *game)
|
||||||
|
{
|
||||||
|
sweeper_game_new_game (game, 8, 8, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget *window = NULL;
|
||||||
|
|
||||||
|
GtkWidget *
|
||||||
|
do_listview_minesweeper (GtkWidget *do_widget)
|
||||||
|
{
|
||||||
|
if (window == NULL)
|
||||||
|
{
|
||||||
|
GtkBuilder *builder;
|
||||||
|
|
||||||
|
g_type_ensure (SWEEPER_TYPE_GAME);
|
||||||
|
|
||||||
|
builder = gtk_builder_new_from_resource ("/listview_minesweeper/listview_minesweeper.ui");
|
||||||
|
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
|
||||||
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
|
gtk_widget_get_display (do_widget));
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *) &window);
|
||||||
|
|
||||||
|
g_object_unref (builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gtk_widget_get_visible (window))
|
||||||
|
gtk_widget_show (window);
|
||||||
|
else
|
||||||
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
49
demos/gtk-demo/listview_minesweeper.ui
Normal file
49
demos/gtk-demo/listview_minesweeper.ui
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<object class="SweeperGame" id="game">
|
||||||
|
</object>
|
||||||
|
<object class="GtkWindow" id="window">
|
||||||
|
<property name="title" translatable="yes">Minesweeper</property>
|
||||||
|
<child type="titlebar">
|
||||||
|
<object class="GtkHeaderBar" id="">
|
||||||
|
<property name="show-title-buttons">1</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton">
|
||||||
|
<property name="label">New Game</property>
|
||||||
|
<signal name="clicked" handler="minesweeper_new_game_cb" object="game" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child type="title">
|
||||||
|
<object class="GtkImage">
|
||||||
|
<property name="icon-name">trophy-gold</property>
|
||||||
|
<binding name="visible">
|
||||||
|
<lookup name="win">game</lookup>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkGridView" id="view">
|
||||||
|
<property name="model">
|
||||||
|
<object class="GtkNoSelection">
|
||||||
|
<property name="model">game</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
<property name="single-click-activate">1</property>
|
||||||
|
<binding name="max-columns">
|
||||||
|
<lookup name="width">game</lookup>
|
||||||
|
</binding>
|
||||||
|
<binding name="min-columns">
|
||||||
|
<lookup name="width">game</lookup>
|
||||||
|
</binding>
|
||||||
|
<property name="factory">
|
||||||
|
<object class="GtkBuilderListItemFactory">
|
||||||
|
<property name="resource">/listview_minesweeper/listview_minesweeper_cell.ui</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
<signal name="activate" handler="minesweeper_cell_clicked_cb" object="game" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</interface>
|
||||||
16
demos/gtk-demo/listview_minesweeper_cell.ui
Normal file
16
demos/gtk-demo/listview_minesweeper_cell.ui
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="GtkListItem">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="halign">center</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
|
<binding name="label">
|
||||||
|
<lookup name="label" type="SweeperCell">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</lookup>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
442
demos/gtk-demo/listview_settings.c
Normal file
442
demos/gtk-demo/listview_settings.c
Normal file
@@ -0,0 +1,442 @@
|
|||||||
|
/* Lists/Settings
|
||||||
|
*
|
||||||
|
* This demo shows a settings viewer for GSettings.
|
||||||
|
*
|
||||||
|
* It demonstrates how to implement support for trees with GtkListView.
|
||||||
|
* It also shows how to set up sorting and filtering for columns in a
|
||||||
|
* GtkColumnView.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* Create an object that wraps GSettingsSchemaKey because that's a boxed type */
|
||||||
|
typedef struct _SettingsKey SettingsKey;
|
||||||
|
struct _SettingsKey
|
||||||
|
{
|
||||||
|
GObject parent_instance;
|
||||||
|
|
||||||
|
GSettings *settings;
|
||||||
|
GSettingsSchemaKey *key;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PROP_0,
|
||||||
|
PROP_NAME,
|
||||||
|
PROP_SUMMARY,
|
||||||
|
PROP_DESCRIPTION,
|
||||||
|
PROP_VALUE,
|
||||||
|
PROP_TYPE,
|
||||||
|
PROP_DEFAULT_VALUE,
|
||||||
|
|
||||||
|
N_PROPS
|
||||||
|
};
|
||||||
|
|
||||||
|
#define SETTINGS_TYPE_KEY (settings_key_get_type ())
|
||||||
|
G_DECLARE_FINAL_TYPE (SettingsKey, settings_key, SETTINGS, KEY, GObject);
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (SettingsKey, settings_key, G_TYPE_OBJECT);
|
||||||
|
static GParamSpec *properties[N_PROPS] = { NULL, };
|
||||||
|
|
||||||
|
static void
|
||||||
|
settings_key_get_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
SettingsKey *self = SETTINGS_KEY (object);
|
||||||
|
|
||||||
|
switch (property_id)
|
||||||
|
{
|
||||||
|
case PROP_DESCRIPTION:
|
||||||
|
g_value_set_string (value, g_settings_schema_key_get_description (self->key));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_NAME:
|
||||||
|
g_value_set_string (value, g_settings_schema_key_get_name (self->key));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_SUMMARY:
|
||||||
|
g_value_set_string (value, g_settings_schema_key_get_summary (self->key));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_VALUE:
|
||||||
|
{
|
||||||
|
GVariant *variant = g_settings_get_value (self->settings, g_settings_schema_key_get_name (self->key));
|
||||||
|
g_value_take_string (value, g_variant_print (variant, FALSE));
|
||||||
|
g_variant_unref (variant);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_TYPE:
|
||||||
|
{
|
||||||
|
const GVariantType *type = g_settings_schema_key_get_value_type (self->key);
|
||||||
|
g_value_set_string (value, g_variant_type_peek_string (type));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_DEFAULT_VALUE:
|
||||||
|
{
|
||||||
|
GVariant *variant = g_settings_schema_key_get_default_value (self->key);
|
||||||
|
g_value_take_string (value, g_variant_print (variant, FALSE));
|
||||||
|
g_variant_unref (variant);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
settings_key_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
SettingsKey *self = SETTINGS_KEY (object);
|
||||||
|
|
||||||
|
g_object_unref (self->settings);
|
||||||
|
g_settings_schema_key_unref (self->key);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (settings_key_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
settings_key_class_init (SettingsKeyClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
gobject_class->finalize = settings_key_finalize;
|
||||||
|
gobject_class->get_property = settings_key_get_property;
|
||||||
|
|
||||||
|
properties[PROP_DESCRIPTION] =
|
||||||
|
g_param_spec_string ("description", NULL, NULL, NULL, G_PARAM_READABLE);
|
||||||
|
properties[PROP_NAME] =
|
||||||
|
g_param_spec_string ("name", NULL, NULL, NULL, G_PARAM_READABLE);
|
||||||
|
properties[PROP_SUMMARY] =
|
||||||
|
g_param_spec_string ("summary", NULL, NULL, NULL, G_PARAM_READABLE);
|
||||||
|
properties[PROP_VALUE] =
|
||||||
|
g_param_spec_string ("value", NULL, NULL, NULL, G_PARAM_READABLE);
|
||||||
|
properties[PROP_TYPE] =
|
||||||
|
g_param_spec_string ("type", NULL, NULL, NULL, G_PARAM_READABLE);
|
||||||
|
properties[PROP_DEFAULT_VALUE] =
|
||||||
|
g_param_spec_string ("default-value", NULL, NULL, NULL, G_PARAM_READABLE);
|
||||||
|
|
||||||
|
g_object_class_install_properties (gobject_class, N_PROPS, properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
settings_key_init (SettingsKey *self)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static SettingsKey *
|
||||||
|
settings_key_new (GSettings *settings,
|
||||||
|
GSettingsSchemaKey *key)
|
||||||
|
{
|
||||||
|
SettingsKey *result = g_object_new (SETTINGS_TYPE_KEY, NULL);
|
||||||
|
|
||||||
|
result->settings = g_object_ref (settings);
|
||||||
|
result->key = g_settings_schema_key_ref (key);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
item_value_changed (GtkEditableLabel *label,
|
||||||
|
GParamSpec *pspec,
|
||||||
|
GtkListItem *item)
|
||||||
|
{
|
||||||
|
SettingsKey *self;
|
||||||
|
const char *text;
|
||||||
|
const GVariantType *type;
|
||||||
|
GVariant *variant;
|
||||||
|
GError *error = NULL;
|
||||||
|
const char *name;
|
||||||
|
char *value;
|
||||||
|
|
||||||
|
text = gtk_editable_get_text (GTK_EDITABLE (label));
|
||||||
|
|
||||||
|
g_object_get (item, "item", &self, NULL);
|
||||||
|
g_object_unref (self);
|
||||||
|
|
||||||
|
type = g_settings_schema_key_get_value_type (self->key);
|
||||||
|
name = g_settings_schema_key_get_name (self->key);
|
||||||
|
|
||||||
|
variant = g_variant_parse (type, text, NULL, NULL, &error);
|
||||||
|
if (!variant)
|
||||||
|
{
|
||||||
|
g_warning ("%s", error->message);
|
||||||
|
g_clear_error (&error);
|
||||||
|
goto revert;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g_settings_schema_key_range_check (self->key, variant))
|
||||||
|
{
|
||||||
|
g_warning ("Not a valid value for %s", name);
|
||||||
|
goto revert;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_settings_set_value (self->settings, name, variant);
|
||||||
|
g_variant_unref (variant);
|
||||||
|
return;
|
||||||
|
|
||||||
|
revert:
|
||||||
|
gtk_widget_error_bell (GTK_WIDGET (label));
|
||||||
|
|
||||||
|
g_object_get (self, "value", &value, NULL);
|
||||||
|
gtk_editable_set_text (GTK_EDITABLE (label), value);
|
||||||
|
g_free (value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
strvcmp (gconstpointer p1,
|
||||||
|
gconstpointer p2)
|
||||||
|
{
|
||||||
|
const char * const *s1 = p1;
|
||||||
|
const char * const *s2 = p2;
|
||||||
|
|
||||||
|
return strcmp (*s1, *s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkFilter *current_filter;
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
transform_settings_to_keys (GBinding *binding,
|
||||||
|
const GValue *from_value,
|
||||||
|
GValue *to_value,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
GtkTreeListRow *treelistrow;
|
||||||
|
GSettings *settings;
|
||||||
|
GSettingsSchema *schema;
|
||||||
|
GListStore *store;
|
||||||
|
GtkSortListModel *sort_model;
|
||||||
|
GtkFilterListModel *filter_model;
|
||||||
|
GtkFilter *filter;
|
||||||
|
GtkNoSelection *selection_model;
|
||||||
|
GtkExpression *expression;
|
||||||
|
char **keys;
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
treelistrow = g_value_get_object (from_value);
|
||||||
|
if (treelistrow == NULL)
|
||||||
|
return TRUE;
|
||||||
|
settings = gtk_tree_list_row_get_item (treelistrow);
|
||||||
|
g_object_get (settings, "settings-schema", &schema, NULL);
|
||||||
|
|
||||||
|
store = g_list_store_new (SETTINGS_TYPE_KEY);
|
||||||
|
|
||||||
|
keys = g_settings_schema_list_keys (schema);
|
||||||
|
|
||||||
|
for (i = 0; keys[i] != NULL; i++)
|
||||||
|
{
|
||||||
|
GSettingsSchemaKey *almost_there = g_settings_schema_get_key (schema, keys[i]);
|
||||||
|
SettingsKey *finally = settings_key_new (settings, almost_there);
|
||||||
|
g_list_store_append (store, finally);
|
||||||
|
g_object_unref (finally);
|
||||||
|
g_settings_schema_key_unref (almost_there);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_strfreev (keys);
|
||||||
|
g_settings_schema_unref (schema);
|
||||||
|
g_object_unref (settings);
|
||||||
|
|
||||||
|
sort_model = gtk_sort_list_model_new (G_LIST_MODEL (store),
|
||||||
|
gtk_column_view_get_sorter (GTK_COLUMN_VIEW (data)));
|
||||||
|
g_object_unref (store);
|
||||||
|
|
||||||
|
expression = gtk_property_expression_new (SETTINGS_TYPE_KEY, NULL, "name");
|
||||||
|
filter = gtk_string_filter_new ();
|
||||||
|
gtk_string_filter_set_expression (GTK_STRING_FILTER (filter), expression);
|
||||||
|
filter_model = gtk_filter_list_model_new (G_LIST_MODEL (sort_model), filter);
|
||||||
|
gtk_expression_unref (expression);
|
||||||
|
g_object_unref (sort_model);
|
||||||
|
|
||||||
|
g_set_object (¤t_filter, filter);
|
||||||
|
|
||||||
|
g_object_unref (filter);
|
||||||
|
|
||||||
|
selection_model = gtk_no_selection_new (G_LIST_MODEL (filter_model));
|
||||||
|
g_object_unref (filter_model);
|
||||||
|
|
||||||
|
g_value_take_object (to_value, selection_model);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GListModel *
|
||||||
|
create_settings_model (gpointer item,
|
||||||
|
gpointer unused)
|
||||||
|
{
|
||||||
|
GSettings *settings = item;
|
||||||
|
char **schemas;
|
||||||
|
GListStore *result;
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
if (settings == NULL)
|
||||||
|
{
|
||||||
|
g_settings_schema_source_list_schemas (g_settings_schema_source_get_default (),
|
||||||
|
TRUE,
|
||||||
|
&schemas,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
schemas = g_settings_list_children (settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (schemas == NULL || schemas[0] == NULL)
|
||||||
|
{
|
||||||
|
g_free (schemas);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
qsort (schemas, g_strv_length (schemas), sizeof (char *), strvcmp);
|
||||||
|
|
||||||
|
result = g_list_store_new (G_TYPE_SETTINGS);
|
||||||
|
for (i = 0; schemas[i] != NULL; i++)
|
||||||
|
{
|
||||||
|
GSettings *child;
|
||||||
|
|
||||||
|
if (settings == NULL)
|
||||||
|
child = g_settings_new (schemas[i]);
|
||||||
|
else
|
||||||
|
child = g_settings_get_child (settings, schemas[i]);
|
||||||
|
|
||||||
|
g_list_store_append (result, child);
|
||||||
|
g_object_unref (child);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_strfreev (schemas);
|
||||||
|
|
||||||
|
return G_LIST_MODEL (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
search_enabled (GtkSearchEntry *entry)
|
||||||
|
{
|
||||||
|
gtk_editable_set_text (GTK_EDITABLE (entry), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
search_changed (GtkSearchEntry *entry,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
const char *text = gtk_editable_get_text (GTK_EDITABLE (entry));
|
||||||
|
|
||||||
|
if (current_filter)
|
||||||
|
gtk_string_filter_set_search (GTK_STRING_FILTER (current_filter), text);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
stop_search (GtkSearchEntry *entry,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
gtk_editable_set_text (GTK_EDITABLE (entry), "");
|
||||||
|
|
||||||
|
if (current_filter)
|
||||||
|
gtk_string_filter_set_search (GTK_STRING_FILTER (current_filter), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget *window = NULL;
|
||||||
|
|
||||||
|
GtkWidget *
|
||||||
|
do_listview_settings (GtkWidget *do_widget)
|
||||||
|
{
|
||||||
|
if (window == NULL)
|
||||||
|
{
|
||||||
|
GtkWidget *listview, *columnview;
|
||||||
|
GListModel *model;
|
||||||
|
GtkTreeListModel *treemodel;
|
||||||
|
GtkSingleSelection *selection;
|
||||||
|
GtkBuilderScope *scope;
|
||||||
|
GtkBuilder *builder;
|
||||||
|
GtkColumnViewColumn *name_column;
|
||||||
|
GtkColumnViewColumn *type_column;
|
||||||
|
GtkColumnViewColumn *default_column;
|
||||||
|
GtkColumnViewColumn *summary_column;
|
||||||
|
GtkColumnViewColumn *description_column;
|
||||||
|
GtkSorter *sorter;
|
||||||
|
GActionGroup *actions;
|
||||||
|
GAction *action;
|
||||||
|
|
||||||
|
g_type_ensure (SETTINGS_TYPE_KEY);
|
||||||
|
|
||||||
|
scope = gtk_builder_cscope_new ();
|
||||||
|
gtk_builder_cscope_add_callback_symbol (GTK_BUILDER_CSCOPE (scope), "search_enabled", (GCallback)search_enabled);
|
||||||
|
gtk_builder_cscope_add_callback_symbol (GTK_BUILDER_CSCOPE (scope), "search_changed", (GCallback)search_changed);
|
||||||
|
gtk_builder_cscope_add_callback_symbol (GTK_BUILDER_CSCOPE (scope), "stop_search", (GCallback)stop_search);
|
||||||
|
gtk_builder_cscope_add_callback_symbol (GTK_BUILDER_CSCOPE (scope), "item_value_changed", (GCallback)item_value_changed);
|
||||||
|
|
||||||
|
builder = gtk_builder_new ();
|
||||||
|
gtk_builder_set_scope (builder, scope);
|
||||||
|
gtk_builder_add_from_resource (builder, "/listview_settings/listview_settings.ui", NULL);
|
||||||
|
|
||||||
|
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
|
||||||
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
|
gtk_widget_get_display (do_widget));
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *) &window);
|
||||||
|
|
||||||
|
listview = GTK_WIDGET (gtk_builder_get_object (builder, "listview"));
|
||||||
|
columnview = GTK_WIDGET (gtk_builder_get_object (builder, "columnview"));
|
||||||
|
type_column = GTK_COLUMN_VIEW_COLUMN (gtk_builder_get_object (builder, "type_column"));
|
||||||
|
default_column = GTK_COLUMN_VIEW_COLUMN (gtk_builder_get_object (builder, "default_column"));
|
||||||
|
summary_column = GTK_COLUMN_VIEW_COLUMN (gtk_builder_get_object (builder, "summary_column"));
|
||||||
|
description_column = GTK_COLUMN_VIEW_COLUMN (gtk_builder_get_object (builder, "description_column"));
|
||||||
|
|
||||||
|
actions = G_ACTION_GROUP (g_simple_action_group_new ());
|
||||||
|
|
||||||
|
action = G_ACTION (g_property_action_new ("show-type", type_column, "visible"));
|
||||||
|
g_action_map_add_action (G_ACTION_MAP (actions), action);
|
||||||
|
g_object_unref (action);
|
||||||
|
|
||||||
|
action = G_ACTION (g_property_action_new ("show-default", default_column, "visible"));
|
||||||
|
g_action_map_add_action (G_ACTION_MAP (actions), action);
|
||||||
|
g_object_unref (action);
|
||||||
|
|
||||||
|
action = G_ACTION (g_property_action_new ("show-summary", summary_column, "visible"));
|
||||||
|
g_action_map_add_action (G_ACTION_MAP (actions), action);
|
||||||
|
g_object_unref (action);
|
||||||
|
|
||||||
|
action = G_ACTION (g_property_action_new ("show-description", description_column, "visible"));
|
||||||
|
g_action_map_add_action (G_ACTION_MAP (actions), action);
|
||||||
|
g_object_unref (action);
|
||||||
|
|
||||||
|
gtk_widget_insert_action_group (columnview, "columnview", actions);
|
||||||
|
g_object_unref (actions);
|
||||||
|
|
||||||
|
model = create_settings_model (NULL, NULL);
|
||||||
|
treemodel = gtk_tree_list_model_new (FALSE,
|
||||||
|
model,
|
||||||
|
TRUE,
|
||||||
|
create_settings_model,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
selection = gtk_single_selection_new (G_LIST_MODEL (treemodel));
|
||||||
|
g_object_bind_property_full (selection, "selected-item",
|
||||||
|
columnview, "model",
|
||||||
|
G_BINDING_SYNC_CREATE,
|
||||||
|
transform_settings_to_keys,
|
||||||
|
NULL,
|
||||||
|
columnview, NULL);
|
||||||
|
gtk_list_view_set_model (GTK_LIST_VIEW (listview), G_LIST_MODEL (selection));
|
||||||
|
g_object_unref (selection);
|
||||||
|
g_object_unref (treemodel);
|
||||||
|
g_object_unref (model);
|
||||||
|
|
||||||
|
name_column = GTK_COLUMN_VIEW_COLUMN (gtk_builder_get_object (builder, "name_column"));
|
||||||
|
sorter = gtk_string_sorter_new (gtk_property_expression_new (SETTINGS_TYPE_KEY, NULL, "name"));
|
||||||
|
gtk_column_view_column_set_sorter (name_column, sorter);
|
||||||
|
g_object_unref (sorter);
|
||||||
|
|
||||||
|
g_object_unref (builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gtk_widget_get_visible (window))
|
||||||
|
gtk_widget_show (window);
|
||||||
|
else
|
||||||
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
280
demos/gtk-demo/listview_settings.ui
Normal file
280
demos/gtk-demo/listview_settings.ui
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<object class="GtkWindow" id="window">
|
||||||
|
<property name="title" translatable="yes">Settings</property>
|
||||||
|
<property name="default-width">640</property>
|
||||||
|
<property name="default-height">480</property>
|
||||||
|
<child type="titlebar">
|
||||||
|
<object class="GtkHeaderBar">
|
||||||
|
<property name="show-title-buttons">1</property>
|
||||||
|
<child type="end">
|
||||||
|
<object class="GtkToggleButton" id="search_button">
|
||||||
|
<property name="icon-name">system-search-symbolic</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkPaned">
|
||||||
|
<property name="position">300</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkScrolledWindow">
|
||||||
|
<child>
|
||||||
|
<object class="GtkListView" id="listview">
|
||||||
|
<property name="factory">
|
||||||
|
<object class="GtkBuilderListItemFactory">
|
||||||
|
<property name="bytes"><![CDATA[
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="GtkListItem">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkTreeExpander" id="expander">
|
||||||
|
<binding name="list-row">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</binding>
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<binding name="label">
|
||||||
|
<lookup name="schema" type="GSettings">
|
||||||
|
<lookup name="item">expander</lookup>
|
||||||
|
</lookup>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
|
]]></property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSearchBar">
|
||||||
|
<property name="search-mode-enabled" bind-source="search_button" bind-property="active" bind-flags="bidirectional"/>
|
||||||
|
<signal name="notify::search-mode-enabled" handler="search_enabled" object="entry"/>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSearchEntry" id="entry">
|
||||||
|
<signal name="search-changed" handler="search_changed"/>
|
||||||
|
<signal name="stop-search" handler="stop_search"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkScrolledWindow">
|
||||||
|
<property name="hexpand">1</property>
|
||||||
|
<property name="vexpand">1</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkColumnView" id="columnview">
|
||||||
|
<child>
|
||||||
|
<object class="GtkColumnViewColumn" id="name_column">
|
||||||
|
<property name="title">Name</property>
|
||||||
|
<property name="header-menu">header_menu</property>
|
||||||
|
<property name="factory">
|
||||||
|
<object class="GtkBuilderListItemFactory">
|
||||||
|
<property name="bytes"><![CDATA[
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="GtkListItem">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<binding name="label">
|
||||||
|
<lookup name="name" type="SettingsKey">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</lookup>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
|
]]></property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkColumnViewColumn">
|
||||||
|
<property name="title">Value</property>
|
||||||
|
<property name="resizable">1</property>
|
||||||
|
<property name="header-menu">header_menu</property>
|
||||||
|
<property name="factory">
|
||||||
|
<object class="GtkBuilderListItemFactory">
|
||||||
|
<property name="bytes"><![CDATA[
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="GtkListItem">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkEditableLabel">
|
||||||
|
<binding name="text">
|
||||||
|
<lookup name="value" type="SettingsKey">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</lookup>
|
||||||
|
</binding>
|
||||||
|
<signal name="notify::label" handler="item_value_changed"/>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
|
]]></property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkColumnViewColumn" id="type_column">
|
||||||
|
<property name="title">Type</property>
|
||||||
|
<property name="resizable">1</property>
|
||||||
|
<property name="header-menu">header_menu</property>
|
||||||
|
<property name="factory">
|
||||||
|
<object class="GtkBuilderListItemFactory">
|
||||||
|
<property name="bytes"><![CDATA[
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="GtkListItem">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<binding name="label">
|
||||||
|
<lookup name="type" type="SettingsKey">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</lookup>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
|
]]></property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkColumnViewColumn" id="default_column">
|
||||||
|
<property name="title">Default</property>
|
||||||
|
<property name="resizable">1</property>
|
||||||
|
<property name="expand">1</property>
|
||||||
|
<property name="header-menu">header_menu</property>
|
||||||
|
<property name="factory">
|
||||||
|
<object class="GtkBuilderListItemFactory">
|
||||||
|
<property name="bytes"><![CDATA[
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="GtkListItem">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<binding name="label">
|
||||||
|
<lookup name="default-value" type="SettingsKey">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</lookup>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
|
]]></property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkColumnViewColumn" id="summary_column">
|
||||||
|
<property name="title">Summary</property>
|
||||||
|
<property name="resizable">1</property>
|
||||||
|
<property name="visible">0</property>
|
||||||
|
<property name="expand">1</property>
|
||||||
|
<property name="header-menu">header_menu</property>
|
||||||
|
<property name="factory">
|
||||||
|
<object class="GtkBuilderListItemFactory">
|
||||||
|
<property name="bytes"><![CDATA[
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="GtkListItem">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="wrap">1</property>
|
||||||
|
<binding name="label">
|
||||||
|
<lookup name="summary" type="SettingsKey">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</lookup>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
|
]]></property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkColumnViewColumn" id="description_column">
|
||||||
|
<property name="title">Description</property>
|
||||||
|
<property name="resizable">1</property>
|
||||||
|
<property name="visible">0</property>
|
||||||
|
<property name="expand">1</property>
|
||||||
|
<property name="header-menu">header_menu</property>
|
||||||
|
<property name="factory">
|
||||||
|
<object class="GtkBuilderListItemFactory">
|
||||||
|
<property name="bytes"><![CDATA[
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="GtkListItem">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="wrap">1</property>
|
||||||
|
<binding name="label">
|
||||||
|
<lookup name="description" type="SettingsKey">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</lookup>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
|
]]></property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<menu id="header_menu">
|
||||||
|
<section>
|
||||||
|
<item>
|
||||||
|
<attribute name="label" translatable="yes">Type</attribute>
|
||||||
|
<attribute name="action">columnview.show-type</attribute>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<attribute name="label" translatable="yes">Default value</attribute>
|
||||||
|
<attribute name="action">columnview.show-default</attribute>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<attribute name="label" translatable="yes">Summary</attribute>
|
||||||
|
<attribute name="action">columnview.show-summary</attribute>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<attribute name="label" translatable="yes">Description</attribute>
|
||||||
|
<attribute name="action">columnview.show-description</attribute>
|
||||||
|
</item>
|
||||||
|
</section>
|
||||||
|
</menu>
|
||||||
|
</interface>
|
||||||
328
demos/gtk-demo/listview_weather.c
Normal file
328
demos/gtk-demo/listview_weather.c
Normal file
@@ -0,0 +1,328 @@
|
|||||||
|
/* Lists/Weather
|
||||||
|
*
|
||||||
|
* This demo shows a few of the rarer features of GtkListView and
|
||||||
|
* how they can be used to display weather information.
|
||||||
|
*
|
||||||
|
* The hourly weather info uses a horizontal listview. This is easy
|
||||||
|
* to achieve because GtkListView implements the GtkOrientable interface.
|
||||||
|
* To make the items in the list stand out more, the listview uses
|
||||||
|
* separators.
|
||||||
|
*
|
||||||
|
* A GtkNoSelectionModel is used to make sure no item in the list can be
|
||||||
|
* selected. All other interactions with the items is still possible.
|
||||||
|
*
|
||||||
|
* The dataset used here has 70 000 items.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
#define GTK_TYPE_WEATHER_INFO (gtk_weather_info_get_type ())
|
||||||
|
|
||||||
|
G_DECLARE_FINAL_TYPE (GtkWeatherInfo, gtk_weather_info, GTK, WEATHER_INFO, GObject)
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
GTK_WEATHER_CLEAR,
|
||||||
|
GTK_WEATHER_FEW_CLOUDS,
|
||||||
|
GTK_WEATHER_FOG,
|
||||||
|
GTK_WEATHER_OVERCAST,
|
||||||
|
GTK_WEATHER_SCATTERED_SHOWERS,
|
||||||
|
GTK_WEATHER_SHOWERS,
|
||||||
|
GTK_WEATHER_SNOW,
|
||||||
|
GTK_WEATHER_STORM
|
||||||
|
} GtkWeatherType;
|
||||||
|
|
||||||
|
struct _GtkWeatherInfo
|
||||||
|
{
|
||||||
|
GObject parent_instance;
|
||||||
|
|
||||||
|
gint64 timestamp;
|
||||||
|
int temperature;
|
||||||
|
GtkWeatherType weather_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _GtkWeatherInfoClass
|
||||||
|
{
|
||||||
|
GObjectClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (GtkWeatherInfo, gtk_weather_info, G_TYPE_OBJECT)
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_weather_info_class_init (GtkWeatherInfoClass *klass)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_weather_info_init (GtkWeatherInfo *self)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWeatherInfo *
|
||||||
|
gtk_weather_info_new (GDateTime *timestamp,
|
||||||
|
GtkWeatherInfo *copy_from)
|
||||||
|
{
|
||||||
|
GtkWeatherInfo *result;
|
||||||
|
|
||||||
|
result = g_object_new (GTK_TYPE_WEATHER_INFO, NULL);
|
||||||
|
|
||||||
|
result->timestamp = g_date_time_to_unix (timestamp);
|
||||||
|
if (copy_from)
|
||||||
|
{
|
||||||
|
result->temperature = copy_from->temperature;
|
||||||
|
result->weather_type = copy_from->weather_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GDateTime *
|
||||||
|
parse_timestamp (const char *string,
|
||||||
|
GTimeZone *_tz)
|
||||||
|
{
|
||||||
|
char *with_seconds;
|
||||||
|
GDateTime *result;
|
||||||
|
|
||||||
|
with_seconds = g_strconcat (string, ":00", NULL);
|
||||||
|
result = g_date_time_new_from_iso8601 (with_seconds, _tz);
|
||||||
|
g_free (with_seconds);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWeatherType
|
||||||
|
parse_weather_type (const char *clouds,
|
||||||
|
const char *precip,
|
||||||
|
GtkWeatherType fallback)
|
||||||
|
{
|
||||||
|
if (strstr (precip, "SN"))
|
||||||
|
return GTK_WEATHER_SNOW;
|
||||||
|
|
||||||
|
if (strstr (precip, "TS"))
|
||||||
|
return GTK_WEATHER_STORM;
|
||||||
|
|
||||||
|
if (strstr (precip, "DZ"))
|
||||||
|
return GTK_WEATHER_SCATTERED_SHOWERS;
|
||||||
|
|
||||||
|
if (strstr (precip, "SH") || strstr (precip, "RA"))
|
||||||
|
return GTK_WEATHER_SHOWERS;
|
||||||
|
|
||||||
|
if (strstr (precip, "FG"))
|
||||||
|
return GTK_WEATHER_FOG;
|
||||||
|
|
||||||
|
if (g_str_equal (clouds, "M") ||
|
||||||
|
g_str_equal (clouds, ""))
|
||||||
|
return fallback;
|
||||||
|
|
||||||
|
if (strstr (clouds, "OVC") ||
|
||||||
|
strstr (clouds, "BKN"))
|
||||||
|
return GTK_WEATHER_OVERCAST;
|
||||||
|
|
||||||
|
if (strstr (clouds, "BKN") ||
|
||||||
|
strstr (clouds, "SCT"))
|
||||||
|
return GTK_WEATHER_FEW_CLOUDS;
|
||||||
|
|
||||||
|
if (strstr (clouds, "VV"))
|
||||||
|
return GTK_WEATHER_FOG;
|
||||||
|
|
||||||
|
return GTK_WEATHER_CLEAR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static double
|
||||||
|
parse_temperature (const char *s,
|
||||||
|
double fallback)
|
||||||
|
{
|
||||||
|
char *endptr;
|
||||||
|
double d;
|
||||||
|
|
||||||
|
d = g_ascii_strtod (s, &endptr);
|
||||||
|
if (*endptr != '\0')
|
||||||
|
return fallback;
|
||||||
|
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GListModel *
|
||||||
|
create_weather_model (void)
|
||||||
|
{
|
||||||
|
GListStore *store;
|
||||||
|
GTimeZone *utc;
|
||||||
|
GDateTime *timestamp;
|
||||||
|
GtkWeatherInfo *info;
|
||||||
|
GBytes *data;
|
||||||
|
char **lines;
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
store = g_list_store_new (GTK_TYPE_WEATHER_INFO);
|
||||||
|
data = g_resources_lookup_data ("/listview_weather/listview_weather.txt", 0, NULL);
|
||||||
|
lines = g_strsplit (g_bytes_get_data (data, NULL), "\n", 0);
|
||||||
|
|
||||||
|
utc = g_time_zone_new_utc ();
|
||||||
|
timestamp = g_date_time_new (utc, 2011, 1, 1, 0, 0, 0);
|
||||||
|
info = gtk_weather_info_new (timestamp, NULL);
|
||||||
|
g_list_store_append (store, info);
|
||||||
|
g_object_unref (info);
|
||||||
|
|
||||||
|
for (i = 0; lines[i] != NULL && *lines[i]; i++)
|
||||||
|
{
|
||||||
|
char **fields;
|
||||||
|
GDateTime *date;
|
||||||
|
|
||||||
|
fields = g_strsplit (lines[i], ",", 0);
|
||||||
|
date = parse_timestamp (fields[0], utc);
|
||||||
|
while (g_date_time_difference (date, timestamp) > 30 * G_TIME_SPAN_MINUTE)
|
||||||
|
{
|
||||||
|
GDateTime *new_timestamp = g_date_time_add_hours (timestamp, 1);
|
||||||
|
g_date_time_unref (timestamp);
|
||||||
|
timestamp = new_timestamp;
|
||||||
|
info = gtk_weather_info_new (timestamp, info);
|
||||||
|
g_list_store_append (store, info);
|
||||||
|
g_object_unref (info);
|
||||||
|
}
|
||||||
|
|
||||||
|
info->temperature = parse_temperature (fields[1], info->temperature);
|
||||||
|
info->weather_type = parse_weather_type (fields[2], fields[3], info->weather_type);
|
||||||
|
g_date_time_unref (date);
|
||||||
|
g_strfreev (fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_date_time_unref (timestamp);
|
||||||
|
g_strfreev (lines);
|
||||||
|
g_bytes_unref (data);
|
||||||
|
g_time_zone_unref (utc);
|
||||||
|
|
||||||
|
return G_LIST_MODEL (store);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
setup_widget (GtkListItem *list_item,
|
||||||
|
gpointer unused)
|
||||||
|
{
|
||||||
|
GtkWidget *box, *child;
|
||||||
|
|
||||||
|
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
|
gtk_list_item_set_child (list_item, box);
|
||||||
|
|
||||||
|
child = gtk_label_new (NULL);
|
||||||
|
gtk_label_set_width_chars (GTK_LABEL (child), 5);
|
||||||
|
gtk_box_append (GTK_BOX (box), child);
|
||||||
|
|
||||||
|
child = gtk_image_new ();
|
||||||
|
gtk_image_set_icon_size (GTK_IMAGE (child), GTK_ICON_SIZE_LARGE);
|
||||||
|
gtk_box_append (GTK_BOX (box), child);
|
||||||
|
|
||||||
|
child = gtk_label_new (NULL);
|
||||||
|
gtk_widget_set_vexpand (child, TRUE);
|
||||||
|
gtk_widget_set_valign (child, GTK_ALIGN_END);
|
||||||
|
gtk_label_set_width_chars (GTK_LABEL (child), 4);
|
||||||
|
gtk_box_append (GTK_BOX (box), child);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
bind_widget (GtkListItem *list_item,
|
||||||
|
gpointer unused)
|
||||||
|
{
|
||||||
|
GtkWidget *box, *child;
|
||||||
|
GtkWeatherInfo *info;
|
||||||
|
GDateTime *timestamp;
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
box = gtk_list_item_get_child (list_item);
|
||||||
|
info = gtk_list_item_get_item (list_item);
|
||||||
|
|
||||||
|
child = gtk_widget_get_first_child (box);
|
||||||
|
timestamp = g_date_time_new_from_unix_utc (info->timestamp);
|
||||||
|
s = g_date_time_format (timestamp, "%R");
|
||||||
|
gtk_label_set_text (GTK_LABEL (child), s);
|
||||||
|
g_free (s);
|
||||||
|
g_date_time_unref (timestamp);
|
||||||
|
|
||||||
|
child = gtk_widget_get_next_sibling (child);
|
||||||
|
switch (info->weather_type)
|
||||||
|
{
|
||||||
|
case GTK_WEATHER_CLEAR:
|
||||||
|
gtk_image_set_from_icon_name (GTK_IMAGE (child), "weather-clear-symbolic");
|
||||||
|
break;
|
||||||
|
case GTK_WEATHER_FEW_CLOUDS:
|
||||||
|
gtk_image_set_from_icon_name (GTK_IMAGE (child), "weather-few-clouds-symbolic");
|
||||||
|
break;
|
||||||
|
case GTK_WEATHER_FOG:
|
||||||
|
gtk_image_set_from_icon_name (GTK_IMAGE (child), "weather-fog-symbolic");
|
||||||
|
break;
|
||||||
|
case GTK_WEATHER_OVERCAST:
|
||||||
|
gtk_image_set_from_icon_name (GTK_IMAGE (child), "weather-overcast-symbolic");
|
||||||
|
break;
|
||||||
|
case GTK_WEATHER_SCATTERED_SHOWERS:
|
||||||
|
gtk_image_set_from_icon_name (GTK_IMAGE (child), "weather-showers-scattered-symbolic");
|
||||||
|
break;
|
||||||
|
case GTK_WEATHER_SHOWERS:
|
||||||
|
gtk_image_set_from_icon_name (GTK_IMAGE (child), "weather-showers-symbolic");
|
||||||
|
break;
|
||||||
|
case GTK_WEATHER_SNOW:
|
||||||
|
gtk_image_set_from_icon_name (GTK_IMAGE (child), "weather-snow-symbolic");
|
||||||
|
break;
|
||||||
|
case GTK_WEATHER_STORM:
|
||||||
|
gtk_image_set_from_icon_name (GTK_IMAGE (child), "weather-storm-symbolic");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
gtk_image_clear (GTK_IMAGE (child));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
child = gtk_widget_get_next_sibling (child);
|
||||||
|
s = g_strdup_printf ("%d°", info->temperature);
|
||||||
|
gtk_label_set_text (GTK_LABEL (child), s);
|
||||||
|
g_free (s);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkWidget *window = NULL;
|
||||||
|
|
||||||
|
GtkWidget *
|
||||||
|
create_weather_view (void)
|
||||||
|
{
|
||||||
|
GtkWidget *listview;
|
||||||
|
GListModel *model, *selection;
|
||||||
|
|
||||||
|
listview = gtk_list_view_new_with_factory (
|
||||||
|
gtk_functions_list_item_factory_new (setup_widget,
|
||||||
|
bind_widget,
|
||||||
|
NULL, NULL));
|
||||||
|
gtk_orientable_set_orientation (GTK_ORIENTABLE (listview), GTK_ORIENTATION_HORIZONTAL);
|
||||||
|
gtk_list_view_set_show_separators (GTK_LIST_VIEW (listview), TRUE);
|
||||||
|
model = create_weather_model ();
|
||||||
|
selection = G_LIST_MODEL (gtk_no_selection_new (model));
|
||||||
|
gtk_list_view_set_model (GTK_LIST_VIEW (listview), selection);
|
||||||
|
g_object_unref (selection);
|
||||||
|
g_object_unref (model);
|
||||||
|
|
||||||
|
return listview;
|
||||||
|
}
|
||||||
|
|
||||||
|
GtkWidget *
|
||||||
|
do_listview_weather (GtkWidget *do_widget)
|
||||||
|
{
|
||||||
|
if (window == NULL)
|
||||||
|
{
|
||||||
|
GtkWidget *listview, *sw;
|
||||||
|
|
||||||
|
window = gtk_window_new ();
|
||||||
|
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
|
||||||
|
gtk_window_set_title (GTK_WINDOW (window), "Weather");
|
||||||
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
|
gtk_widget_get_display (do_widget));
|
||||||
|
gtk_window_set_title (GTK_WINDOW (window), "Weather");
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *) &window);
|
||||||
|
|
||||||
|
sw = gtk_scrolled_window_new ();
|
||||||
|
gtk_window_set_child (GTK_WINDOW (window), sw);
|
||||||
|
listview = create_weather_view ();
|
||||||
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), listview);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gtk_widget_get_visible (window))
|
||||||
|
gtk_widget_show (window);
|
||||||
|
else
|
||||||
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
70116
demos/gtk-demo/listview_weather.txt
Normal file
70116
demos/gtk-demo/listview_weather.txt
Normal file
File diff suppressed because it is too large
Load Diff
241
demos/gtk-demo/listview_words.c
Normal file
241
demos/gtk-demo/listview_words.c
Normal file
@@ -0,0 +1,241 @@
|
|||||||
|
/* Lists/Words
|
||||||
|
*
|
||||||
|
* This demo shows filtering a long list - of words.
|
||||||
|
*
|
||||||
|
* You should have the file `/usr/share/dict/words` installed for
|
||||||
|
* this demo to work.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
static GtkWidget *window = NULL;
|
||||||
|
static GtkWidget *progress;
|
||||||
|
|
||||||
|
const char *factory_text =
|
||||||
|
"<?xml version='1.0' encoding='UTF-8'?>\n"
|
||||||
|
"<interface>\n"
|
||||||
|
" <template class='GtkListItem'>\n"
|
||||||
|
" <property name='child'>\n"
|
||||||
|
" <object class='GtkLabel'>\n"
|
||||||
|
" <property name='ellipsize'>end</property>\n"
|
||||||
|
" <property name='xalign'>0</property>\n"
|
||||||
|
" <binding name='label'>\n"
|
||||||
|
" <lookup name='string' type='GtkStringObject'>\n"
|
||||||
|
" <lookup name='item'>GtkListItem</lookup>\n"
|
||||||
|
" </lookup>\n"
|
||||||
|
" </binding>\n"
|
||||||
|
" </object>\n"
|
||||||
|
" </property>\n"
|
||||||
|
" </template>\n"
|
||||||
|
"</interface>\n";
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_title_cb (GtkFilterListModel *model)
|
||||||
|
{
|
||||||
|
guint total;
|
||||||
|
char *title;
|
||||||
|
guint pending;
|
||||||
|
|
||||||
|
total = g_list_model_get_n_items (gtk_filter_list_model_get_model (model));
|
||||||
|
pending = gtk_filter_list_model_get_pending (model);
|
||||||
|
|
||||||
|
title = g_strdup_printf ("%u lines", g_list_model_get_n_items (G_LIST_MODEL (model)));
|
||||||
|
|
||||||
|
gtk_widget_set_visible (progress, pending != 0);
|
||||||
|
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), (total - pending) / (double) total);
|
||||||
|
gtk_window_set_title (GTK_WINDOW (window), title);
|
||||||
|
g_free (title);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
read_lines_cb (GObject *object,
|
||||||
|
GAsyncResult *result,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
GBufferedInputStream *stream = G_BUFFERED_INPUT_STREAM (object);
|
||||||
|
GtkStringList *stringlist = data;
|
||||||
|
GError *error = NULL;
|
||||||
|
gsize size;
|
||||||
|
GPtrArray *lines;
|
||||||
|
gssize n_filled;
|
||||||
|
const char *buffer, *newline;
|
||||||
|
|
||||||
|
n_filled = g_buffered_input_stream_fill_finish (stream, result, &error);
|
||||||
|
if (n_filled < 0)
|
||||||
|
{
|
||||||
|
g_print ("Could not read data: %s\n", error->message);
|
||||||
|
g_clear_error (&error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer = g_buffered_input_stream_peek_buffer (stream, &size);
|
||||||
|
|
||||||
|
if (n_filled == 0)
|
||||||
|
{
|
||||||
|
if (size)
|
||||||
|
gtk_string_list_take (stringlist, g_utf8_make_valid (buffer, size));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lines = NULL;
|
||||||
|
while ((newline = memchr (buffer, '\n', size)))
|
||||||
|
{
|
||||||
|
if (newline > buffer)
|
||||||
|
{
|
||||||
|
if (lines == NULL)
|
||||||
|
lines = g_ptr_array_new_with_free_func (g_free);
|
||||||
|
g_ptr_array_add (lines, g_utf8_make_valid (buffer, newline - buffer));
|
||||||
|
}
|
||||||
|
if (g_input_stream_skip (G_INPUT_STREAM (stream), newline - buffer + 1, NULL, &error) < 0)
|
||||||
|
{
|
||||||
|
g_clear_error (&error);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
buffer = g_buffered_input_stream_peek_buffer (stream, &size);
|
||||||
|
}
|
||||||
|
if (lines == NULL)
|
||||||
|
{
|
||||||
|
g_buffered_input_stream_set_buffer_size (stream, g_buffered_input_stream_get_buffer_size (stream) + 4096);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_ptr_array_add (lines, NULL);
|
||||||
|
gtk_string_list_splice (stringlist, g_list_model_get_n_items (G_LIST_MODEL (stringlist)), 0, (const char **) lines->pdata);
|
||||||
|
g_ptr_array_free (lines, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_buffered_input_stream_fill_async (stream, -1, G_PRIORITY_HIGH_IDLE, NULL, read_lines_cb, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
file_is_open_cb (GObject *file,
|
||||||
|
GAsyncResult *result,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
GError *error = NULL;
|
||||||
|
GFileInputStream *file_stream;
|
||||||
|
GBufferedInputStream *stream;
|
||||||
|
|
||||||
|
file_stream = g_file_read_finish (G_FILE (file), result, &error);
|
||||||
|
if (file_stream == NULL)
|
||||||
|
{
|
||||||
|
g_print ("Could not open file: %s\n", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
stream = G_BUFFERED_INPUT_STREAM (g_buffered_input_stream_new (G_INPUT_STREAM (file_stream)));
|
||||||
|
g_buffered_input_stream_fill_async (stream, -1, G_PRIORITY_HIGH_IDLE, NULL, read_lines_cb, data);
|
||||||
|
g_object_unref (stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
load_file (GtkStringList *list,
|
||||||
|
GFile *file)
|
||||||
|
{
|
||||||
|
gtk_string_list_splice (list, 0, g_list_model_get_n_items (G_LIST_MODEL (list)), NULL);
|
||||||
|
g_file_read_async (file, G_PRIORITY_HIGH_IDLE, NULL, file_is_open_cb, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
file_selected_cb (GtkWidget *button,
|
||||||
|
GtkStringList *stringlist)
|
||||||
|
{
|
||||||
|
GFile *file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (button));
|
||||||
|
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
load_file (stringlist, file);
|
||||||
|
g_object_unref (file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GtkWidget *
|
||||||
|
do_listview_words (GtkWidget *do_widget)
|
||||||
|
{
|
||||||
|
if (window == NULL)
|
||||||
|
{
|
||||||
|
GtkWidget *header, *listview, *sw, *vbox, *search_entry, *open_button, *overlay;
|
||||||
|
GtkFilterListModel *filter_model;
|
||||||
|
GtkNoSelection *selection;
|
||||||
|
GtkStringList *stringlist;
|
||||||
|
GtkFilter *filter;
|
||||||
|
GtkExpression *expression;
|
||||||
|
GFile *file;
|
||||||
|
|
||||||
|
file = g_file_new_for_path ("/usr/share/dict/words");
|
||||||
|
if (g_file_query_exists (file, NULL))
|
||||||
|
{
|
||||||
|
stringlist = gtk_string_list_new (NULL);
|
||||||
|
load_file (stringlist, file);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char **words;
|
||||||
|
words = g_strsplit ("lorem ipsum dolor sit amet consectetur adipisci elit sed eiusmod tempor incidunt labore et dolore magna aliqua ut enim ad minim veniam quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat", " ", -1);
|
||||||
|
stringlist = gtk_string_list_new ((const char **) words);
|
||||||
|
g_strfreev (words);
|
||||||
|
}
|
||||||
|
|
||||||
|
filter = gtk_string_filter_new ();
|
||||||
|
expression = gtk_property_expression_new (GTK_TYPE_STRING_OBJECT, NULL, "string");
|
||||||
|
gtk_string_filter_set_expression (GTK_STRING_FILTER (filter), expression);
|
||||||
|
gtk_expression_unref (expression);
|
||||||
|
filter_model = gtk_filter_list_model_new (G_LIST_MODEL (stringlist), filter);
|
||||||
|
gtk_filter_list_model_set_incremental (filter_model, TRUE);
|
||||||
|
|
||||||
|
window = gtk_window_new ();
|
||||||
|
gtk_window_set_default_size (GTK_WINDOW (window), 400, 600);
|
||||||
|
|
||||||
|
header = gtk_header_bar_new ();
|
||||||
|
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), TRUE);
|
||||||
|
open_button = gtk_file_chooser_button_new ("_Open", GTK_FILE_CHOOSER_ACTION_OPEN);
|
||||||
|
g_signal_connect (open_button, "file-set", G_CALLBACK (file_selected_cb), stringlist);
|
||||||
|
gtk_header_bar_pack_start (GTK_HEADER_BAR (header), open_button);
|
||||||
|
gtk_window_set_titlebar (GTK_WINDOW (window), header);
|
||||||
|
|
||||||
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
|
gtk_widget_get_display (do_widget));
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer*)&window);
|
||||||
|
|
||||||
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||||
|
gtk_window_set_child (GTK_WINDOW (window), vbox);
|
||||||
|
|
||||||
|
search_entry = gtk_search_entry_new ();
|
||||||
|
g_object_bind_property (search_entry, "text", filter, "search", 0);
|
||||||
|
gtk_box_append (GTK_BOX (vbox), search_entry);
|
||||||
|
|
||||||
|
overlay = gtk_overlay_new ();
|
||||||
|
gtk_box_append (GTK_BOX (vbox), overlay);
|
||||||
|
|
||||||
|
progress = gtk_progress_bar_new ();
|
||||||
|
gtk_widget_set_halign (progress, GTK_ALIGN_FILL);
|
||||||
|
gtk_widget_set_valign (progress, GTK_ALIGN_START);
|
||||||
|
gtk_widget_set_hexpand (progress, TRUE);
|
||||||
|
gtk_overlay_add_overlay (GTK_OVERLAY (overlay), progress);
|
||||||
|
|
||||||
|
sw = gtk_scrolled_window_new ();
|
||||||
|
gtk_overlay_set_child (GTK_OVERLAY (overlay), sw);
|
||||||
|
|
||||||
|
listview = gtk_list_view_new_with_factory (
|
||||||
|
gtk_builder_list_item_factory_new_from_bytes (NULL,
|
||||||
|
g_bytes_new_static (factory_text, strlen (factory_text))));
|
||||||
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), listview);
|
||||||
|
selection = gtk_no_selection_new (G_LIST_MODEL (filter_model));
|
||||||
|
gtk_list_view_set_model (GTK_LIST_VIEW (listview), G_LIST_MODEL (selection));
|
||||||
|
g_object_unref (selection);
|
||||||
|
|
||||||
|
g_signal_connect (filter_model, "items-changed", G_CALLBACK (update_title_cb), progress);
|
||||||
|
g_signal_connect (filter_model, "notify::pending", G_CALLBACK (update_title_cb), progress);
|
||||||
|
update_title_cb (filter_model);
|
||||||
|
|
||||||
|
g_object_unref (filter_model);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gtk_widget_get_visible (window))
|
||||||
|
gtk_widget_show (window);
|
||||||
|
else
|
||||||
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
22
demos/gtk-demo/main-listitem.ui
Normal file
22
demos/gtk-demo/main-listitem.ui
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<template class="GtkListItem">
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkTreeExpander" id="expander">
|
||||||
|
<binding name="list-row">
|
||||||
|
<lookup name="item">GtkListItem</lookup>
|
||||||
|
</binding>
|
||||||
|
<property name="child">
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<binding name="label">
|
||||||
|
<lookup name="title" type="GtkDemo">
|
||||||
|
<lookup name="item">expander</lookup>
|
||||||
|
</lookup>
|
||||||
|
</binding>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
@@ -16,18 +16,96 @@ static GtkWidget *source_view;
|
|||||||
static gchar *current_file = NULL;
|
static gchar *current_file = NULL;
|
||||||
|
|
||||||
static GtkWidget *notebook;
|
static GtkWidget *notebook;
|
||||||
static GtkWidget *treeview;
|
static GtkSingleSelection *selection;
|
||||||
static GtkWidget *toplevel;
|
static GtkWidget *toplevel;
|
||||||
|
|
||||||
enum {
|
typedef struct _GtkDemo GtkDemo;
|
||||||
NAME_COLUMN,
|
struct _GtkDemo
|
||||||
TITLE_COLUMN,
|
{
|
||||||
FILENAME_COLUMN,
|
GObject parent_instance;
|
||||||
FUNC_COLUMN,
|
|
||||||
STYLE_COLUMN,
|
const char *name;
|
||||||
NUM_COLUMNS
|
const char *title;
|
||||||
|
const char *filename;
|
||||||
|
GDoDemoFunc func;
|
||||||
|
GListModel *children_model;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PROP_0,
|
||||||
|
PROP_FILENAME,
|
||||||
|
PROP_NAME,
|
||||||
|
PROP_TITLE,
|
||||||
|
|
||||||
|
N_PROPS
|
||||||
|
};
|
||||||
|
|
||||||
|
# define GTK_TYPE_DEMO (gtk_demo_get_type ())
|
||||||
|
G_DECLARE_FINAL_TYPE (GtkDemo, gtk_demo, GTK, DEMO, GObject);
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (GtkDemo, gtk_demo, G_TYPE_OBJECT);
|
||||||
|
static GParamSpec *properties[N_PROPS] = { NULL, };
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_demo_get_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
GtkDemo *self = GTK_DEMO (object);
|
||||||
|
|
||||||
|
switch (property_id)
|
||||||
|
{
|
||||||
|
case PROP_FILENAME:
|
||||||
|
g_value_set_string (value, self->filename);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_NAME:
|
||||||
|
g_value_set_string (value, self->name);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_TITLE:
|
||||||
|
g_value_set_string (value, self->title);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gtk_demo_class_init (GtkDemoClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
gobject_class->get_property = gtk_demo_get_property;
|
||||||
|
|
||||||
|
properties[PROP_FILENAME] =
|
||||||
|
g_param_spec_string ("filename",
|
||||||
|
"filename",
|
||||||
|
"filename",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
properties[PROP_NAME] =
|
||||||
|
g_param_spec_string ("name",
|
||||||
|
"name",
|
||||||
|
"name",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
properties[PROP_TITLE] =
|
||||||
|
g_param_spec_string ("title",
|
||||||
|
"title",
|
||||||
|
"title",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
|
||||||
|
g_object_class_install_properties (gobject_class, N_PROPS, properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gtk_demo_init (GtkDemo *self)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct _CallbackData CallbackData;
|
typedef struct _CallbackData CallbackData;
|
||||||
struct _CallbackData
|
struct _CallbackData
|
||||||
{
|
{
|
||||||
@@ -35,6 +113,27 @@ struct _CallbackData
|
|||||||
GtkTreePath *path;
|
GtkTreePath *path;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gtk_demo_run (GtkDemo *self,
|
||||||
|
GtkWidget *window)
|
||||||
|
{
|
||||||
|
GtkWidget *result;
|
||||||
|
|
||||||
|
if (!self->func)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
result = self->func (window);
|
||||||
|
if (result == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (GTK_IS_WINDOW (result))
|
||||||
|
{
|
||||||
|
gtk_window_set_transient_for (GTK_WINDOW (result), GTK_WINDOW (window));
|
||||||
|
gtk_window_set_modal (GTK_WINDOW (result), TRUE);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
activate_about (GSimpleAction *action,
|
activate_about (GSimpleAction *action,
|
||||||
GVariant *parameter,
|
GVariant *parameter,
|
||||||
@@ -61,7 +160,7 @@ activate_about (GSimpleAction *action,
|
|||||||
gtk_get_major_version (),
|
gtk_get_major_version (),
|
||||||
gtk_get_minor_version (),
|
gtk_get_minor_version (),
|
||||||
gtk_get_micro_version ());
|
gtk_get_micro_version ());
|
||||||
g_string_append_printf (s, "\nA link can apppear here: <http://www.gtk.org>");
|
g_string_append_printf (s, "\nA link can appear here: <http://www.gtk.org>");
|
||||||
|
|
||||||
version = g_strdup_printf ("%s\nRunning against GTK %d.%d.%d",
|
version = g_strdup_printf ("%s\nRunning against GTK %d.%d.%d",
|
||||||
PACKAGE_VERSION,
|
PACKAGE_VERSION,
|
||||||
@@ -101,7 +200,7 @@ activate_quit (GSimpleAction *action,
|
|||||||
win = list->data;
|
win = list->data;
|
||||||
next = list->next;
|
next = list->next;
|
||||||
|
|
||||||
gtk_widget_destroy (GTK_WIDGET (win));
|
gtk_window_destroy (GTK_WINDOW (win));
|
||||||
|
|
||||||
list = next;
|
list = next;
|
||||||
}
|
}
|
||||||
@@ -115,82 +214,15 @@ activate_inspector (GSimpleAction *action,
|
|||||||
gtk_window_set_interactive_debugging (TRUE);
|
gtk_window_set_interactive_debugging (TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
window_closed_cb (GtkWidget *window, gpointer data)
|
|
||||||
{
|
|
||||||
CallbackData *cbdata = data;
|
|
||||||
GtkTreeIter iter;
|
|
||||||
PangoStyle style;
|
|
||||||
|
|
||||||
gtk_tree_model_get_iter (cbdata->model, &iter, cbdata->path);
|
|
||||||
gtk_tree_model_get (GTK_TREE_MODEL (cbdata->model), &iter,
|
|
||||||
STYLE_COLUMN, &style,
|
|
||||||
-1);
|
|
||||||
if (style == PANGO_STYLE_ITALIC)
|
|
||||||
gtk_tree_store_set (GTK_TREE_STORE (cbdata->model), &iter,
|
|
||||||
STYLE_COLUMN, PANGO_STYLE_NORMAL,
|
|
||||||
-1);
|
|
||||||
|
|
||||||
gtk_tree_path_free (cbdata->path);
|
|
||||||
g_free (cbdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
run_example_for_row (GtkWidget *window,
|
|
||||||
GtkTreeModel *model,
|
|
||||||
GtkTreeIter *iter)
|
|
||||||
{
|
|
||||||
PangoStyle style;
|
|
||||||
GDoDemoFunc func;
|
|
||||||
GtkWidget *demo;
|
|
||||||
|
|
||||||
gtk_tree_model_get (GTK_TREE_MODEL (model),
|
|
||||||
iter,
|
|
||||||
FUNC_COLUMN, &func,
|
|
||||||
STYLE_COLUMN, &style,
|
|
||||||
-1);
|
|
||||||
|
|
||||||
if (func)
|
|
||||||
{
|
|
||||||
gtk_tree_store_set (GTK_TREE_STORE (model),
|
|
||||||
iter,
|
|
||||||
STYLE_COLUMN, (style == PANGO_STYLE_ITALIC ? PANGO_STYLE_NORMAL : PANGO_STYLE_ITALIC),
|
|
||||||
-1);
|
|
||||||
demo = (func) (window);
|
|
||||||
|
|
||||||
if (demo != NULL)
|
|
||||||
{
|
|
||||||
CallbackData *cbdata;
|
|
||||||
|
|
||||||
cbdata = g_new (CallbackData, 1);
|
|
||||||
cbdata->model = model;
|
|
||||||
cbdata->path = gtk_tree_model_get_path (model, iter);
|
|
||||||
|
|
||||||
if (GTK_IS_WINDOW (demo))
|
|
||||||
{
|
|
||||||
gtk_window_set_transient_for (GTK_WINDOW (demo), GTK_WINDOW (window));
|
|
||||||
gtk_window_set_modal (GTK_WINDOW (demo), TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_signal_connect (demo, "destroy",
|
|
||||||
G_CALLBACK (window_closed_cb), cbdata);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
activate_run (GSimpleAction *action,
|
activate_run (GSimpleAction *action,
|
||||||
GVariant *parameter,
|
GVariant *parameter,
|
||||||
gpointer user_data)
|
gpointer window)
|
||||||
{
|
{
|
||||||
GtkWidget *window = user_data;
|
GtkTreeListRow *row = gtk_single_selection_get_selected_item (selection);
|
||||||
GtkTreeSelection *selection;
|
GtkDemo *demo = gtk_tree_list_row_get_item (row);
|
||||||
GtkTreeModel *model;
|
|
||||||
GtkTreeIter iter;
|
|
||||||
|
|
||||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
|
gtk_demo_run (demo, window);
|
||||||
if (gtk_tree_selection_get_selected (selection, &model, &iter))
|
|
||||||
run_example_for_row (window, model, &iter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stupid syntax highlighting.
|
/* Stupid syntax highlighting.
|
||||||
@@ -567,10 +599,10 @@ display_image (const char *resource)
|
|||||||
{
|
{
|
||||||
GtkWidget *sw, *image;
|
GtkWidget *sw, *image;
|
||||||
|
|
||||||
image = gtk_image_new_from_resource (resource);
|
image = gtk_picture_new_for_resource (resource);
|
||||||
gtk_widget_set_halign (image, GTK_ALIGN_CENTER);
|
gtk_widget_set_halign (image, GTK_ALIGN_CENTER);
|
||||||
gtk_widget_set_valign (image, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign (image, GTK_ALIGN_CENTER);
|
||||||
sw = gtk_scrolled_window_new (NULL, NULL);
|
sw = gtk_scrolled_window_new ();
|
||||||
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), image);
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), image);
|
||||||
|
|
||||||
return sw;
|
return sw;
|
||||||
@@ -610,7 +642,7 @@ display_text (const char *resource)
|
|||||||
|
|
||||||
g_bytes_unref (bytes);
|
g_bytes_unref (bytes);
|
||||||
|
|
||||||
sw = gtk_scrolled_window_new (NULL, NULL);
|
sw = gtk_scrolled_window_new ();
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
||||||
GTK_POLICY_AUTOMATIC,
|
GTK_POLICY_AUTOMATIC,
|
||||||
GTK_POLICY_AUTOMATIC);
|
GTK_POLICY_AUTOMATIC);
|
||||||
@@ -895,124 +927,93 @@ load_file (const gchar *demoname,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
selection_cb (GtkTreeSelection *selection,
|
activate_cb (GtkWidget *widget,
|
||||||
GtkTreeModel *model)
|
guint position,
|
||||||
|
gpointer window)
|
||||||
{
|
{
|
||||||
GtkTreeIter iter;
|
GtkTreeListRow *row = g_list_model_get_item (gtk_list_view_get_model (GTK_LIST_VIEW (widget)), position);
|
||||||
char *name;
|
GtkDemo *demo = gtk_tree_list_row_get_item (row);
|
||||||
char *filename;
|
|
||||||
char *title;
|
|
||||||
|
|
||||||
if (! gtk_tree_selection_get_selected (selection, NULL, &iter))
|
gtk_demo_run (demo, window);
|
||||||
return;
|
|
||||||
|
|
||||||
gtk_tree_model_get (model, &iter,
|
g_object_unref (row);
|
||||||
NAME_COLUMN, &name,
|
|
||||||
TITLE_COLUMN, &title,
|
|
||||||
FILENAME_COLUMN, &filename,
|
|
||||||
-1);
|
|
||||||
|
|
||||||
if (filename)
|
|
||||||
load_file (name, filename);
|
|
||||||
|
|
||||||
gtk_window_set_title (GTK_WINDOW (toplevel), title);
|
|
||||||
|
|
||||||
g_free (name);
|
|
||||||
g_free (title);
|
|
||||||
g_free (filename);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
populate_model (GtkTreeModel *model)
|
selection_cb (GtkSingleSelection *sel,
|
||||||
|
GParamSpec *pspec,
|
||||||
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
Demo *d = gtk_demos;
|
GtkTreeListRow *row = gtk_single_selection_get_selected_item (sel);
|
||||||
|
GtkDemo *demo = gtk_tree_list_row_get_item (row);
|
||||||
|
|
||||||
/* this code only supports 1 level of children. If we
|
if (demo->filename)
|
||||||
* want more we probably have to use a recursing function.
|
load_file (demo->name, demo->filename);
|
||||||
*/
|
|
||||||
while (d->title)
|
gtk_window_set_title (GTK_WINDOW (toplevel), demo->title);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GListModel *
|
||||||
|
create_demo_model (void)
|
||||||
|
{
|
||||||
|
GListStore *store = g_list_store_new (GTK_TYPE_DEMO);
|
||||||
|
DemoData *demo = gtk_demos;
|
||||||
|
|
||||||
|
while (demo->title)
|
||||||
{
|
{
|
||||||
Demo *children = d->children;
|
GtkDemo *d = GTK_DEMO (g_object_new (GTK_TYPE_DEMO, NULL));
|
||||||
GtkTreeIter iter;
|
DemoData *children = demo->children;
|
||||||
|
|
||||||
gtk_tree_store_append (GTK_TREE_STORE (model), &iter, NULL);
|
d->name = demo->name;
|
||||||
|
d->title = demo->title;
|
||||||
|
d->filename = demo->filename;
|
||||||
|
d->func = demo->func;
|
||||||
|
|
||||||
gtk_tree_store_set (GTK_TREE_STORE (model),
|
g_list_store_append (store, d);
|
||||||
&iter,
|
|
||||||
NAME_COLUMN, d->name,
|
|
||||||
TITLE_COLUMN, d->title,
|
|
||||||
FILENAME_COLUMN, d->filename,
|
|
||||||
FUNC_COLUMN, d->func,
|
|
||||||
STYLE_COLUMN, PANGO_STYLE_NORMAL,
|
|
||||||
-1);
|
|
||||||
|
|
||||||
d++;
|
if (children)
|
||||||
|
{
|
||||||
if (!children)
|
d->children_model = G_LIST_MODEL (g_list_store_new (GTK_TYPE_DEMO));
|
||||||
continue;
|
|
||||||
|
|
||||||
while (children->title)
|
while (children->title)
|
||||||
{
|
{
|
||||||
GtkTreeIter child_iter;
|
GtkDemo *child = GTK_DEMO (g_object_new (GTK_TYPE_DEMO, NULL));
|
||||||
|
|
||||||
gtk_tree_store_append (GTK_TREE_STORE (model), &child_iter, &iter);
|
child->name = children->name;
|
||||||
|
child->title = children->title;
|
||||||
gtk_tree_store_set (GTK_TREE_STORE (model),
|
child->filename = children->filename;
|
||||||
&child_iter,
|
child->func = children->func;
|
||||||
NAME_COLUMN, children->name,
|
|
||||||
TITLE_COLUMN, children->title,
|
|
||||||
FILENAME_COLUMN, children->filename,
|
|
||||||
FUNC_COLUMN, children->func,
|
|
||||||
STYLE_COLUMN, PANGO_STYLE_NORMAL,
|
|
||||||
-1);
|
|
||||||
|
|
||||||
|
g_list_store_append (G_LIST_STORE (d->children_model), child);
|
||||||
children++;
|
children++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
demo++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return G_LIST_MODEL (store);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static GListModel *
|
||||||
startup (GApplication *app)
|
get_child_model (gpointer item,
|
||||||
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GtkBuilder *builder;
|
GtkDemo *demo = item;
|
||||||
GMenuModel *appmenu;
|
|
||||||
const char *ids[] = { "appmenu", NULL };
|
|
||||||
|
|
||||||
builder = gtk_builder_new ();
|
if (demo->children_model)
|
||||||
gtk_builder_add_objects_from_resource (builder, "/ui/appmenu.ui", ids, NULL);
|
return g_object_ref (G_LIST_MODEL (demo->children_model));
|
||||||
|
|
||||||
appmenu = (GMenuModel *)gtk_builder_get_object (builder, "appmenu");
|
return NULL;
|
||||||
|
|
||||||
gtk_application_set_app_menu (GTK_APPLICATION (app), appmenu);
|
|
||||||
|
|
||||||
g_object_unref (builder);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
row_activated_cb (GtkWidget *tree_view,
|
|
||||||
GtkTreePath *path,
|
|
||||||
GtkTreeViewColumn *column)
|
|
||||||
{
|
|
||||||
GtkTreeIter iter;
|
|
||||||
GtkWidget *window;
|
|
||||||
GtkTreeModel *model;
|
|
||||||
|
|
||||||
window = GTK_WIDGET (gtk_widget_get_root (tree_view));
|
|
||||||
model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
|
|
||||||
gtk_tree_model_get_iter (model, &iter, path);
|
|
||||||
|
|
||||||
run_example_for_row (window, model, &iter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
activate (GApplication *app)
|
activate (GApplication *app)
|
||||||
{
|
{
|
||||||
GtkBuilder *builder;
|
GtkBuilder *builder;
|
||||||
GtkWindow *window;
|
GListModel *listmodel;
|
||||||
GtkWidget *widget;
|
GtkTreeListModel *treemodel;
|
||||||
GtkTreeModel *model;
|
GtkWidget *window, *listview;
|
||||||
GtkTreeIter iter;
|
|
||||||
|
|
||||||
static GActionEntry win_entries[] = {
|
static GActionEntry win_entries[] = {
|
||||||
{ "run", activate_run, NULL, NULL, NULL }
|
{ "run", activate_run, NULL, NULL, NULL }
|
||||||
@@ -1020,35 +1021,32 @@ activate (GApplication *app)
|
|||||||
|
|
||||||
builder = gtk_builder_new_from_resource ("/ui/main.ui");
|
builder = gtk_builder_new_from_resource ("/ui/main.ui");
|
||||||
|
|
||||||
window = (GtkWindow *)gtk_builder_get_object (builder, "window");
|
window = (GtkWidget *)gtk_builder_get_object (builder, "window");
|
||||||
gtk_application_add_window (GTK_APPLICATION (app), window);
|
gtk_application_add_window (GTK_APPLICATION (app), GTK_WINDOW (window));
|
||||||
g_action_map_add_action_entries (G_ACTION_MAP (window),
|
g_action_map_add_action_entries (G_ACTION_MAP (window),
|
||||||
win_entries, G_N_ELEMENTS (win_entries),
|
win_entries, G_N_ELEMENTS (win_entries),
|
||||||
window);
|
window);
|
||||||
|
|
||||||
notebook = (GtkWidget *)gtk_builder_get_object (builder, "notebook");
|
notebook = GTK_WIDGET (gtk_builder_get_object (builder, "notebook"));
|
||||||
|
|
||||||
info_view = (GtkWidget *)gtk_builder_get_object (builder, "info-textview");
|
info_view = GTK_WIDGET (gtk_builder_get_object (builder, "info-textview"));
|
||||||
source_view = (GtkWidget *)gtk_builder_get_object (builder, "source-textview");
|
source_view = GTK_WIDGET (gtk_builder_get_object (builder, "source-textview"));
|
||||||
treeview = (GtkWidget *)gtk_builder_get_object (builder, "treeview");
|
|
||||||
model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
|
|
||||||
toplevel = GTK_WIDGET (window);
|
toplevel = GTK_WIDGET (window);
|
||||||
|
listview = GTK_WIDGET (gtk_builder_get_object (builder, "listview"));
|
||||||
|
g_signal_connect (listview, "activate", G_CALLBACK (activate_cb), window);
|
||||||
|
|
||||||
load_file (gtk_demos[0].name, gtk_demos[0].filename);
|
listmodel = create_demo_model ();
|
||||||
|
treemodel = gtk_tree_list_model_new (FALSE,
|
||||||
|
G_LIST_MODEL (listmodel),
|
||||||
|
TRUE,
|
||||||
|
get_child_model,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
selection = gtk_single_selection_new (G_LIST_MODEL (treemodel));
|
||||||
|
g_signal_connect (selection, "notify::selected-item", G_CALLBACK (selection_cb), NULL);
|
||||||
|
gtk_list_view_set_model (GTK_LIST_VIEW (listview), G_LIST_MODEL (selection));
|
||||||
|
|
||||||
populate_model (model);
|
selection_cb (selection, NULL, NULL);
|
||||||
|
|
||||||
g_signal_connect (treeview, "row-activated", G_CALLBACK (row_activated_cb), model);
|
|
||||||
|
|
||||||
widget = (GtkWidget *)gtk_builder_get_object (builder, "treeview-selection");
|
|
||||||
g_signal_connect (widget, "changed", G_CALLBACK (selection_cb), model);
|
|
||||||
|
|
||||||
gtk_tree_model_get_iter_first (gtk_tree_view_get_model (GTK_TREE_VIEW (treeview)), &iter);
|
|
||||||
gtk_tree_selection_select_iter (GTK_TREE_SELECTION (widget), &iter);
|
|
||||||
|
|
||||||
gtk_tree_view_collapse_all (GTK_TREE_VIEW (treeview));
|
|
||||||
|
|
||||||
gtk_widget_show (GTK_WIDGET (window));
|
|
||||||
|
|
||||||
g_object_unref (builder);
|
g_object_unref (builder);
|
||||||
}
|
}
|
||||||
@@ -1063,7 +1061,7 @@ auto_quit (gpointer data)
|
|||||||
static void
|
static void
|
||||||
list_demos (void)
|
list_demos (void)
|
||||||
{
|
{
|
||||||
Demo *d, *c;
|
DemoData *d, *c;
|
||||||
|
|
||||||
d = gtk_demos;
|
d = gtk_demos;
|
||||||
|
|
||||||
@@ -1090,7 +1088,7 @@ command_line (GApplication *app,
|
|||||||
const gchar *name = NULL;
|
const gchar *name = NULL;
|
||||||
gboolean autoquit = FALSE;
|
gboolean autoquit = FALSE;
|
||||||
gboolean list = FALSE;
|
gboolean list = FALSE;
|
||||||
Demo *d, *c;
|
DemoData *d, *c;
|
||||||
GDoDemoFunc func = 0;
|
GDoDemoFunc func = 0;
|
||||||
GtkWidget *window, *demo;
|
GtkWidget *window, *demo;
|
||||||
|
|
||||||
@@ -1108,11 +1106,11 @@ command_line (GApplication *app,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
window = gtk_application_get_windows (GTK_APPLICATION (app))->data;
|
||||||
|
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
window = gtk_application_get_windows (GTK_APPLICATION (app))->data;
|
|
||||||
|
|
||||||
d = gtk_demos;
|
d = gtk_demos;
|
||||||
|
|
||||||
while (d->title)
|
while (d->title)
|
||||||
@@ -1142,7 +1140,11 @@ out:
|
|||||||
|
|
||||||
gtk_window_set_transient_for (GTK_WINDOW (demo), GTK_WINDOW (window));
|
gtk_window_set_transient_for (GTK_WINDOW (demo), GTK_WINDOW (window));
|
||||||
gtk_window_set_modal (GTK_WINDOW (demo), TRUE);
|
gtk_window_set_modal (GTK_WINDOW (demo), TRUE);
|
||||||
|
|
||||||
|
g_signal_connect_swapped (G_OBJECT (demo), "destroy", G_CALLBACK (g_application_quit), app);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
gtk_widget_show (GTK_WIDGET (window));
|
||||||
|
|
||||||
if (autoquit)
|
if (autoquit)
|
||||||
g_timeout_add_seconds (1, auto_quit, app);
|
g_timeout_add_seconds (1, auto_quit, app);
|
||||||
@@ -1153,7 +1155,7 @@ out:
|
|||||||
static void
|
static void
|
||||||
print_version (void)
|
print_version (void)
|
||||||
{
|
{
|
||||||
g_print ("gtk3-demo %d.%d.%d\n",
|
g_print ("gtk4-demo %d.%d.%d\n",
|
||||||
gtk_get_major_version (),
|
gtk_get_major_version (),
|
||||||
gtk_get_minor_version (),
|
gtk_get_minor_version (),
|
||||||
gtk_get_micro_version ());
|
gtk_get_micro_version ());
|
||||||
@@ -1195,16 +1197,6 @@ main (int argc, char **argv)
|
|||||||
};
|
};
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Most code in gtk-demo is intended to be exemplary, but not
|
|
||||||
* these few lines, which are just a hack so gtk-demo will work
|
|
||||||
* in the GTK tree without installing it.
|
|
||||||
*/
|
|
||||||
if (g_file_test ("../../modules/input/immodules.cache", G_FILE_TEST_EXISTS))
|
|
||||||
{
|
|
||||||
g_setenv ("GTK_IM_MODULE_FILE", "../../modules/input/immodules.cache", TRUE);
|
|
||||||
}
|
|
||||||
/* -- End of hack -- */
|
|
||||||
|
|
||||||
app = gtk_application_new ("org.gtk.Demo4", G_APPLICATION_NON_UNIQUE|G_APPLICATION_HANDLES_COMMAND_LINE);
|
app = gtk_application_new ("org.gtk.Demo4", G_APPLICATION_NON_UNIQUE|G_APPLICATION_HANDLES_COMMAND_LINE);
|
||||||
|
|
||||||
g_action_map_add_action_entries (G_ACTION_MAP (app),
|
g_action_map_add_action_entries (G_ACTION_MAP (app),
|
||||||
@@ -1219,7 +1211,6 @@ main (int argc, char **argv)
|
|||||||
g_application_add_main_option (G_APPLICATION (app), "list", 0, 0, G_OPTION_ARG_NONE, "List examples", NULL);
|
g_application_add_main_option (G_APPLICATION (app), "list", 0, 0, G_OPTION_ARG_NONE, "List examples", NULL);
|
||||||
g_application_add_main_option (G_APPLICATION (app), "autoquit", 0, 0, G_OPTION_ARG_NONE, "Quit after a delay", NULL);
|
g_application_add_main_option (G_APPLICATION (app), "autoquit", 0, 0, G_OPTION_ARG_NONE, "Quit after a delay", NULL);
|
||||||
|
|
||||||
g_signal_connect (app, "startup", G_CALLBACK (startup), NULL);
|
|
||||||
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
|
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
|
||||||
g_signal_connect (app, "command-line", G_CALLBACK (command_line), NULL);
|
g_signal_connect (app, "command-line", G_CALLBACK (command_line), NULL);
|
||||||
g_signal_connect (app, "handle-local-options", G_CALLBACK (local_options), NULL);
|
g_signal_connect (app, "handle-local-options", G_CALLBACK (local_options), NULL);
|
||||||
|
|||||||
@@ -16,15 +16,6 @@
|
|||||||
</item>
|
</item>
|
||||||
</section>
|
</section>
|
||||||
</menu>
|
</menu>
|
||||||
<object class="GtkTreeStore" id="treestore">
|
|
||||||
<columns>
|
|
||||||
<column type="gchararray"/>
|
|
||||||
<column type="gchararray"/>
|
|
||||||
<column type="gchararray"/>
|
|
||||||
<column type="gpointer"/>
|
|
||||||
<column type="gint"/>
|
|
||||||
</columns>
|
|
||||||
</object>
|
|
||||||
<object class="GtkApplicationWindow" id="window">
|
<object class="GtkApplicationWindow" id="window">
|
||||||
<style>
|
<style>
|
||||||
<class name="devel"/>
|
<class name="devel"/>
|
||||||
@@ -59,43 +50,24 @@
|
|||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox">
|
<object class="GtkBox">
|
||||||
<child>
|
|
||||||
<object class="GtkFrame">
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkScrolledWindow">
|
<object class="GtkScrolledWindow">
|
||||||
<property name="width-request">120</property>
|
<property name="width-request">120</property>
|
||||||
<property name="hscrollbar-policy">never</property>
|
<property name="hscrollbar-policy">never</property>
|
||||||
<property name="min-content-width">150</property>
|
<property name="min-content-width">150</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeView" id="treeview">
|
<object class="GtkListView" id="listview">
|
||||||
<property name="model">treestore</property>
|
<property name="factory">
|
||||||
<property name="headers-visible">0</property>
|
<object class="GtkBuilderListItemFactory">
|
||||||
<child internal-child="selection">
|
<property name="resource">/ui/main-listitem.ui</property>
|
||||||
<object class="GtkTreeSelection" id="treeview-selection">
|
</object>
|
||||||
<property name="mode">browse</property>
|
</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkTreeViewColumn">
|
<object class="GtkSeparator"/>
|
||||||
<child>
|
|
||||||
<object class="GtkCellRendererText"/>
|
|
||||||
<attributes>
|
|
||||||
<attribute name="style">4</attribute>
|
|
||||||
<attribute name="text">1</attribute>
|
|
||||||
</attributes>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkCellRendererText">
|
|
||||||
<property name="text"> </property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkNotebook" id="notebook">
|
<object class="GtkNotebook" id="notebook">
|
||||||
|
|||||||
@@ -58,8 +58,7 @@ do_markup (GtkWidget *do_widget)
|
|||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
gtk_window_set_default_size (GTK_WINDOW (window), 450, 450);
|
gtk_window_set_default_size (GTK_WINDOW (window), 450, 450);
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
stack = gtk_stack_new ();
|
stack = gtk_stack_new ();
|
||||||
gtk_widget_show (stack);
|
gtk_widget_show (stack);
|
||||||
@@ -82,7 +81,7 @@ do_markup (GtkWidget *do_widget)
|
|||||||
gtk_text_view_set_left_margin (GTK_TEXT_VIEW (view), 10);
|
gtk_text_view_set_left_margin (GTK_TEXT_VIEW (view), 10);
|
||||||
gtk_text_view_set_right_margin (GTK_TEXT_VIEW (view), 10);
|
gtk_text_view_set_right_margin (GTK_TEXT_VIEW (view), 10);
|
||||||
|
|
||||||
sw = gtk_scrolled_window_new (NULL, NULL);
|
sw = gtk_scrolled_window_new ();
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
||||||
GTK_POLICY_AUTOMATIC,
|
GTK_POLICY_AUTOMATIC,
|
||||||
GTK_POLICY_AUTOMATIC);
|
GTK_POLICY_AUTOMATIC);
|
||||||
@@ -95,7 +94,7 @@ do_markup (GtkWidget *do_widget)
|
|||||||
gtk_text_view_set_left_margin (GTK_TEXT_VIEW (view2), 10);
|
gtk_text_view_set_left_margin (GTK_TEXT_VIEW (view2), 10);
|
||||||
gtk_text_view_set_right_margin (GTK_TEXT_VIEW (view2), 10);
|
gtk_text_view_set_right_margin (GTK_TEXT_VIEW (view2), 10);
|
||||||
|
|
||||||
sw = gtk_scrolled_window_new (NULL, NULL);
|
sw = gtk_scrolled_window_new ();
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
||||||
GTK_POLICY_AUTOMATIC,
|
GTK_POLICY_AUTOMATIC,
|
||||||
GTK_POLICY_AUTOMATIC);
|
GTK_POLICY_AUTOMATIC);
|
||||||
@@ -126,7 +125,7 @@ do_markup (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Text <span color="gray">c<span color="green">o</span>l<span color="tomato">o</sp
|
|||||||
|
|
||||||
Colorful <span underline="low" underline-color="blue"><span underline="double" underline-color="red">under</span>lines</span> and <span background="pink"><span underline="error">mo</span><span underline="error" underline-color="green">re</span></span>
|
Colorful <span underline="low" underline-color="blue"><span underline="double" underline-color="red">under</span>lines</span> and <span background="pink"><span underline="error">mo</span><span underline="error" underline-color="green">re</span></span>
|
||||||
|
|
||||||
Colorful <span strikethrough="true" strikethrough-color="magenta">strikethroughs</span>
|
Colorful <span strikethrough="true" strikethrough-color="magenta">strikethroughs</span> and <span overline="single" overline_color="green">overlines</span>
|
||||||
|
|
||||||
Superscripts and subscripts: 𝜀<span rise="-6000" size="x-small" font_desc="italic">0</span> = 𝜔<span rise="8000" size="smaller">𝜔<span rise="14000" size="smaller">𝜔<span rise="20000">.<span rise="23000">.<span rise="26000">.</span></span></span></span></span>
|
Superscripts and subscripts: 𝜀<span rise="-6000" size="x-small" font_desc="italic">0</span> = 𝜔<span rise="8000" size="smaller">𝜔<span rise="14000" size="smaller">𝜔<span rise="20000">.<span rise="23000">.<span rise="26000">.</span></span></span></span></span>
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<interface>
|
<interface>
|
||||||
<menu id="appmenu">
|
<menu id="menubar">
|
||||||
|
<submenu>
|
||||||
|
<attribute name="label" translatable="yes">_Application</attribute>
|
||||||
<section>
|
<section>
|
||||||
<item>
|
<item>
|
||||||
<attribute name="label" translatable="yes">_New</attribute>
|
<attribute name="label" translatable="yes">_New</attribute>
|
||||||
@@ -29,10 +31,9 @@
|
|||||||
<attribute name="accel"><Control>q</attribute>
|
<attribute name="accel"><Control>q</attribute>
|
||||||
</item>
|
</item>
|
||||||
</section>
|
</section>
|
||||||
</menu>
|
</submenu>
|
||||||
<menu id="menubar">
|
|
||||||
<submenu>
|
<submenu>
|
||||||
<attribute name="label" translatable="yes">_Preferences</attribute>
|
<attribute name="label" translatable="yes">_File</attribute>
|
||||||
<section>
|
<section>
|
||||||
<item>
|
<item>
|
||||||
<attribute name="label" translatable="yes">_Prefer Dark Theme</attribute>
|
<attribute name="label" translatable="yes">_Prefer Dark Theme</attribute>
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ demos = files([
|
|||||||
'cursors.c',
|
'cursors.c',
|
||||||
'dialog.c',
|
'dialog.c',
|
||||||
'drawingarea.c',
|
'drawingarea.c',
|
||||||
|
'dropdown.c',
|
||||||
'dnd.c',
|
'dnd.c',
|
||||||
'editable_cells.c',
|
'editable_cells.c',
|
||||||
'entry_completion.c',
|
'entry_completion.c',
|
||||||
@@ -41,6 +42,14 @@ demos = files([
|
|||||||
'listbox.c',
|
'listbox.c',
|
||||||
'flowbox.c',
|
'flowbox.c',
|
||||||
'list_store.c',
|
'list_store.c',
|
||||||
|
'listview_applauncher.c',
|
||||||
|
'listview_clocks.c',
|
||||||
|
'listview_colors.c',
|
||||||
|
'listview_filebrowser.c',
|
||||||
|
'listview_minesweeper.c',
|
||||||
|
'listview_settings.c',
|
||||||
|
'listview_weather.c',
|
||||||
|
'listview_words.c',
|
||||||
'markup.c',
|
'markup.c',
|
||||||
'modelbutton.c',
|
'modelbutton.c',
|
||||||
'overlay.c',
|
'overlay.c',
|
||||||
@@ -95,7 +104,7 @@ extra_demo_sources = files(['main.c',
|
|||||||
if harfbuzz_dep.found() and pangoft_dep.found()
|
if harfbuzz_dep.found() and pangoft_dep.found()
|
||||||
demos += files('font_features.c')
|
demos += files('font_features.c')
|
||||||
extra_demo_sources += files(['script-names.c', 'language-names.c'])
|
extra_demo_sources += files(['script-names.c', 'language-names.c'])
|
||||||
gtkdemo_deps += [ harfbuzz_dep, ]
|
gtkdemo_deps += [ harfbuzz_dep, epoxy_dep ]
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if os_unix
|
if os_unix
|
||||||
|
|||||||
@@ -259,7 +259,7 @@
|
|||||||
259|GTK+ and friends|GTKtoolkit|#java bindings version 4.0.16 released: http://article.gmane.org/gmane.comp.gnome.bindings.java/1796 #gtk|1276885917|0||0|0
|
259|GTK+ and friends|GTKtoolkit|#java bindings version 4.0.16 released: http://article.gmane.org/gmane.comp.gnome.bindings.java/1796 #gtk|1276885917|0||0|0
|
||||||
260|GTK+ and friends|GTKtoolkit|RT @cwiiis: MxIconTheme and MxIcon respect system's icon theme (and changes) now in #mx master :) Made possible by @thosw's XSettings work|1276883019|0||0|0
|
260|GTK+ and friends|GTKtoolkit|RT @cwiiis: MxIconTheme and MxIcon respect system's icon theme (and changes) now in #mx master :) Made possible by @thosw's XSettings work|1276883019|0||0|0
|
||||||
261|GTK+ and friends|GTKtoolkit|#javascript mailing list just created. Discuss its usage in GObject libraries: GTK+, Glib ... http://ur1.ca/08lwz by @jwendell #gtk|1276842639|0||0|0
|
261|GTK+ and friends|GTKtoolkit|#javascript mailing list just created. Discuss its usage in GObject libraries: GTK+, Glib ... http://ur1.ca/08lwz by @jwendell #gtk|1276842639|0||0|0
|
||||||
262|GTK+ and friends|GTKtoolkit|Note fot Win32 users: XP theming is back in 2.90.3 . Please test. #gtk|1276829697|0||0|0
|
262|GTK+ and friends|GTKtoolkit|Note for Win32 users: XP theming is back in 2.90.3 . Please test. #gtk|1276829697|0||0|0
|
||||||
263|GTK+ and friends|GTKtoolkit|GTK+ 2.90.3 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-June/msg00137.html #gtk|1276829633|0||0|0
|
263|GTK+ and friends|GTKtoolkit|GTK+ 2.90.3 (unstable) released: http://mail.gnome.org/archives/gtk-devel-list/2010-June/msg00137.html #gtk|1276829633|0||0|0
|
||||||
264|GTK+ and friends|GTKtoolkit|GLib 2.25.9 (unstable) released: http://ur1.ca/08hrl WARNING: API changes in GDBus, GSettings and GApplication #gtk|1276829581|0||0|0
|
264|GTK+ and friends|GTKtoolkit|GLib 2.25.9 (unstable) released: http://ur1.ca/08hrl WARNING: API changes in GDBus, GSettings and GApplication #gtk|1276829581|0||0|0
|
||||||
265|scaroo|scaroo|RT @scaroo: #SeedKit does RGBA window with css shadows and stuff : http://dl.dropbox.com/u/5746554/seedkit-does-rgba.png|1276734086|0|GTKtoolkit|0|1
|
265|scaroo|scaroo|RT @scaroo: #SeedKit does RGBA window with css shadows and stuff : http://dl.dropbox.com/u/5746554/seedkit-does-rgba.png|1276734086|0|GTKtoolkit|0|1
|
||||||
|
|||||||
@@ -43,8 +43,7 @@ do_modelbutton (GtkWidget *do_widget)
|
|||||||
window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
|
window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
|
||||||
gtk_window_set_display (GTK_WINDOW (window),
|
gtk_window_set_display (GTK_WINDOW (window),
|
||||||
gtk_widget_get_display (do_widget));
|
gtk_widget_get_display (do_widget));
|
||||||
g_signal_connect (window, "destroy",
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
actions = (GActionGroup*)g_simple_action_group_new ();
|
actions = (GActionGroup*)g_simple_action_group_new ();
|
||||||
g_action_map_add_action_entries (G_ACTION_MAP (actions),
|
g_action_map_add_action_entries (G_ACTION_MAP (actions),
|
||||||
@@ -59,7 +58,7 @@ do_modelbutton (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ do_overlay (GtkWidget *do_widget)
|
|||||||
gtk_widget_set_can_target (label, FALSE);
|
gtk_widget_set_can_target (label, FALSE);
|
||||||
gtk_widget_set_margin_top (label, 8);
|
gtk_widget_set_margin_top (label, 8);
|
||||||
gtk_widget_set_margin_bottom (label, 8);
|
gtk_widget_set_margin_bottom (label, 8);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), label);
|
gtk_box_append (GTK_BOX (vbox), label);
|
||||||
|
|
||||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
|
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
|
||||||
gtk_overlay_add_overlay (GTK_OVERLAY (overlay), vbox);
|
gtk_overlay_add_overlay (GTK_OVERLAY (overlay), vbox);
|
||||||
@@ -76,18 +76,16 @@ do_overlay (GtkWidget *do_widget)
|
|||||||
gtk_entry_set_placeholder_text (GTK_ENTRY (entry), "Your Lucky Number");
|
gtk_entry_set_placeholder_text (GTK_ENTRY (entry), "Your Lucky Number");
|
||||||
gtk_widget_set_margin_top (entry, 8);
|
gtk_widget_set_margin_top (entry, 8);
|
||||||
gtk_widget_set_margin_bottom (entry, 8);
|
gtk_widget_set_margin_bottom (entry, 8);
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), entry);
|
gtk_box_append (GTK_BOX (vbox), entry);
|
||||||
|
|
||||||
gtk_window_set_child (GTK_WINDOW (window), overlay);
|
gtk_window_set_child (GTK_WINDOW (window), overlay);
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
g_signal_connect (window, "destroy",
|
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ do_overlay2 (GtkWidget *do_widget)
|
|||||||
gtk_window_set_title (GTK_WINDOW (window), "Decorative Overlay");
|
gtk_window_set_title (GTK_WINDOW (window), "Decorative Overlay");
|
||||||
|
|
||||||
overlay = gtk_overlay_new ();
|
overlay = gtk_overlay_new ();
|
||||||
sw = gtk_scrolled_window_new (NULL, NULL);
|
sw = gtk_scrolled_window_new ();
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
||||||
GTK_POLICY_AUTOMATIC,
|
GTK_POLICY_AUTOMATIC,
|
||||||
GTK_POLICY_AUTOMATIC);
|
GTK_POLICY_AUTOMATIC);
|
||||||
@@ -60,9 +60,7 @@ do_overlay2 (GtkWidget *do_widget)
|
|||||||
gtk_window_set_child (GTK_WINDOW (window), overlay);
|
gtk_window_set_child (GTK_WINDOW (window), overlay);
|
||||||
gtk_overlay_set_child (GTK_OVERLAY (overlay), sw);
|
gtk_overlay_set_child (GTK_OVERLAY (overlay), sw);
|
||||||
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), text);
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), text);
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
g_signal_connect (window, "destroy",
|
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
image = gtk_picture_new_for_resource ("/overlay2/decor1.png");
|
image = gtk_picture_new_for_resource ("/overlay2/decor1.png");
|
||||||
gtk_overlay_add_overlay (GTK_OVERLAY (overlay), image);
|
gtk_overlay_add_overlay (GTK_OVERLAY (overlay), image);
|
||||||
@@ -97,7 +95,7 @@ do_overlay2 (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
static void
|
static void
|
||||||
done_cb (GtkDialog *dialog, gint response, gpointer data)
|
done_cb (GtkDialog *dialog, gint response, gpointer data)
|
||||||
{
|
{
|
||||||
gtk_widget_destroy (GTK_WIDGET (dialog));
|
gtk_window_destroy (GTK_WINDOW (dialog));
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkWidget *
|
GtkWidget *
|
||||||
@@ -22,14 +22,14 @@ do_pagesetup (GtkWidget *do_widget)
|
|||||||
if (!window)
|
if (!window)
|
||||||
{
|
{
|
||||||
window = gtk_page_setup_unix_dialog_new ("Page Setup", GTK_WINDOW (do_widget));
|
window = gtk_page_setup_unix_dialog_new ("Page Setup", GTK_WINDOW (do_widget));
|
||||||
g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
g_signal_connect (window, "response", G_CALLBACK (done_cb), NULL);
|
g_signal_connect (window, "response", G_CALLBACK (done_cb), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -405,16 +405,13 @@ do_paint (GtkWidget *toplevel)
|
|||||||
gtk_header_bar_pack_end (GTK_HEADER_BAR (headerbar), colorbutton);
|
gtk_header_bar_pack_end (GTK_HEADER_BAR (headerbar), colorbutton);
|
||||||
gtk_window_set_titlebar (GTK_WINDOW (window), headerbar);
|
gtk_window_set_titlebar (GTK_WINDOW (window), headerbar);
|
||||||
gtk_window_set_title (GTK_WINDOW (window), "Paint");
|
gtk_window_set_title (GTK_WINDOW (window), "Paint");
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
||||||
g_signal_connect (window, "destroy",
|
|
||||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ do_paintable (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ do_paintable_animated (GtkWidget *do_widget)
|
|||||||
if (!gtk_widget_get_visible (window))
|
if (!gtk_widget_get_visible (window))
|
||||||
gtk_widget_show (window);
|
gtk_widget_show (window);
|
||||||
else
|
else
|
||||||
gtk_widget_destroy (window);
|
gtk_window_destroy (GTK_WINDOW (window));
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user