Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1d24941ed5 | ||
|
|
6e5ed9270e | ||
|
|
5805720416 | ||
|
|
572edbd634 | ||
|
|
2a42f6cae0 | ||
|
|
8348afca8e | ||
|
|
23cb16e8b4 | ||
|
|
81f4f591f5 | ||
|
|
8e7885c7f6 | ||
|
|
03c4e872c0 | ||
|
|
9b65e5be73 | ||
|
|
9547dd3711 | ||
|
|
abf49ce756 | ||
|
|
6bf2f34fca | ||
|
|
2ea74498ed | ||
|
|
7004c679f2 | ||
|
|
c9de3f2ce0 | ||
|
|
f77d4f6d59 | ||
|
|
89b9a32168 | ||
|
|
357b766369 | ||
|
|
45a8ba18a6 | ||
|
|
0e0f8f72b2 | ||
|
|
dc5f8f7631 | ||
|
|
3a32b1eae6 | ||
|
|
7bf7e31459 | ||
|
|
c931867c4a | ||
|
|
a2c0eb646f | ||
|
|
8a03585611 | ||
|
|
74d9e35b37 | ||
|
|
1ae2d41378 | ||
|
|
070603b0fe | ||
|
|
9e3daf494f | ||
|
|
8f47b5cedf | ||
|
|
646ad029f0 | ||
|
|
d47963247d | ||
|
|
4f7add046c | ||
|
|
61ec9af5e3 | ||
|
|
412dc92b10 | ||
|
|
04dab3dcd6 | ||
|
|
c51f885253 | ||
|
|
aa7e20fee9 | ||
|
|
480b99b1e7 | ||
|
|
0a4367b1da | ||
|
|
39daca9d22 | ||
|
|
d614e25792 | ||
|
|
30209d0c99 | ||
|
|
e1c44feb01 | ||
|
|
5af8f4ede1 | ||
|
|
e11604fd62 | ||
|
|
a2e8d9087e | ||
|
|
edf268dc0f | ||
|
|
e03ea59f3c | ||
|
|
f0b2840668 | ||
|
|
4f2fc49475 | ||
|
|
2e4155bbfc | ||
|
|
ca2456cbc6 | ||
|
|
222b4868f5 | ||
|
|
2cf1f7e833 | ||
|
|
776d24695e | ||
|
|
64a9c6e5d7 | ||
|
|
66196013bc | ||
|
|
61ff308c9f | ||
|
|
2672f9b087 | ||
|
|
4315a75a12 | ||
|
|
15905bebb1 | ||
|
|
fc4a7454ad | ||
|
|
87410aea50 | ||
|
|
de98d00a1c | ||
|
|
e94ffd9d79 | ||
|
|
d7aebb784d | ||
|
|
20b8cb939d | ||
|
|
ff4217c3d1 | ||
|
|
4fb72d30d8 | ||
|
|
d2b8fc0bda | ||
|
|
951181628a | ||
|
|
ccee274847 | ||
|
|
967f6728ef | ||
|
|
bf11ffb626 | ||
|
|
c12cabbe4e | ||
|
|
e997594db9 | ||
|
|
6f5e3b395f | ||
|
|
8bf2caf20d | ||
|
|
040021ee0e | ||
|
|
5018a3a848 | ||
|
|
df1c74a91d | ||
|
|
bb3893d36c | ||
|
|
fe57449f6c | ||
|
|
c725adaa09 | ||
|
|
7731bfa4e0 | ||
|
|
e72546aaec | ||
|
|
d6d648f0f4 | ||
|
|
56fddd56f5 | ||
|
|
3c9c350bc0 | ||
|
|
8340a04bd6 | ||
|
|
ccef70fd3d | ||
|
|
0650fa7bbe | ||
|
|
5cffa06385 | ||
|
|
4df17a151e | ||
|
|
c8e314b690 | ||
|
|
3d91f3c235 | ||
|
|
32cd536ada | ||
|
|
0ba523d071 | ||
|
|
314171b2b1 | ||
|
|
909309cc2e | ||
|
|
32b6de0c3a | ||
|
|
7e22e7b67d | ||
|
|
36f0d7450c | ||
|
|
73d958911f | ||
|
|
6b4a2b5406 | ||
|
|
cd8d1c9b10 | ||
|
|
a79fedda77 | ||
|
|
558ef7fbdf | ||
|
|
7c6609a414 | ||
|
|
54514f494f | ||
|
|
67aa7ca79f | ||
|
|
344f5af01b | ||
|
|
8150d6c48c | ||
|
|
05ee0dbdb5 | ||
|
|
2db3076c92 | ||
|
|
90daed18df | ||
|
|
65dd2c645a | ||
|
|
89d70a940c | ||
|
|
4944517a0e | ||
|
|
2a7ee7f0b2 | ||
|
|
6edbd47c9a | ||
|
|
d755c39e4a | ||
|
|
b7f8327209 | ||
|
|
27c82d8411 | ||
|
|
e0b159c069 | ||
|
|
cfb19820fa | ||
|
|
e05ca13608 | ||
|
|
15cf96c01f | ||
|
|
2caec91a0f | ||
|
|
9465a1e0a8 | ||
|
|
251272c708 | ||
|
|
f068a0e0fa | ||
|
|
d0034cd112 | ||
|
|
ae6d5ebeef | ||
|
|
8466e70424 | ||
|
|
c3d8f27f48 | ||
|
|
b85229f1a1 | ||
|
|
d03298a048 | ||
|
|
798e0b487e | ||
|
|
49444d72b4 | ||
|
|
c0e0fe4dcb | ||
|
|
9a189848ea | ||
|
|
96b09bfc1d | ||
|
|
9a6c913d89 | ||
|
|
42010594be | ||
|
|
5469c30b75 | ||
|
|
fe9a2ee202 | ||
|
|
5e27dc7e9f | ||
|
|
69d083e3c0 | ||
|
|
2b95f9724e | ||
|
|
4066a07892 | ||
|
|
443ab58f65 | ||
|
|
e0116acbe4 | ||
|
|
91e9bf0207 | ||
|
|
aff0335f7e | ||
|
|
4d8baaa19b | ||
|
|
65452d80f1 | ||
|
|
df4d432151 | ||
|
|
1390f2c783 | ||
|
|
be99d0e900 | ||
|
|
97fcf1d5fc | ||
|
|
c9b14d7c45 | ||
|
|
3d0dda0347 | ||
|
|
8d69b35d67 | ||
|
|
7ba142a9f2 | ||
|
|
56ac55806d | ||
|
|
47f53c14db | ||
|
|
a47d40b914 | ||
|
|
be33ae30bb | ||
|
|
6d5f1306bf | ||
|
|
ad3dc716e7 | ||
|
|
089b125a89 | ||
|
|
dfd4554a11 | ||
|
|
1b98297881 | ||
|
|
cacc8fcafe | ||
|
|
ac07d39db8 | ||
|
|
e27aa77cec | ||
|
|
cbc9f68dd6 | ||
|
|
944d0f5a70 | ||
|
|
9ded7ef830 | ||
|
|
adb18b7ce3 | ||
|
|
8220e60257 | ||
|
|
b09af655e7 | ||
|
|
5833f8a3d8 | ||
|
|
72132d5e88 | ||
|
|
4167c4db78 | ||
|
|
3e1f6b9137 | ||
|
|
bb08b19c0d | ||
|
|
7497919e8f | ||
|
|
41cbe7b31c | ||
|
|
425e951341 | ||
|
|
2e4a0b92fc | ||
|
|
9f839579e2 | ||
|
|
900066b9d4 | ||
|
|
97534b0670 | ||
|
|
62672ade04 | ||
|
|
b22e1c1ccc | ||
|
|
1b8e60c26d | ||
|
|
035dfdd332 | ||
|
|
d1707d3c72 | ||
|
|
c9bed097ba | ||
|
|
5acb90025f | ||
|
|
2d12da79b0 | ||
|
|
bede379021 | ||
|
|
38acde1b20 | ||
|
|
d0c4a5addd | ||
|
|
b8a7ccf005 | ||
|
|
68fc53585e | ||
|
|
26afc125c7 | ||
|
|
090b39f78b | ||
|
|
3722de6b13 | ||
|
|
d93c9aa780 | ||
|
|
ea56504aee | ||
|
|
46b91edfdf | ||
|
|
d2dfde519d | ||
|
|
1eac56f22c | ||
|
|
fb491a6bb2 | ||
|
|
3da7c89b66 | ||
|
|
e842cf3a57 | ||
|
|
85b0e8f1a6 | ||
|
|
b8e03ff6c1 | ||
|
|
54b1703d67 | ||
|
|
15d647a0ec | ||
|
|
353558ddb3 | ||
|
|
9f58d30050 | ||
|
|
4f0632cdf1 | ||
|
|
ff8ba71948 | ||
|
|
a367591327 | ||
|
|
c91925fbc2 | ||
|
|
479f1649ef | ||
|
|
06f69184b6 | ||
|
|
3471d9a57c | ||
|
|
28d4035477 | ||
|
|
3e1d151efd | ||
|
|
556cfc3036 | ||
|
|
c49b757be6 | ||
|
|
cec7e2caf3 | ||
|
|
9a0c07a461 | ||
|
|
c7064c18b9 | ||
|
|
fb897310c8 | ||
|
|
5944849326 | ||
|
|
1255f1e6c7 | ||
|
|
d7bc09d859 | ||
|
|
f84a448351 | ||
|
|
7e34690e0c | ||
|
|
6f6d378600 | ||
|
|
216b463b8f | ||
|
|
4ad84cb5e5 | ||
|
|
19e0946717 | ||
|
|
0de1ad06cd | ||
|
|
72427006dd | ||
|
|
0e5f702651 | ||
|
|
4f1b0fc838 | ||
|
|
23d0963c2d | ||
|
|
dcb35fb80f | ||
|
|
b1768854c3 | ||
|
|
4ed4eaf8e8 | ||
|
|
d167b53b17 | ||
|
|
18eff80a30 | ||
|
|
a44ec5f624 | ||
|
|
5da518f50e | ||
|
|
ebb11a8ac5 | ||
|
|
dd9c5db1aa | ||
|
|
984ac9763e | ||
|
|
ad67af2f8f | ||
|
|
cc8460d366 | ||
|
|
1dc9b9c956 | ||
|
|
20b552ad9d | ||
|
|
12f4885ad7 | ||
|
|
9c1fdef286 | ||
|
|
c125a154da | ||
|
|
028d768b23 | ||
|
|
42972e01b0 | ||
|
|
1bd37af7d0 | ||
|
|
5fad2d0c02 | ||
|
|
bd9adeb795 | ||
|
|
5fd3c7c9d9 | ||
|
|
937184429f | ||
|
|
e31ccff3f8 | ||
|
|
edaafba7eb | ||
|
|
87018fa7fe | ||
|
|
8fcec519d0 | ||
|
|
aa52236c01 | ||
|
|
cd5b61d9d0 | ||
|
|
4eefdd6011 | ||
|
|
21748b3133 | ||
|
|
e7db202f88 | ||
|
|
a93e76eaf4 | ||
|
|
3c5bdb2ab2 | ||
|
|
8f7c40caf1 | ||
|
|
150ad62771 | ||
|
|
5e3715dc31 | ||
|
|
05648ba8e3 | ||
|
|
0956471a10 | ||
|
|
1f79e62f53 | ||
|
|
c123e93704 | ||
|
|
e49333340f | ||
|
|
7210f16dfc | ||
|
|
2825e992df | ||
|
|
8e8f534c21 | ||
|
|
d3d5ac905c | ||
|
|
4cca23a283 | ||
|
|
0f3fffc728 | ||
|
|
7261d8637d | ||
|
|
8a1e82986a | ||
|
|
e8d421b3df | ||
|
|
cb2c09b2ba | ||
|
|
a14026f0d1 | ||
|
|
e237df31f4 | ||
|
|
a9421c63a9 | ||
|
|
4f2938d957 | ||
|
|
8fa9d3678b | ||
|
|
4bbc23c185 | ||
|
|
73733e4176 | ||
|
|
9f8faf0a6e | ||
|
|
5ff704459c | ||
|
|
0ccc730d85 | ||
|
|
093ffe791e | ||
|
|
b9ff051043 | ||
|
|
10b6d5927b | ||
|
|
0052b6589e | ||
|
|
51e9ac15df | ||
|
|
4df579e0d3 | ||
|
|
2cf69d2e67 | ||
|
|
64bffd0dc8 | ||
|
|
b451240dfd | ||
|
|
41cc1f617f | ||
|
|
ed671eac25 | ||
|
|
9f2529adb6 | ||
|
|
3903d7b9e5 | ||
|
|
ec4d698021 | ||
|
|
da06c71389 | ||
|
|
0f508bf438 | ||
|
|
97dd7c5d57 | ||
|
|
78219bf9e1 | ||
|
|
1c30cbfab1 | ||
|
|
ac33dc5250 | ||
|
|
8de5db18d6 | ||
|
|
913aa49df4 | ||
|
|
5e4633ee53 | ||
|
|
30e573d87a | ||
|
|
9e91d60bb1 | ||
|
|
069652a5f1 | ||
|
|
ab1e25bfb1 | ||
|
|
862aa0ede5 | ||
|
|
f75c27c843 | ||
|
|
687b5fb40d | ||
|
|
bb36651548 | ||
|
|
65a2702294 | ||
|
|
94bcb57118 | ||
|
|
17856a97e4 | ||
|
|
d4926030b8 | ||
|
|
432a43d7c2 | ||
|
|
62232ee9db | ||
|
|
4be98bd3b8 | ||
|
|
ab2b95b502 | ||
|
|
718858a8ca | ||
|
|
89e1160b12 | ||
|
|
808976eefe | ||
|
|
ee735b80d5 | ||
|
|
7a1317a803 | ||
|
|
dac1cbfe30 | ||
|
|
0ca099c1a0 | ||
|
|
f01211ae2e | ||
|
|
7c23a48ef8 | ||
|
|
89f20a93e0 | ||
|
|
f3fd7fd2b3 | ||
|
|
10940a37dd | ||
|
|
8249be816a | ||
|
|
05f8b4d4b3 | ||
|
|
935c35fd43 | ||
|
|
33b18cb48d | ||
|
|
d9442d6e94 | ||
|
|
b9ac55fe7f | ||
|
|
ca558e7fa2 | ||
|
|
08f367fef0 | ||
|
|
ca5c94f75e | ||
|
|
6f4e5f95a6 | ||
|
|
2defd0ed42 | ||
|
|
86aca30744 | ||
|
|
d5f7299a8e | ||
|
|
e73a5d4c8b | ||
|
|
ec18c95d32 | ||
|
|
d9557c7da1 | ||
|
|
fc90fd41be | ||
|
|
ec5e38d1f9 | ||
|
|
0eb4d08daa | ||
|
|
4b365132ce | ||
|
|
a5ff902ae2 | ||
|
|
bd874540bb | ||
|
|
f6e1af5701 | ||
|
|
e2bfc9b7c9 | ||
|
|
5f3f91bf1c | ||
|
|
6527c08e4d | ||
|
|
a57104469d | ||
|
|
94f450ba67 | ||
|
|
b9e4113c81 | ||
|
|
65707f53b7 | ||
|
|
21c73e699b | ||
|
|
63226a7267 | ||
|
|
fb37810367 | ||
|
|
2b66734fa6 | ||
|
|
380aae139f | ||
|
|
e4e823c4d6 | ||
|
|
d4b16d5866 | ||
|
|
b9cfd9a9f9 | ||
|
|
664aa150fb | ||
|
|
aead92d9e4 | ||
|
|
7cc5d14045 | ||
|
|
33fce2af2a | ||
|
|
d26fbb6e89 | ||
|
|
cd93fe3b0e | ||
|
|
1208449322 | ||
|
|
a11ec3a05b | ||
|
|
e39dfcf00c | ||
|
|
5f1e0fe7d8 | ||
|
|
57d0d92ecb | ||
|
|
cf89d80765 | ||
|
|
758722ddeb | ||
|
|
182adba83c | ||
|
|
3c880216cf | ||
|
|
e854153b88 | ||
|
|
416b8449b9 | ||
|
|
394de09cb1 | ||
|
|
5213669fbc | ||
|
|
8471e2feac | ||
|
|
dd53a92ecf | ||
|
|
0ff4c3608e | ||
|
|
909854ae12 | ||
|
|
725da0065b | ||
|
|
c8801dd5d3 | ||
|
|
80c59795d7 | ||
|
|
b1f74094f1 | ||
|
|
255089a0a5 | ||
|
|
7c24c1137d | ||
|
|
7138a8f397 | ||
|
|
b32f6522ac | ||
|
|
b7e4548d2a | ||
|
|
0cfb63f301 | ||
|
|
e90b68967c | ||
|
|
0155b07c9d | ||
|
|
592d74e788 | ||
|
|
854a913911 | ||
|
|
48b551b188 | ||
|
|
9e808c57b4 | ||
|
|
896a761e24 | ||
|
|
96af9bdde6 | ||
|
|
e90f0188c1 | ||
|
|
0ab7eb7207 | ||
|
|
81dcdbe648 | ||
|
|
f4090cb0e5 | ||
|
|
0f5dfb147e | ||
|
|
0bcd369426 | ||
|
|
b316d4a281 | ||
|
|
86ab0135ce | ||
|
|
2d42d4e181 | ||
|
|
23e6313e2f | ||
|
|
b5c5810913 | ||
|
|
b5ebba4521 | ||
|
|
4fe8e273e4 | ||
|
|
12d8f5e69c | ||
|
|
8a1cf3080e | ||
|
|
b9bd0ed61c | ||
|
|
1f33ed8034 | ||
|
|
38f38cd2c4 | ||
|
|
71478a0262 | ||
|
|
f76f2cd94c | ||
|
|
183b134817 | ||
|
|
6a7d2012a5 | ||
|
|
7762d689f8 | ||
|
|
f2ee361b3a | ||
|
|
a0345c831a | ||
|
|
61c4a7f3eb | ||
|
|
7fc7eaa847 | ||
|
|
7bb2331f43 | ||
|
|
e373000cdb | ||
|
|
a228110583 | ||
|
|
6ae1956b2a | ||
|
|
a8a879f2a0 | ||
|
|
7e113cdec2 | ||
|
|
f9111c1107 | ||
|
|
1fdd7f3804 | ||
|
|
288fa3caf7 | ||
|
|
27e9b4933d | ||
|
|
c43915d609 | ||
|
|
989ecc5a23 | ||
|
|
a225af6d71 | ||
|
|
d2407c39c7 | ||
|
|
4754cf3927 | ||
|
|
b23c1a73ca | ||
|
|
4cebe2ac8b | ||
|
|
44431d2c10 | ||
|
|
14a1ac0dfb | ||
|
|
166542f1e3 | ||
|
|
05f4bf382d | ||
|
|
52af960175 | ||
|
|
a2e2bdf803 | ||
|
|
3baa5d92f4 | ||
|
|
99f97b82a6 | ||
|
|
6d1e7da475 | ||
|
|
81ad7c5816 | ||
|
|
84544a5e91 | ||
|
|
7ece6faaad | ||
|
|
031018a29e | ||
|
|
0f036383b2 | ||
|
|
c0e5ef79ec | ||
|
|
0aa6c26490 | ||
|
|
a11687e3eb | ||
|
|
f676aa56e6 | ||
|
|
a53802cfef | ||
|
|
b47c45d4cc | ||
|
|
f2354a7fa2 | ||
|
|
ca043be197 | ||
|
|
50346683a1 | ||
|
|
43374f4fae | ||
|
|
5e86f363ed | ||
|
|
d9be0a7b1c | ||
|
|
f3086fa389 | ||
|
|
0523b0639b | ||
|
|
1a32bff274 | ||
|
|
349d7f4c55 | ||
|
|
734d194cb0 | ||
|
|
5983befd5b | ||
|
|
e63e68dfde | ||
|
|
1ef81951b7 | ||
|
|
395ccb0706 | ||
|
|
b3f692f00c | ||
|
|
64c2fd4e51 | ||
|
|
dd698ecab4 | ||
|
|
b93bad9859 | ||
|
|
733f932b78 | ||
|
|
50d99e1314 | ||
|
|
90b7d7c5a1 | ||
|
|
7e422e10a6 | ||
|
|
2bf32fc770 | ||
|
|
3e095c3c33 | ||
|
|
3445d946bc | ||
|
|
7578928199 | ||
|
|
428127ef40 | ||
|
|
e3f932aa6b | ||
|
|
7cfa3b3513 | ||
|
|
81c691491c | ||
|
|
c361602b1a | ||
|
|
99b969067e | ||
|
|
6e8b750c68 | ||
|
|
df37b44cc8 | ||
|
|
9548be0cec | ||
|
|
588e27b456 | ||
|
|
7032d0c6b7 | ||
|
|
72e9a99315 | ||
|
|
3cff6742f5 | ||
|
|
6a02f578b6 | ||
|
|
e62769b361 | ||
|
|
9df9776238 | ||
|
|
4beabb6bf5 | ||
|
|
10d5bb91ab | ||
|
|
7c9c615aed | ||
|
|
fd48c97209 | ||
|
|
e58bf2be22 | ||
|
|
dc6453e230 | ||
|
|
b3a0288fd9 | ||
|
|
9c86f18982 | ||
|
|
1bf0140652 | ||
|
|
bb72f8afab | ||
|
|
bb11c4676b | ||
|
|
32fe3e54f1 | ||
|
|
9d2187ca4d | ||
|
|
0e94432c24 | ||
|
|
c4890d157a | ||
|
|
ef2befa698 | ||
|
|
5f9ce549f8 | ||
|
|
cb435f0d15 | ||
|
|
105e259f2c | ||
|
|
51bf0c3fe0 | ||
|
|
e6311a5fe7 | ||
|
|
2c90c14d72 | ||
|
|
6c9aeac36f | ||
|
|
48f7693eac | ||
|
|
71d3ba576f | ||
|
|
067670bd01 | ||
|
|
610d6fa1c0 | ||
|
|
5d6fa503c9 | ||
|
|
375e747014 | ||
|
|
5cab7be8a9 | ||
|
|
4808d83b26 | ||
|
|
c4951a06f3 | ||
|
|
bd418160e1 | ||
|
|
90a3d6d839 | ||
|
|
e2511e8be1 | ||
|
|
33e1403b98 | ||
|
|
596a134ef3 | ||
|
|
1ae7e50c88 | ||
|
|
922595d68c | ||
|
|
618aecd349 | ||
|
|
3ed66f9945 | ||
|
|
4284cb76c1 | ||
|
|
b7693e75ec | ||
|
|
c15b352c4b | ||
|
|
cf8aeba53e | ||
|
|
ff75d73b92 | ||
|
|
d7986d603f | ||
|
|
672fe041cc | ||
|
|
91485465c9 | ||
|
|
1c39d7b9ad | ||
|
|
54105f3816 | ||
|
|
69b007f849 | ||
|
|
118ac25059 | ||
|
|
9ee8a53b9c | ||
|
|
e407ef6c47 | ||
|
|
0935799f7d | ||
|
|
fac15811c2 | ||
|
|
d89f632850 | ||
|
|
b7804fd7eb | ||
|
|
95e40bbe5e | ||
|
|
3a680cf6b4 | ||
|
|
314dfbbd75 | ||
|
|
aed21ffcae | ||
|
|
a79d34bcc0 | ||
|
|
eebe11b95b | ||
|
|
42993c8c9b | ||
|
|
2598f3732c | ||
|
|
5204a6b672 | ||
|
|
155a20115c | ||
|
|
ab0e84257a | ||
|
|
b2fd66e4c4 | ||
|
|
66d0549938 | ||
|
|
498497171b | ||
|
|
b731d3fb18 | ||
|
|
0081d5c492 | ||
|
|
ccdc9d4992 | ||
|
|
45105590fe | ||
|
|
149863fdca | ||
|
|
be7b5e62be | ||
|
|
1b66b136dc | ||
|
|
4b188192f8 | ||
|
|
743bf334d4 | ||
|
|
1c5bf9d6b1 | ||
|
|
8b344e8bfe | ||
|
|
44019bcab2 | ||
|
|
52f547ae13 | ||
|
|
c7311009dc | ||
|
|
1b1855b14e | ||
|
|
6c699ac07b | ||
|
|
d379bb138c | ||
|
|
76796f5f23 | ||
|
|
796c572292 | ||
|
|
931dddcf0e | ||
|
|
2713270e1f | ||
|
|
2705d21f6e | ||
|
|
6b6869e327 | ||
|
|
97fc9c7061 | ||
|
|
c928568a92 | ||
|
|
78fe710b97 | ||
|
|
2ed22b3081 | ||
|
|
3ad30c4775 | ||
|
|
fe5033ea6d | ||
|
|
b6ec7d2981 | ||
|
|
42de1c8e60 | ||
|
|
5dcd4151db | ||
|
|
275e5504f8 | ||
|
|
f53e2a21ba | ||
|
|
e58d128c73 | ||
|
|
4b919721b1 | ||
|
|
391c4c1a24 | ||
|
|
acb8d2f539 | ||
|
|
a459d0a086 | ||
|
|
e3fb5b27f5 | ||
|
|
60ade26bda | ||
|
|
6cbbcf06b0 | ||
|
|
58394d555e | ||
|
|
7e8a830fda | ||
|
|
19a19b4237 | ||
|
|
fcaedd41ce | ||
|
|
e4e5689bc5 | ||
|
|
5080c3b1d2 | ||
|
|
3d450a3b33 | ||
|
|
faf55e0d06 | ||
|
|
ee40f3842b | ||
|
|
cc9b1e249a | ||
|
|
3c2b0a8986 | ||
|
|
724211362b | ||
|
|
e4b8c641b1 | ||
|
|
3f0b936694 | ||
|
|
3ef7768696 | ||
|
|
e2cb540ee9 | ||
|
|
bcd2b15ee4 | ||
|
|
f66a68b3fd | ||
|
|
e060d57bae | ||
|
|
0796b96908 | ||
|
|
184bfd2f69 | ||
|
|
e3f624d2bb | ||
|
|
e2db0ec3e5 | ||
|
|
7b0d574752 | ||
|
|
9e42c0dcc4 | ||
|
|
a8f68e22dd | ||
|
|
5d5219566f | ||
|
|
5e4f408235 | ||
|
|
3d6b2485d1 | ||
|
|
e8f4044f8c | ||
|
|
10f6b4913e | ||
|
|
7568c73062 | ||
|
|
6ce7de23a3 | ||
|
|
dbc517de99 | ||
|
|
e214c76bdf | ||
|
|
3ccd8c44b3 | ||
|
|
5df6f68cd9 | ||
|
|
45d4025ad7 | ||
|
|
f6b78bd167 | ||
|
|
17f239e6fc | ||
|
|
fcf00ebd8f | ||
|
|
e347fdc899 | ||
|
|
b419804ddb | ||
|
|
bdfabcf800 | ||
|
|
ebf695abdf | ||
|
|
bc2b1bd509 | ||
|
|
8642d8bde4 | ||
|
|
01e890eb3f | ||
|
|
7af8f069e7 | ||
|
|
b5db1685da | ||
|
|
335a8f4d6b | ||
|
|
e316413f60 | ||
|
|
e8ca0a1213 | ||
|
|
15d918f1fb | ||
|
|
329a641adf | ||
|
|
9bdf654cbc | ||
|
|
1a920ba955 | ||
|
|
afc490aa18 | ||
|
|
0a5c95c6b4 | ||
|
|
a078d00eef | ||
|
|
18632bc5fd | ||
|
|
f90783c298 | ||
|
|
643ea9c7fb | ||
|
|
39aa63057e | ||
|
|
5d4eec3b71 | ||
|
|
6bd7a309b3 | ||
|
|
dd452f82ff | ||
|
|
cb0fd33089 | ||
|
|
ee107621c4 | ||
|
|
54de067a13 | ||
|
|
ae50735311 | ||
|
|
97cbe98b3d | ||
|
|
eb112f9cd7 | ||
|
|
6025195234 | ||
|
|
7fd8e5455d | ||
|
|
e424d9325c | ||
|
|
78754ff194 | ||
|
|
242f4a6dec | ||
|
|
5460855ea4 | ||
|
|
605ca4da04 | ||
|
|
ebb9aa48ae | ||
|
|
99b93d1b71 | ||
|
|
ef87b569d7 | ||
|
|
3872c4fcdf | ||
|
|
09a4d3923a | ||
|
|
6df8a98fa0 | ||
|
|
a6af143ba7 | ||
|
|
287afb4b1d | ||
|
|
eb677e412c | ||
|
|
3853343918 | ||
|
|
fe55334f5c | ||
|
|
7ff4cb9b8a | ||
|
|
7143aec20d | ||
|
|
65d399fa5b | ||
|
|
8ce3787429 | ||
|
|
c4c5964588 | ||
|
|
2d61db57ef | ||
|
|
a9d8ffe3fe | ||
|
|
ab21af908c | ||
|
|
fffbe5228c | ||
|
|
87ec58f9d3 | ||
|
|
805baea90b | ||
|
|
91238d99ae | ||
|
|
d5561a21e3 | ||
|
|
f78ae92419 | ||
|
|
cbb233ad06 | ||
|
|
07571330ba | ||
|
|
0e48187238 | ||
|
|
e32574ed9b | ||
|
|
a41e8a0f5d | ||
|
|
c20a6424e5 | ||
|
|
f5a4d8f84b | ||
|
|
6f97c060b3 | ||
|
|
2bfd96c9e0 | ||
|
|
c815a4629c | ||
|
|
41f140c971 | ||
|
|
89b0bc667b | ||
|
|
d8cbab3bfc | ||
|
|
5a5daf153e | ||
|
|
bf4782d3e1 | ||
|
|
4ba03065bc | ||
|
|
747a1dca97 | ||
|
|
16f2c6cc0d | ||
|
|
b569d24cd1 | ||
|
|
7f4ffdb1e5 | ||
|
|
60c05710b1 | ||
|
|
3e59822753 | ||
|
|
47a9729737 | ||
|
|
3f31d9bd5a | ||
|
|
95538794e3 | ||
|
|
371b1caaa6 | ||
|
|
64909893e7 | ||
|
|
815f1c810e | ||
|
|
1f031d8966 | ||
|
|
2a4aa2f8ac | ||
|
|
d646607066 | ||
|
|
c37b45308e | ||
|
|
2cec6a6778 | ||
|
|
a4c635ee52 | ||
|
|
4fc859d9ef | ||
|
|
f945e3c292 | ||
|
|
37d8126128 | ||
|
|
86ab733de0 | ||
|
|
95d87732c4 | ||
|
|
8338e701b4 | ||
|
|
a384b8e295 | ||
|
|
019f591627 | ||
|
|
8cbfb29a49 | ||
|
|
12470fd954 | ||
|
|
fd9cd61991 | ||
|
|
4a40af7eda | ||
|
|
58eed1682c | ||
|
|
481e7f78bc | ||
|
|
34de343fa6 | ||
|
|
1c4fd1d02d | ||
|
|
4c3b8cbec7 | ||
|
|
727d08519a | ||
|
|
bb796bb364 | ||
|
|
b413762457 | ||
|
|
45ef0fcd26 | ||
|
|
eaef68f827 | ||
|
|
5c4b04615d | ||
|
|
b77690d046 | ||
|
|
49c97108e5 | ||
|
|
14e15fa79d | ||
|
|
fc3e36e255 | ||
|
|
3bbce082de | ||
|
|
de7807bc6a | ||
|
|
45b9de5ff6 | ||
|
|
63808bebde | ||
|
|
4927413bcb | ||
|
|
c3c814b28d | ||
|
|
e0d22f7f6a | ||
|
|
2a24686f29 | ||
|
|
be97bc30e3 | ||
|
|
c23d1d493f | ||
|
|
74934de4b8 | ||
|
|
6efe62e277 | ||
|
|
ae2757c515 | ||
|
|
c55b46e67f | ||
|
|
15eae4f606 | ||
|
|
a1b339eecf | ||
|
|
ba892240cb | ||
|
|
173d10f336 | ||
|
|
14b08d1001 | ||
|
|
b52a2ca4cf | ||
|
|
b512c215a4 | ||
|
|
3e2268b391 | ||
|
|
874ea99492 | ||
|
|
20b0aab470 | ||
|
|
4c3e9ffad4 | ||
|
|
a8db164ef7 | ||
|
|
f5feb7a0de | ||
|
|
fdd3664a6e | ||
|
|
9fdc5cdf28 | ||
|
|
e9cf931714 | ||
|
|
9b2cf3de43 | ||
|
|
7f9920554e | ||
|
|
0e3322d4a8 | ||
|
|
3a5fc95725 | ||
|
|
b7496a4732 | ||
|
|
6fd191f32d | ||
|
|
eba86758f2 | ||
|
|
7fa5e6db3c | ||
|
|
f678491eb3 | ||
|
|
b1f3bf85c4 | ||
|
|
0117092f83 | ||
|
|
8ea9bffba2 | ||
|
|
12d805fad4 | ||
|
|
2742b62ef1 | ||
|
|
0872d3b445 | ||
|
|
e654bfd127 | ||
|
|
6f493ed47e | ||
|
|
2028a21d14 | ||
|
|
08d0b25619 | ||
|
|
eba4edf7a7 | ||
|
|
f8e1536336 | ||
|
|
8b90555511 | ||
|
|
f32b8534a4 | ||
|
|
26453a8ad4 | ||
|
|
98f1e8af57 | ||
|
|
ce597da1a3 | ||
|
|
dba80a5a9e | ||
|
|
3c94112aeb | ||
|
|
855b892b1e | ||
|
|
22b74dc70b | ||
|
|
014ba9e868 | ||
|
|
11f3beae8b | ||
|
|
ac1065bfa6 | ||
|
|
84501d087c | ||
|
|
60f2b53866 | ||
|
|
c9e8d24e06 | ||
|
|
2436c3bad1 | ||
|
|
32358a876b | ||
|
|
a05c596e48 | ||
|
|
b2d8336dd0 | ||
|
|
cfdc275a88 | ||
|
|
2dd2d18ade | ||
|
|
3d9a92787b | ||
|
|
9acec081a4 | ||
|
|
6d101c4e10 | ||
|
|
09e9e7314b | ||
|
|
a86dc5ae85 | ||
|
|
bb70bcb4e3 | ||
|
|
c86701ee3c | ||
|
|
01ec120536 | ||
|
|
f734f230fd | ||
|
|
5c7697a765 | ||
|
|
ca7340530d | ||
|
|
9aceea0134 | ||
|
|
7df778fc71 | ||
|
|
e855b9f160 | ||
|
|
54428e9e40 | ||
|
|
a975ddc80a | ||
|
|
b128a7ca59 | ||
|
|
3dd54d5fea | ||
|
|
45ef2da0ac | ||
|
|
6491dc1bde | ||
|
|
1eee70ff9b | ||
|
|
e77aca2037 | ||
|
|
981cf94719 | ||
|
|
0550fb90c5 | ||
|
|
8cf9f8ba9d | ||
|
|
1eb61cfd24 | ||
|
|
75d54e25e9 | ||
|
|
930e91834f | ||
|
|
8ad1394f1a | ||
|
|
a53ac4479b | ||
|
|
bd707e7514 | ||
|
|
eafc9ec997 | ||
|
|
9a8b3fc232 | ||
|
|
fda50f0ff3 | ||
|
|
65411b8ccb | ||
|
|
5c7991e873 | ||
|
|
f42157fdd7 | ||
|
|
f80c3adfe0 | ||
|
|
1c8db65b20 | ||
|
|
1e21f2b148 | ||
|
|
629f0d6502 | ||
|
|
b69edb7936 | ||
|
|
c49d8e4d44 | ||
|
|
045134fcff | ||
|
|
9e9a0be80d | ||
|
|
0dd25cb631 | ||
|
|
eb46631a7d | ||
|
|
0074a8ba1e | ||
|
|
e187252afd | ||
|
|
0349e44856 | ||
|
|
d8985e9f91 | ||
|
|
4a70ae125d | ||
|
|
0b785c8e59 | ||
|
|
ae303db62b | ||
|
|
45300a233b | ||
|
|
65f417cf7d | ||
|
|
07322293f3 | ||
|
|
3efd975d2f | ||
|
|
c9ddfc086c | ||
|
|
fb952dd209 | ||
|
|
572e2173c3 | ||
|
|
752b10273b | ||
|
|
9aba312c8e | ||
|
|
983ae5337b | ||
|
|
0fd51e5c8a | ||
|
|
f58785c2e0 | ||
|
|
3d030a96b7 | ||
|
|
2ecf1c18fb | ||
|
|
eae5a209d3 | ||
|
|
78a00b5b88 | ||
|
|
1ac688ec19 | ||
|
|
b9bc65e3c2 | ||
|
|
3d8d3958ea | ||
|
|
1567062636 | ||
|
|
b09e6a5405 | ||
|
|
89a8f3eb0a | ||
|
|
b90a9a3357 | ||
|
|
fe4abe7d85 | ||
|
|
a650916105 | ||
|
|
4f294f4eae | ||
|
|
3ad525533d | ||
|
|
6979dce7e8 | ||
|
|
6f1f82a7fb | ||
|
|
3290f15439 | ||
|
|
0a737c4d72 | ||
|
|
8025884e3b | ||
|
|
a8a7627161 | ||
|
|
18e4b74d0b | ||
|
|
614bbd1a0b | ||
|
|
c4d4dd1e5a | ||
|
|
303d5cc581 | ||
|
|
6055170b19 | ||
|
|
b30ee02353 | ||
|
|
8b22990eba | ||
|
|
f402699512 | ||
|
|
8606e505d1 | ||
|
|
eeee22c914 | ||
|
|
0f4420b8c7 | ||
|
|
d2140e4cec | ||
|
|
872c5d6572 | ||
|
|
11b11c9166 | ||
|
|
995cba88ff | ||
|
|
92a35ea3e9 | ||
|
|
c22d141237 | ||
|
|
415066345a | ||
|
|
81a669a199 | ||
|
|
ffa7afd09c | ||
|
|
dab682f90d | ||
|
|
35740637df | ||
|
|
57fb1eb27b | ||
|
|
069c6a3f81 | ||
|
|
61da248c41 | ||
|
|
0f36b273f1 | ||
|
|
770922cdda | ||
|
|
343ad0ffd5 | ||
|
|
e134a99e12 | ||
|
|
f8139d094a | ||
|
|
1e8efcdc5a | ||
|
|
81abfe3175 | ||
|
|
cf2e44f3d5 | ||
|
|
049d3c19af | ||
|
|
ffe8a9f7a6 | ||
|
|
2da635c048 | ||
|
|
83ed374b99 | ||
|
|
9837ef901b | ||
|
|
01e48bc074 | ||
|
|
49c0299d68 | ||
|
|
4a8e17e80e | ||
|
|
8c8912c651 | ||
|
|
8be35d2a30 | ||
|
|
2a4612672a | ||
|
|
a98cb3606f | ||
|
|
20056cb9c4 | ||
|
|
1e36865bb3 | ||
|
|
306aef3ef9 | ||
|
|
f5ebe3efc8 | ||
|
|
2bbe9dccc6 | ||
|
|
2723d49b3a | ||
|
|
87b9e52719 | ||
|
|
bfe13386c5 | ||
|
|
766299a15c | ||
|
|
fe30e00bc1 | ||
|
|
0dcc35df8f | ||
|
|
7be145b94a | ||
|
|
e365266b4a | ||
|
|
e8f9ea0784 | ||
|
|
76fdce8576 | ||
|
|
72dfc10b1b | ||
|
|
c472a4ccd6 | ||
|
|
74c09bdebc | ||
|
|
56e1c402f6 | ||
|
|
b1e7155c6d | ||
|
|
7dd47dbd2e | ||
|
|
e5673e9a7b | ||
|
|
8abc95205a | ||
|
|
d8a8e6ce73 | ||
|
|
e44e801e3a | ||
|
|
5170e037b5 | ||
|
|
b121fa7287 | ||
|
|
29ac0f9ee6 | ||
|
|
1fb1865aca | ||
|
|
d314856f82 | ||
|
|
0a0dbd384c | ||
|
|
3ef9540a57 | ||
|
|
84647201b1 | ||
|
|
f31ef7cfe2 | ||
|
|
9af54f5ed7 | ||
|
|
5788bd90e2 | ||
|
|
729b1eb8de | ||
|
|
9a92fa33a8 | ||
|
|
5c8f50a9f5 | ||
|
|
56845a64d9 | ||
|
|
36a369fac8 | ||
|
|
a5d1dfe81f | ||
|
|
946a39c361 | ||
|
|
3710da43c9 | ||
|
|
a9f8e1e897 | ||
|
|
9e46407e89 | ||
|
|
e1b4e18153 | ||
|
|
01104844e8 | ||
|
|
d1e1ef3a82 | ||
|
|
907211a733 | ||
|
|
dec2aff37d | ||
|
|
4bd67e4933 | ||
|
|
328c85e6b3 | ||
|
|
c7b5ce0346 | ||
|
|
ca92d14db6 | ||
|
|
e0bae25136 | ||
|
|
1b23b5b7a6 | ||
|
|
9bdbeffeb0 | ||
|
|
6c17f4bc16 | ||
|
|
d0d6a573a7 | ||
|
|
8c9f193114 | ||
|
|
5bac77f6bb | ||
|
|
e815b1d6ae | ||
|
|
1406eec197 | ||
|
|
5e73127f9a | ||
|
|
541ee90d27 | ||
|
|
d330d6d537 | ||
|
|
5b28ae17cf | ||
|
|
af2678a3a0 | ||
|
|
3a8a9332d6 | ||
|
|
2bce91de0b | ||
|
|
7b3a9dd30f | ||
|
|
1f7ed3f1cb | ||
|
|
db3fd73d09 | ||
|
|
7d83394e35 | ||
|
|
f880dacdd7 | ||
|
|
b48376c370 | ||
|
|
e0c1796035 | ||
|
|
ffc9af18be | ||
|
|
7c2b94eee8 | ||
|
|
d5a8479294 | ||
|
|
29f614b7b7 | ||
|
|
98d813a00b | ||
|
|
a2b35c289c | ||
|
|
2d3e1f8122 | ||
|
|
537167cd61 | ||
|
|
004786655c | ||
|
|
1ee2433b28 | ||
|
|
eb7a15dc9d | ||
|
|
5f8dcd286e | ||
|
|
4cfe5274b5 | ||
|
|
f6613cbad1 | ||
|
|
3806b33aab | ||
|
|
fa3c7c9059 | ||
|
|
c0c0b2ec4c | ||
|
|
d553862e52 | ||
|
|
7cbd905fae | ||
|
|
49e23b7df5 | ||
|
|
bf529ba1ff | ||
|
|
aa0b271aa9 | ||
|
|
1584764809 | ||
|
|
31130197eb | ||
|
|
723d8759ff | ||
|
|
667a56ca6c | ||
|
|
c009c30211 | ||
|
|
b6094244ac | ||
|
|
2741c40580 | ||
|
|
c90f3c659a | ||
|
|
e78251ee29 | ||
|
|
b960f62d2a | ||
|
|
dc76c2ea37 | ||
|
|
6e5149fbe6 | ||
|
|
4008d94571 | ||
|
|
4ad5df0370 | ||
|
|
887d891541 | ||
|
|
041288cdad | ||
|
|
c8ee118f00 | ||
|
|
d4134c94b3 | ||
|
|
5ca3e835a7 | ||
|
|
6c85c796d3 | ||
|
|
992215ee91 | ||
|
|
1729cfcb3f | ||
|
|
4cf1b52982 | ||
|
|
1226224858 | ||
|
|
bc1d2e5f7a | ||
|
|
a0f0c48bc5 | ||
|
|
4d6c77704c | ||
|
|
f3855583dd | ||
|
|
2b98ebc544 | ||
|
|
8b5358fbcc | ||
|
|
4ed7032fd5 | ||
|
|
d4d2483161 | ||
|
|
4e01192979 | ||
|
|
2127820ae0 | ||
|
|
361308962e | ||
|
|
e0c8409971 | ||
|
|
6f31e33094 | ||
|
|
bad5eab21c | ||
|
|
c9ec0527dd | ||
|
|
ac3ce1ceac | ||
|
|
6fffdba876 | ||
|
|
94789a9100 | ||
|
|
1475d02be0 | ||
|
|
a40f53a1f3 | ||
|
|
08d357dc98 | ||
|
|
0df299acf5 | ||
|
|
00eb2de4c8 | ||
|
|
f65f350965 | ||
|
|
1d32aed8dc | ||
|
|
ab3bdf219f | ||
|
|
5b1a58195e | ||
|
|
7f5d92addb | ||
|
|
7a37918ec7 | ||
|
|
31e198f772 | ||
|
|
366039eb2b | ||
|
|
fd83f3636d | ||
|
|
c2e8507402 | ||
|
|
3923bd915c | ||
|
|
d1163a4ee8 | ||
|
|
5538e738a8 | ||
|
|
b0a9f34dc4 | ||
|
|
65ca665e25 | ||
|
|
72b9560c32 | ||
|
|
7694d4dd18 | ||
|
|
853c16a9bc | ||
|
|
905cc2f22e | ||
|
|
edbe5c405c | ||
|
|
07bd2d4c13 | ||
|
|
d57f66ef75 | ||
|
|
19ecc6a284 | ||
|
|
2b6fc7dbe5 | ||
|
|
8d76d94131 | ||
|
|
246bcd06a2 | ||
|
|
e4f1b20211 | ||
|
|
ef5d8c482a | ||
|
|
c346055b42 | ||
|
|
63fd0dc103 | ||
|
|
7f05fda41a | ||
|
|
9c691db910 | ||
|
|
d7966a7234 | ||
|
|
e70c50ab1a | ||
|
|
74c16fabe6 | ||
|
|
70d5113180 | ||
|
|
6b089d3fba | ||
|
|
03ab236b67 | ||
|
|
8ba068041d | ||
|
|
fae83a34bc | ||
|
|
b934b1b940 | ||
|
|
7f7fd71fe4 | ||
|
|
d65cef176e | ||
|
|
5715245080 | ||
|
|
796c991dd8 | ||
|
|
7ac74220c4 | ||
|
|
1bb0451d75 | ||
|
|
ea4ef5be90 | ||
|
|
131691156a | ||
|
|
864bf5e059 | ||
|
|
5596c8825b | ||
|
|
a05c064466 | ||
|
|
ae86a8db0f | ||
|
|
dae5eadf1a | ||
|
|
bc11f40a7a | ||
|
|
51fd0fca91 | ||
|
|
3c0a4e4995 | ||
|
|
9959cf1f24 | ||
|
|
61669f6b98 | ||
|
|
d7d29a843f | ||
|
|
dbb9168426 | ||
|
|
cd52ebd7e8 | ||
|
|
99e20751a8 | ||
|
|
01108d7c2f | ||
|
|
7e5ca51486 | ||
|
|
5441ab1a58 | ||
|
|
0c34c94397 | ||
|
|
a5f97fc018 | ||
|
|
91cdc28846 | ||
|
|
2470954006 | ||
|
|
0e661dec95 | ||
|
|
e503bec31a | ||
|
|
628bb2e157 | ||
|
|
afeae7380d | ||
|
|
3530a5c191 | ||
|
|
92b9577a19 | ||
|
|
56dc9b1b4a | ||
|
|
8c3986ffe0 | ||
|
|
c2b67e647d | ||
|
|
6137fdbd91 | ||
|
|
35ecc2c643 | ||
|
|
cb8b8bd4cc | ||
|
|
7279e3592f | ||
|
|
8d275ddb31 | ||
|
|
cf41615cb3 | ||
|
|
c1f855c2ab | ||
|
|
4ac836fc66 | ||
|
|
5986e6a78b | ||
|
|
0601be026c | ||
|
|
24b0a3d75f | ||
|
|
2ac5234803 | ||
|
|
30e309853c | ||
|
|
944ce69906 | ||
|
|
4bf5316cfa | ||
|
|
136e63a6cd | ||
|
|
5ea424d0e8 | ||
|
|
d0e7e45a41 | ||
|
|
8df91eb382 | ||
|
|
40ed3bc0bc | ||
|
|
437e8fc3d1 | ||
|
|
4c86105183 | ||
|
|
87e9d93f5e | ||
|
|
b6fba447da | ||
|
|
95d31bad57 | ||
|
|
19fbceec93 | ||
|
|
4c13b96bd9 | ||
|
|
113c026ffa | ||
|
|
e985506737 | ||
|
|
d858b12d8e | ||
|
|
e97937f82c | ||
|
|
960b51933d | ||
|
|
ccc6580652 | ||
|
|
f473f3d4b9 | ||
|
|
2c349deee2 | ||
|
|
94e92b8edf | ||
|
|
85d0edbbed | ||
|
|
b1fc133883 | ||
|
|
f480366c87 | ||
|
|
51bd5376aa | ||
|
|
44880a41f9 | ||
|
|
1766ec558f | ||
|
|
58073542ff | ||
|
|
b7177b9fe6 | ||
|
|
c7dd1d6eef | ||
|
|
19d47c1d13 | ||
|
|
e5e22fc103 | ||
|
|
84f62080c4 | ||
|
|
2f30c86be8 | ||
|
|
46da9fe581 | ||
|
|
33efa85ac9 | ||
|
|
724f71b650 | ||
|
|
93cd47de5c | ||
|
|
e270199560 | ||
|
|
3fdd639028 | ||
|
|
90b227ed59 | ||
|
|
44f6fc357e | ||
|
|
20dca7dc2f | ||
|
|
81b2325aa1 | ||
|
|
fa1912bb5d | ||
|
|
7df9b08313 | ||
|
|
d54669982a | ||
|
|
e79564b501 | ||
|
|
1be65ff216 | ||
|
|
0bcf4bee6e | ||
|
|
78c4b474db | ||
|
|
af12c6557a | ||
|
|
24a5c3b50d | ||
|
|
708fb3de42 | ||
|
|
7ecc469385 | ||
|
|
34575bc603 | ||
|
|
7021031ea0 | ||
|
|
8cdc6cb966 | ||
|
|
cc359bd3e3 | ||
|
|
3225a28e12 | ||
|
|
758f879700 | ||
|
|
d8460692ac | ||
|
|
5e4bc8966c | ||
|
|
4373516256 | ||
|
|
4ebdaf7c1e | ||
|
|
3690011933 | ||
|
|
212b6d8a57 | ||
|
|
de4812cf93 | ||
|
|
37babfa29a | ||
|
|
9e6850eb4f | ||
|
|
f544a9d009 | ||
|
|
d455b44fef | ||
|
|
f33801e59b | ||
|
|
e70085a8c4 | ||
|
|
bdee1481ed | ||
|
|
3ffa020c2c | ||
|
|
24ac7c8167 | ||
|
|
1b0487faa8 | ||
|
|
fed2525c7a | ||
|
|
0662c39c19 | ||
|
|
bda17c4233 | ||
|
|
9c406eb9e6 | ||
|
|
6911e41695 | ||
|
|
aa12e90bd2 | ||
|
|
fb1802d7d5 | ||
|
|
6b105133ec | ||
|
|
29d8326d1a | ||
|
|
d6c4d36b01 | ||
|
|
9307b66711 | ||
|
|
34dab17999 | ||
|
|
dbc95b9121 | ||
|
|
2d8a61b704 | ||
|
|
a47058758e | ||
|
|
5e48b1094d | ||
|
|
8a4b19a8fd | ||
|
|
e265ad4454 | ||
|
|
2ef2fcd563 | ||
|
|
bb820c1c25 | ||
|
|
3d86ae55e9 | ||
|
|
3f9bb8ffd4 | ||
|
|
cc1b07d5f0 | ||
|
|
facdf39012 | ||
|
|
78a3a7061f | ||
|
|
813313501b | ||
|
|
1a4b9b3918 | ||
|
|
8c8b20664a | ||
|
|
b22eeeb3e5 | ||
|
|
9cdc5ec7d7 | ||
|
|
22d241fa7c | ||
|
|
52441590a6 | ||
|
|
ea44a26ae7 | ||
|
|
13863270bf | ||
|
|
2e5454e872 | ||
|
|
d5f449180a | ||
|
|
effedb9946 | ||
|
|
7c4d81378b | ||
|
|
f21fb35bfe | ||
|
|
c1cbe14871 | ||
|
|
6d276ab0c5 | ||
|
|
4787a2901c | ||
|
|
6913977100 | ||
|
|
e1a639ec7a | ||
|
|
60c37ee0eb | ||
|
|
92824d5338 | ||
|
|
0aff2e7227 | ||
|
|
789cc29279 | ||
|
|
d0136042ae | ||
|
|
afb83d763e | ||
|
|
2b615f32ca | ||
|
|
4d33f08150 | ||
|
|
d454cafbf5 | ||
|
|
72027837a0 | ||
|
|
6d3f6ce1ac | ||
|
|
9ebb998c64 | ||
|
|
77b1abb521 | ||
|
|
1d701fc2d9 | ||
|
|
2730971f0e | ||
|
|
78f75bf4bc | ||
|
|
288d0e5751 | ||
|
|
7c9d01f9a0 | ||
|
|
f3a27619db | ||
|
|
2b254e71ee | ||
|
|
b30e77a840 | ||
|
|
7c2ebabcd5 | ||
|
|
60e696cb1a | ||
|
|
590d0c50f1 | ||
|
|
777571e681 | ||
|
|
9c00988b4e | ||
|
|
3ebd679ac8 | ||
|
|
2d004b1f55 | ||
|
|
a1ed2b1bed |
No files matched your search
@@ -0,0 +1,132 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Report a problem with ZoiteChat
|
||||||
|
title: "[Bug]: "
|
||||||
|
labels: bug
|
||||||
|
assignees: ""
|
||||||
|
---
|
||||||
|
|
||||||
|
```
|
||||||
|
+------------------------------------------------------------+
|
||||||
|
| ZoiteChat Bug Report |
|
||||||
|
| Please fill this out so the bug goblin has enough crumbs. |
|
||||||
|
+------------------------------------------------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
What went wrong?
|
||||||
|
|
||||||
|
```text
|
||||||
|
Describe the bug clearly and briefly.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Steps to Reproduce
|
||||||
|
|
||||||
|
```text
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
4.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Expected Result
|
||||||
|
|
||||||
|
```text
|
||||||
|
What should have happened?
|
||||||
|
```
|
||||||
|
|
||||||
|
## Actual Result
|
||||||
|
|
||||||
|
```text
|
||||||
|
What happened instead?
|
||||||
|
```
|
||||||
|
|
||||||
|
## ZoiteChat Version
|
||||||
|
|
||||||
|
```text
|
||||||
|
ZoiteChat version:
|
||||||
|
Build/source: GitHub release / Fedora package / source build / Windows installer / other
|
||||||
|
Commit hash, if built from source:
|
||||||
|
```
|
||||||
|
|
||||||
|
## System Information
|
||||||
|
|
||||||
|
```text
|
||||||
|
OS:
|
||||||
|
OS version:
|
||||||
|
Desktop environment:
|
||||||
|
Display server: Wayland / X11 / Windows / other
|
||||||
|
CPU architecture: x86_64 / aarch64 / other
|
||||||
|
```
|
||||||
|
|
||||||
|
## IRC / Network Details
|
||||||
|
|
||||||
|
```text
|
||||||
|
IRC network/server:
|
||||||
|
Port:
|
||||||
|
TLS/SSL enabled: yes / no
|
||||||
|
SASL enabled: yes / no
|
||||||
|
Using bouncer/ZNC: yes / no
|
||||||
|
Proxy/VPN involved: yes / no
|
||||||
|
IRCv3 capabilities involved, if known:
|
||||||
|
```
|
||||||
|
|
||||||
|
## Plugins, Scripts, and Config
|
||||||
|
|
||||||
|
```text
|
||||||
|
Plugins enabled:
|
||||||
|
Scripts loaded:
|
||||||
|
Theme/custom CSS:
|
||||||
|
Custom config changes:
|
||||||
|
Does the bug still happen with a clean config? yes / no / untested
|
||||||
|
```
|
||||||
|
|
||||||
|
## Logs / Terminal Output
|
||||||
|
|
||||||
|
Paste relevant output below.
|
||||||
|
|
||||||
|
```text
|
||||||
|
```
|
||||||
|
|
||||||
|
## Raw IRC Lines, If Relevant
|
||||||
|
|
||||||
|
Remove passwords, tokens, IPs, private channels, private messages, certs, and account details before posting.
|
||||||
|
|
||||||
|
```text
|
||||||
|
```
|
||||||
|
|
||||||
|
## Crash Details, If Relevant
|
||||||
|
|
||||||
|
```text
|
||||||
|
Did ZoiteChat crash? yes / no
|
||||||
|
Crash reporter output:
|
||||||
|
Backtrace:
|
||||||
|
Core dump available: yes / no
|
||||||
|
```
|
||||||
|
|
||||||
|
## Screenshots
|
||||||
|
|
||||||
|
Attach screenshots or screen recordings if the issue is visual.
|
||||||
|
|
||||||
|
## Regression Check
|
||||||
|
|
||||||
|
```text
|
||||||
|
Did this work in an older version? yes / no / unknown
|
||||||
|
Last known working version:
|
||||||
|
First broken version:
|
||||||
|
```
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
* [ ] I searched existing issues first.
|
||||||
|
* [ ] I tested with the latest ZoiteChat version available to me.
|
||||||
|
* [ ] I included steps to reproduce the issue.
|
||||||
|
* [ ] I removed private information from logs and raw IRC lines.
|
||||||
|
* [ ] I included system and network details where relevant.
|
||||||
|
|
||||||
|
## Extra Notes
|
||||||
|
|
||||||
|
```text
|
||||||
|
Anything else that might help.
|
||||||
|
```
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an improvement for ZoiteChat
|
||||||
|
title: "[Feature]: "
|
||||||
|
labels: enhancement
|
||||||
|
assignees: ""
|
||||||
|
---
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
```text
|
||||||
|
Describe the feature or enhancement clearly and briefly.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Problem
|
||||||
|
|
||||||
|
```text
|
||||||
|
What problem would this solve?
|
||||||
|
```
|
||||||
|
|
||||||
|
## Proposed Solution
|
||||||
|
|
||||||
|
```text
|
||||||
|
How should ZoiteChat behave?
|
||||||
|
```
|
||||||
|
|
||||||
|
## Alternatives Considered
|
||||||
|
|
||||||
|
```text
|
||||||
|
Other approaches or workarounds you considered.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use Case
|
||||||
|
|
||||||
|
```text
|
||||||
|
Who benefits from this, and when would they use it?
|
||||||
|
```
|
||||||
|
|
||||||
|
## Platform Details
|
||||||
|
|
||||||
|
```text
|
||||||
|
OS:
|
||||||
|
ZoiteChat version:
|
||||||
|
Build/source: GitHub release / Fedora package / source build / Windows installer / other
|
||||||
|
```
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
* [ ] I searched existing issues first.
|
||||||
|
* [ ] I checked whether this already exists in the latest ZoiteChat version available to me.
|
||||||
|
* [ ] I explained the problem this would solve.
|
||||||
|
|
||||||
|
## Extra Notes
|
||||||
|
|
||||||
|
```text
|
||||||
|
Anything else that might help.
|
||||||
|
```
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
|
||||||
|
version: 2
|
||||||
|
|
||||||
|
updates:
|
||||||
|
# Flatpak shared modules
|
||||||
|
- package-ecosystem: "gitsubmodule"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
||||||
|
day: "monday"
|
||||||
|
open-pull-requests-limit: 2
|
||||||
|
labels:
|
||||||
|
- "dependencies"
|
||||||
|
|
||||||
|
# GitHub Actions dependencies
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
||||||
|
day: "monday"
|
||||||
|
open-pull-requests-limit: 3
|
||||||
|
labels:
|
||||||
|
- "dependencies"
|
||||||
|
|
||||||
|
commit-message:
|
||||||
|
prefix: "ci"
|
||||||
|
|
||||||
|
cooldown:
|
||||||
|
default-days: 7
|
||||||
|
|
||||||
|
groups:
|
||||||
|
actions-minor-patch:
|
||||||
|
patterns:
|
||||||
|
- "*"
|
||||||
|
update-types:
|
||||||
|
- "minor"
|
||||||
|
- "patch"
|
||||||
@@ -0,0 +1,319 @@
|
|||||||
|
name: AppImage Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [master, 'release/**']
|
||||||
|
pull_request:
|
||||||
|
branches: [master]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
appimage_build:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
attestations: write
|
||||||
|
artifact-metadata: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
|
||||||
|
- name: Install build dependencies
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y --no-install-recommends \
|
||||||
|
build-essential pkg-config meson ninja-build cmake \
|
||||||
|
gettext \
|
||||||
|
libcanberra-dev libglib2.0-dev \
|
||||||
|
libarchive-dev \
|
||||||
|
libgtk-3-dev libfontconfig1-dev libpango1.0-dev xvfb xauth dbus-daemon at-spi2-core \
|
||||||
|
libwayland-client0 libwayland-cursor0 libwayland-egl1 \
|
||||||
|
libxkbcommon0 \
|
||||||
|
libgtk-3-bin libglib2.0-bin glib-networking shared-mime-info gsettings-desktop-schemas \
|
||||||
|
liblua5.4-dev libpci-dev libperl-dev libssl-dev libayatana-appindicator3-dev \
|
||||||
|
perl python3 python3-minimal python3-dev python3-cffi python3-sphinx mono-devel desktop-file-utils \
|
||||||
|
breeze-gtk-theme \
|
||||||
|
patchelf file curl
|
||||||
|
|
||||||
|
- name: Configure
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
rm -rf build
|
||||||
|
meson setup build \
|
||||||
|
--prefix=/usr \
|
||||||
|
-Dinstall-docs=true \
|
||||||
|
-Dtext-frontend=true \
|
||||||
|
-Dwith-perl=perl \
|
||||||
|
-Dwith-python=python3 \
|
||||||
|
-Dauto_features=enabled \
|
||||||
|
-Dappindicator=enabled
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
ninja -C build
|
||||||
|
|
||||||
|
- name: Test emoji catalog, font coverage and picker
|
||||||
|
run: xvfb-run -a dbus-run-session -- meson test -C build --print-errorlogs "Emoji Data Tests" "Emoji Font Tests" "Emoji UI Tests"
|
||||||
|
|
||||||
|
- name: Install to AppDir
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
rm -rf AppDir
|
||||||
|
DESTDIR="${PWD}/AppDir" ninja -C build install
|
||||||
|
|
||||||
|
- name: Bundle scripting runtimes in AppDir
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
|
||||||
|
python3_version="$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')"
|
||||||
|
|
||||||
|
install -Dm755 "$(command -v python3)" "AppDir/usr/bin/python3"
|
||||||
|
if [ -x "/usr/bin/perl" ]; then
|
||||||
|
install -Dm755 /usr/bin/perl AppDir/usr/bin/perl
|
||||||
|
fi
|
||||||
|
|
||||||
|
install -d AppDir/usr/lib
|
||||||
|
cp -a "/usr/lib/python${python3_version}" "AppDir/usr/lib/"
|
||||||
|
|
||||||
|
if [ -d "/usr/lib/python3/dist-packages" ]; then
|
||||||
|
install -d AppDir/usr/lib/python3
|
||||||
|
cp -a /usr/lib/python3/dist-packages AppDir/usr/lib/python3/
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "/usr/lib/x86_64-linux-gnu/python3/dist-packages" ]; then
|
||||||
|
install -d AppDir/usr/lib/x86_64-linux-gnu/python3
|
||||||
|
cp -a /usr/lib/x86_64-linux-gnu/python3/dist-packages AppDir/usr/lib/x86_64-linux-gnu/python3/
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "/usr/lib/x86_64-linux-gnu/perl-base" ]; then
|
||||||
|
install -d AppDir/usr/lib/x86_64-linux-gnu
|
||||||
|
cp -a /usr/lib/x86_64-linux-gnu/perl-base AppDir/usr/lib/x86_64-linux-gnu/
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "/usr/lib/x86_64-linux-gnu/perl" ]; then
|
||||||
|
install -d AppDir/usr/lib/x86_64-linux-gnu
|
||||||
|
cp -a /usr/lib/x86_64-linux-gnu/perl AppDir/usr/lib/x86_64-linux-gnu/
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "/usr/lib/x86_64-linux-gnu/perl5" ]; then
|
||||||
|
install -d AppDir/usr/lib/x86_64-linux-gnu
|
||||||
|
cp -a /usr/lib/x86_64-linux-gnu/perl5 AppDir/usr/lib/x86_64-linux-gnu/
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "/usr/share/perl" ]; then
|
||||||
|
install -d AppDir/usr/share
|
||||||
|
cp -a /usr/share/perl AppDir/usr/share/
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "/usr/share/perl5" ]; then
|
||||||
|
install -d AppDir/usr/share
|
||||||
|
cp -a /usr/share/perl5 AppDir/usr/share/
|
||||||
|
fi
|
||||||
|
|
||||||
|
perl -MFile::Spec -e 'print "Build host File::Spec: $INC{\"File/Spec.pm\"}\n"'
|
||||||
|
find AppDir/usr -path '*/File/Spec.pm' -print -quit | grep -q .
|
||||||
|
|
||||||
|
if compgen -G '/usr/lib/x86_64-linux-gnu/libpython3*.so*' > /dev/null; then
|
||||||
|
install -d AppDir/usr/lib/x86_64-linux-gnu
|
||||||
|
cp -a /usr/lib/x86_64-linux-gnu/libpython3*.so* AppDir/usr/lib/x86_64-linux-gnu/
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Every package ships the pinned font, including portable builds.
|
||||||
|
cmp data/fonts/NotoColorEmoji.ttf AppDir/usr/share/fonts/zoitechat/NotoColorEmoji.ttf
|
||||||
|
|
||||||
|
if [ -d "/usr/lib/x86_64-linux-gnu/gtk-3.0/modules" ]; then
|
||||||
|
install -d AppDir/usr/lib/x86_64-linux-gnu/gtk-3.0
|
||||||
|
cp -a /usr/lib/x86_64-linux-gnu/gtk-3.0/modules AppDir/usr/lib/x86_64-linux-gnu/gtk-3.0/
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "/usr/lib/gtk-3.0/modules" ]; then
|
||||||
|
install -d AppDir/usr/lib/gtk-3.0
|
||||||
|
cp -a /usr/lib/gtk-3.0/modules AppDir/usr/lib/gtk-3.0/
|
||||||
|
fi
|
||||||
|
|
||||||
|
# HTTPS inline-image downloads use GSocketClient TLS on Linux.
|
||||||
|
# GLib provides the API, but TLS and system-proxy support live in
|
||||||
|
# loadable GIO modules shipped by glib-networking. Bundle those
|
||||||
|
# modules so the AppImage does not depend on the host copy.
|
||||||
|
gio_module_dir="$(pkg-config --variable=giomoduledir gio-2.0)"
|
||||||
|
|
||||||
|
test -n "$gio_module_dir"
|
||||||
|
test -f "${gio_module_dir}/libgiognutls.so"
|
||||||
|
install -d "AppDir${gio_module_dir}"
|
||||||
|
cp -a "${gio_module_dir}"/libgio*.so "AppDir${gio_module_dir}/"
|
||||||
|
gio-querymodules "AppDir${gio_module_dir}"
|
||||||
|
test -f "AppDir${gio_module_dir}/libgiognutls.so"
|
||||||
|
test -s "AppDir${gio_module_dir}/giomodule.cache"
|
||||||
|
|
||||||
|
- name: Verify bundled plugins
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
|
||||||
|
# Include every built-in plugin except the Windows-only update plugin.
|
||||||
|
find AppDir/usr/lib -maxdepth 4 -type f -name '*.so' -path '*/zoitechat/plugins/*' -print | sort
|
||||||
|
|
||||||
|
for plugin in checksum fishlim lua perl python sysinfo; do
|
||||||
|
find "AppDir/usr/lib" -maxdepth 4 -type f -name "${plugin}.so" -path '*/zoitechat/plugins/*' -print -quit | grep -q .
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: Build AppImage
|
||||||
|
env:
|
||||||
|
APPIMAGE_EXTRACT_AND_RUN: 1
|
||||||
|
DEPLOY_GTK_VERSION: 3
|
||||||
|
LDAI_NO_APPSTREAM: 1
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
|
||||||
|
curl -fL --retry 3 -o linuxdeploy-x86_64.AppImage \
|
||||||
|
https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
|
||||||
|
chmod +x linuxdeploy-x86_64.AppImage
|
||||||
|
|
||||||
|
curl -fL --retry 3 -o linuxdeploy-plugin-gtk \
|
||||||
|
https://raw.githubusercontent.com/linuxdeploy/linuxdeploy-plugin-gtk/master/linuxdeploy-plugin-gtk.sh
|
||||||
|
chmod +x linuxdeploy-plugin-gtk
|
||||||
|
export PATH="${PWD}:${PATH}"
|
||||||
|
|
||||||
|
install -Dm644 /etc/ssl/certs/ca-certificates.crt \
|
||||||
|
AppDir/etc/ssl/certs/ca-certificates.crt
|
||||||
|
|
||||||
|
cat > AppRun <<'EOF'
|
||||||
|
#!/bin/sh
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
APPDIR="${APPDIR:-$(dirname "$(readlink -f "$0")")}"
|
||||||
|
|
||||||
|
export PATH="$APPDIR/usr/bin:${PATH:-/usr/bin:/bin}"
|
||||||
|
export LD_LIBRARY_PATH="$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH:-}"
|
||||||
|
export XDG_DATA_DIRS="$APPDIR/usr/share:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
|
||||||
|
export GTK_EXE_PREFIX="$APPDIR/usr"
|
||||||
|
export GTK_DATA_PREFIX="$APPDIR/usr"
|
||||||
|
gtk_path_entries=""
|
||||||
|
if [ -d "$APPDIR/usr/lib/x86_64-linux-gnu/gtk-3.0" ]; then
|
||||||
|
gtk_path_entries="$APPDIR/usr/lib/x86_64-linux-gnu/gtk-3.0"
|
||||||
|
fi
|
||||||
|
if [ -d "$APPDIR/usr/lib/gtk-3.0" ]; then
|
||||||
|
gtk_path_entries="${gtk_path_entries:+$gtk_path_entries:}$APPDIR/usr/lib/gtk-3.0"
|
||||||
|
fi
|
||||||
|
if [ -n "$gtk_path_entries" ]; then
|
||||||
|
export GTK_PATH="$gtk_path_entries${GTK_PATH:+:$GTK_PATH}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "$APPDIR/usr/lib/x86_64-linux-gnu/zoitechat/plugins" ]; then
|
||||||
|
export ZOITECHAT_LIBDIR="$APPDIR/usr/lib/x86_64-linux-gnu/zoitechat/plugins"
|
||||||
|
elif [ -d "$APPDIR/usr/lib/zoitechat/plugins" ]; then
|
||||||
|
export ZOITECHAT_LIBDIR="$APPDIR/usr/lib/zoitechat/plugins"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "$APPDIR/usr/share/glib-2.0/schemas" ]; then
|
||||||
|
export GSETTINGS_SCHEMA_DIR="$APPDIR/usr/share/glib-2.0/schemas${GSETTINGS_SCHEMA_DIR:+:$GSETTINGS_SCHEMA_DIR}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "$APPDIR/usr/lib/x86_64-linux-gnu/gio/modules" ]; then
|
||||||
|
gio_module_dir="$APPDIR/usr/lib/x86_64-linux-gnu/gio/modules"
|
||||||
|
elif [ -d "$APPDIR/usr/lib/gio/modules" ]; then
|
||||||
|
gio_module_dir="$APPDIR/usr/lib/gio/modules"
|
||||||
|
else
|
||||||
|
gio_module_dir=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$gio_module_dir" ]; then
|
||||||
|
export GIO_MODULE_DIR="$gio_module_dir"
|
||||||
|
export GIO_EXTRA_MODULES="$gio_module_dir"
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset GTK_MODULES
|
||||||
|
|
||||||
|
perl5lib_entries=""
|
||||||
|
for dir in \
|
||||||
|
"$APPDIR/usr/lib/x86_64-linux-gnu/perl-base" \
|
||||||
|
"$APPDIR/usr/lib/x86_64-linux-gnu/perl"/* \
|
||||||
|
"$APPDIR/usr/lib/x86_64-linux-gnu/perl5"/* \
|
||||||
|
"$APPDIR/usr/share/perl"/* \
|
||||||
|
"$APPDIR/usr/share/perl5"
|
||||||
|
do
|
||||||
|
if [ -d "$dir" ]; then
|
||||||
|
perl5lib_entries="${perl5lib_entries:+$perl5lib_entries:}$dir"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -n "$perl5lib_entries" ]; then
|
||||||
|
export PERL5LIB="$perl5lib_entries${PERL5LIB:+:$PERL5LIB}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
export PYTHONHOME="$APPDIR/usr"
|
||||||
|
python_stdlib_dir="$(find "$APPDIR/usr/lib" -maxdepth 1 -type d -name 'python3.*' | head -n 1 || true)"
|
||||||
|
pythonpath_entries=""
|
||||||
|
if [ -n "$python_stdlib_dir" ] && [ -d "$python_stdlib_dir/dist-packages" ]; then
|
||||||
|
pythonpath_entries="$python_stdlib_dir/dist-packages"
|
||||||
|
fi
|
||||||
|
if [ -d "$APPDIR/usr/lib/python3/dist-packages" ]; then
|
||||||
|
pythonpath_entries="${pythonpath_entries:+$pythonpath_entries:}$APPDIR/usr/lib/python3/dist-packages"
|
||||||
|
fi
|
||||||
|
if [ -d "$APPDIR/usr/lib/x86_64-linux-gnu/python3/dist-packages" ]; then
|
||||||
|
pythonpath_entries="${pythonpath_entries:+$pythonpath_entries:}$APPDIR/usr/lib/x86_64-linux-gnu/python3/dist-packages"
|
||||||
|
fi
|
||||||
|
if [ -n "$pythonpath_entries" ]; then
|
||||||
|
export PYTHONPATH="$pythonpath_entries${PYTHONPATH:+:$PYTHONPATH}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Register the private font without hiding the host's normal fonts.
|
||||||
|
export ZOITECHAT_EMOJI_FONT="${ZOITECHAT_EMOJI_FONT:-$APPDIR/usr/share/fonts/zoitechat/NotoColorEmoji.ttf}"
|
||||||
|
|
||||||
|
# OpenSSL trust store override
|
||||||
|
export SSL_CERT_FILE="${SSL_CERT_FILE:-$APPDIR/etc/ssl/certs/ca-certificates.crt}"
|
||||||
|
export SSL_CERT_DIR="${SSL_CERT_DIR:-$APPDIR/etc/ssl/certs}"
|
||||||
|
export CURL_CA_BUNDLE="${CURL_CA_BUNDLE:-$SSL_CERT_FILE}"
|
||||||
|
|
||||||
|
# Prefer Wayland if the session provides it, but keep X11 fallback.
|
||||||
|
# Don't override if the user already set GDK_BACKEND explicitly.
|
||||||
|
if [ -z "${GDK_BACKEND:-}" ]; then
|
||||||
|
if [ -n "${WAYLAND_DISPLAY:-}" ] || [ "${XDG_SESSION_TYPE:-}" = "wayland" ]; then
|
||||||
|
export GDK_BACKEND="wayland,x11"
|
||||||
|
else
|
||||||
|
export GDK_BACKEND="x11"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
for hook_dir in "$APPDIR/apprun-hooks" "$APPDIR/usr/apprun-hooks"; do
|
||||||
|
if [ -d "$hook_dir" ]; then
|
||||||
|
for hook in "$hook_dir"/*.sh; do
|
||||||
|
if [ -f "$hook" ]; then
|
||||||
|
. "$hook"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
exec "$APPDIR/usr/bin/zoitechat" "$@"
|
||||||
|
EOF
|
||||||
|
chmod +x AppRun
|
||||||
|
|
||||||
|
VERSION="$(git describe --tags --always)"
|
||||||
|
|
||||||
|
./linuxdeploy-x86_64.AppImage \
|
||||||
|
--appdir AppDir \
|
||||||
|
--desktop-file AppDir/usr/share/applications/net.zoite.Zoitechat.desktop \
|
||||||
|
--icon-file AppDir/usr/share/icons/hicolor/48x48/apps/net.zoite.Zoitechat.png \
|
||||||
|
--custom-apprun ./AppRun \
|
||||||
|
--plugin gtk \
|
||||||
|
--output appimage
|
||||||
|
|
||||||
|
appimage_path="$(ls -1 *.AppImage | grep -v linuxdeploy | head -n 1)"
|
||||||
|
mv "$appimage_path" "Zoitechat-${VERSION}-x86_64.AppImage"
|
||||||
|
|
||||||
|
- name: Attest AppImage (Build Provenance)
|
||||||
|
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
|
||||||
|
uses: actions/attest-build-provenance@v3
|
||||||
|
with:
|
||||||
|
subject-path: Zoitechat-*-x86_64.AppImage
|
||||||
|
|
||||||
|
- name: Upload AppImage artifact
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: zoitechat-appimage
|
||||||
|
path: Zoitechat-*-x86_64.AppImage
|
||||||
@@ -1,24 +1,51 @@
|
|||||||
name: Flatpak Build
|
name: Flatpak Build
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches: [master, 'release/**']
|
||||||
- master
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches: [master]
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
flatpak_build:
|
flatpak_build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
|
||||||
image: bilelmoussaoui/flatpak-github-actions:gnome-40
|
|
||||||
options: --privileged
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
|
|
||||||
- uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v3
|
permissions:
|
||||||
with:
|
contents: read
|
||||||
bundle: zoitechat.flatpak
|
id-token: write
|
||||||
manifest-path: flatpak/io.github.Zoitechat.json
|
attestations: write
|
||||||
|
artifact-metadata: write
|
||||||
|
|
||||||
|
container:
|
||||||
|
image: ghcr.io/flathub-infra/flatpak-github-actions:gnome-49
|
||||||
|
options: --privileged
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
|
||||||
|
- name: Generate PSL list
|
||||||
|
run: curl -fsSL https://publicsuffix.org/list/public_suffix_list.dat -o src/common/public_suffix_list.dat
|
||||||
|
|
||||||
|
- name: Build Flatpak
|
||||||
|
id: flatpak_builder
|
||||||
|
uses: flatpak/flatpak-github-actions/flatpak-builder@v6
|
||||||
|
with:
|
||||||
|
bundle: zoitechat.flatpak
|
||||||
|
manifest-path: flatpak/net.zoite.Zoitechat.json
|
||||||
|
cache: false
|
||||||
|
restore-cache: false
|
||||||
|
|
||||||
|
- name: Upload Flatpak Bundle
|
||||||
|
id: upload_flatpak
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: zoitechat.flatpak
|
||||||
|
path: zoitechat.flatpak
|
||||||
|
|
||||||
|
- name: Attest Flatpak Bundle (Build Provenance)
|
||||||
|
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
|
||||||
|
uses: actions/attest-build-provenance@v3
|
||||||
|
with:
|
||||||
|
subject-path: zoitechat.flatpak
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
name: macOS build
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
sign_and_notarize:
|
||||||
|
description: 'Sign with Developer ID and notarize using release credentials'
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
push:
|
||||||
|
branches: [master]
|
||||||
|
tags: ['v*']
|
||||||
|
paths:
|
||||||
|
- 'src/**'
|
||||||
|
- 'plugins/**'
|
||||||
|
- 'data/**'
|
||||||
|
- 'tools/**'
|
||||||
|
- 'po/**'
|
||||||
|
- 'meson*'
|
||||||
|
- 'VERSION'
|
||||||
|
- 'packaging/macos/**'
|
||||||
|
- '.github/workflows/macos-build.yml'
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'src/**'
|
||||||
|
- 'plugins/**'
|
||||||
|
- 'data/**'
|
||||||
|
- 'tools/**'
|
||||||
|
- 'po/**'
|
||||||
|
- 'meson*'
|
||||||
|
- 'VERSION'
|
||||||
|
- 'packaging/macos/**'
|
||||||
|
- '.github/workflows/macos-build.yml'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
if: >-
|
||||||
|
github.event_name == 'pull_request' ||
|
||||||
|
(github.event_name == 'push' && !startsWith(github.ref, 'refs/tags/')) ||
|
||||||
|
(github.event_name == 'workflow_dispatch' && !inputs.sign_and_notarize)
|
||||||
|
name: Native ${{ matrix.arch }} bundle
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- runner: macos-15
|
||||||
|
arch: arm64
|
||||||
|
- runner: macos-15-intel
|
||||||
|
arch: x86_64
|
||||||
|
runs-on: ${{ matrix.runner }}
|
||||||
|
timeout-minutes: 90
|
||||||
|
env:
|
||||||
|
HOMEBREW_NO_AUTO_UPDATE: '1'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
|
- name: Install native dependencies
|
||||||
|
run: brew bundle --file packaging/macos/Brewfile
|
||||||
|
- name: Test packaging logic
|
||||||
|
run: python3 -m unittest discover -s packaging/macos/tests -v
|
||||||
|
- name: Build and test application
|
||||||
|
run: python3 packaging/macos/build.py --build-number '${{ github.run_number }}'
|
||||||
|
- name: Verify relocated startup
|
||||||
|
run: python3 packaging/macos/smoke.py dist/ZoiteChat.app
|
||||||
|
# Desktop capture can be unavailable on a runner image. Preserve the
|
||||||
|
# existing build gate and publish the separate visual-check outcome.
|
||||||
|
- name: Exercise IRC and capture the macOS application window
|
||||||
|
continue-on-error: true
|
||||||
|
timeout-minutes: 5
|
||||||
|
run: python3 packaging/macos/visual-smoke.py dist/ZoiteChat.app
|
||||||
|
- name: Upload screenshot and visual-check evidence
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
|
||||||
|
with:
|
||||||
|
name: ZoiteChat-macos-${{ matrix.arch }}-visual-check
|
||||||
|
path: dist/visual-check/
|
||||||
|
if-no-files-found: ignore
|
||||||
|
retention-days: 14
|
||||||
|
- name: Create artifact preserving the application signature
|
||||||
|
run: ditto -c -k --keepParent dist/ZoiteChat.app dist/ZoiteChat-${{ matrix.arch }}.zip
|
||||||
|
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
|
||||||
|
with:
|
||||||
|
name: ZoiteChat-macos-${{ matrix.arch }}
|
||||||
|
path: dist/ZoiteChat-${{ matrix.arch }}.zip
|
||||||
|
if-no-files-found: error
|
||||||
|
- name: Upload build logs on failure
|
||||||
|
if: failure()
|
||||||
|
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
|
||||||
|
with:
|
||||||
|
name: ZoiteChat-macos-${{ matrix.arch }}-logs
|
||||||
|
path: build-macos/meson-logs/
|
||||||
|
if-no-files-found: ignore
|
||||||
|
|
||||||
|
release:
|
||||||
|
name: Signed and notarized ${{ matrix.arch }} release
|
||||||
|
if: >-
|
||||||
|
(github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')) ||
|
||||||
|
(github.event_name == 'workflow_dispatch' && inputs.sign_and_notarize && github.ref == 'refs/heads/master')
|
||||||
|
environment: macos-release
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- runner: macos-15
|
||||||
|
arch: arm64
|
||||||
|
- runner: macos-15-intel
|
||||||
|
arch: x86_64
|
||||||
|
runs-on: ${{ matrix.runner }}
|
||||||
|
timeout-minutes: 180
|
||||||
|
env:
|
||||||
|
HOMEBREW_NO_AUTO_UPDATE: '1'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
- name: Validate release settings before building
|
||||||
|
env:
|
||||||
|
MACOS_CERTIFICATE_P12_BASE64: ${{ secrets.MACOS_CERTIFICATE_P12_BASE64 }}
|
||||||
|
MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }}
|
||||||
|
MACOS_SIGNING_IDENTITY: ${{ vars.MACOS_SIGNING_IDENTITY || secrets.MACOS_SIGNING_IDENTITY }}
|
||||||
|
APPLE_API_KEY_P8: ${{ secrets.APPLE_API_KEY_P8 }}
|
||||||
|
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
|
||||||
|
APPLE_API_ISSUER_ID: ${{ secrets.APPLE_API_ISSUER_ID }}
|
||||||
|
run: python3 packaging/macos/release.py --check-config
|
||||||
|
- name: Install native dependencies
|
||||||
|
run: brew bundle --file packaging/macos/Brewfile
|
||||||
|
- name: Test packaging and release logic
|
||||||
|
run: python3 -m unittest discover -s packaging/macos/tests -v
|
||||||
|
- name: Build and test application
|
||||||
|
run: python3 packaging/macos/build.py --build-number '${{ github.run_number }}'
|
||||||
|
- name: Verify relocated startup
|
||||||
|
run: python3 packaging/macos/smoke.py dist/ZoiteChat.app
|
||||||
|
- name: Sign, notarize, staple and verify release
|
||||||
|
env:
|
||||||
|
MACOS_CERTIFICATE_P12_BASE64: ${{ secrets.MACOS_CERTIFICATE_P12_BASE64 }}
|
||||||
|
MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }}
|
||||||
|
MACOS_SIGNING_IDENTITY: ${{ vars.MACOS_SIGNING_IDENTITY || secrets.MACOS_SIGNING_IDENTITY }}
|
||||||
|
APPLE_API_KEY_P8: ${{ secrets.APPLE_API_KEY_P8 }}
|
||||||
|
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
|
||||||
|
APPLE_API_ISSUER_ID: ${{ secrets.APPLE_API_ISSUER_ID }}
|
||||||
|
run: >-
|
||||||
|
python3 packaging/macos/release.py
|
||||||
|
--app dist/ZoiteChat.app
|
||||||
|
--output dist/ZoiteChat-${{ matrix.arch }}-signed-notarized.zip
|
||||||
|
--diagnostics dist/notarization
|
||||||
|
--notary-timeout 60m
|
||||||
|
- name: Upload signed and notarized application
|
||||||
|
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
|
||||||
|
with:
|
||||||
|
name: ZoiteChat-macos-${{ matrix.arch }}-signed-notarized
|
||||||
|
path: dist/ZoiteChat-${{ matrix.arch }}-signed-notarized.zip
|
||||||
|
if-no-files-found: error
|
||||||
|
- name: Upload notarization diagnostics
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
|
||||||
|
with:
|
||||||
|
name: ZoiteChat-macos-${{ matrix.arch }}-notarization-log
|
||||||
|
path: dist/notarization/*.json
|
||||||
|
if-no-files-found: ignore
|
||||||
|
- name: Upload build logs on failure
|
||||||
|
if: failure()
|
||||||
|
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
|
||||||
|
with:
|
||||||
|
name: ZoiteChat-macos-${{ matrix.arch }}-release-build-logs
|
||||||
|
path: build-macos/meson-logs/
|
||||||
|
if-no-files-found: ignore
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
name: MSYS2 Build
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
msys2_build:
|
|
||||||
runs-on: windows-latest
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: msys2 {0}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- uses: msys2/setup-msys2@v2
|
|
||||||
with:
|
|
||||||
install: >-
|
|
||||||
mingw-w64-x86_64-gcc
|
|
||||||
mingw-w64-x86_64-pkg-config
|
|
||||||
mingw-w64-x86_64-python3-cffi
|
|
||||||
mingw-w64-x86_64-meson
|
|
||||||
mingw-w64-x86_64-gtk2
|
|
||||||
mingw-w64-x86_64-gtk-update-icon-cache
|
|
||||||
mingw-w64-x86_64-luajit
|
|
||||||
mingw-w64-x86_64-desktop-file-utils
|
|
||||||
|
|
||||||
- name: Configure
|
|
||||||
run: >-
|
|
||||||
meson build
|
|
||||||
-Dtext-frontend=true
|
|
||||||
-Ddbus=disabled
|
|
||||||
-Dwith-upd=false
|
|
||||||
-Dwith-perl=false
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: ninja -C build
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: ninja -C build test
|
|
||||||
|
|
||||||
- name: Install
|
|
||||||
run: ninja -C build install
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
name: Ubuntu Build
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
ubuntu_build:
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Install Dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y meson libcanberra-dev libdbus-glib-1-dev libglib2.0-dev libgtk2.0-dev libluajit-5.1-dev libpci-dev libperl-dev libssl-dev python3-dev python3-cffi mono-devel desktop-file-utils
|
|
||||||
|
|
||||||
- name: Configure
|
|
||||||
run: meson build -Dtext=true -Dtheme-manager=true -Dauto_features=enabled
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: ninja -C build
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: ninja -C build test
|
|
||||||
|
|
||||||
- name: Install
|
|
||||||
run: sudo ninja -C build install
|
|
||||||
@@ -1,75 +1,249 @@
|
|||||||
name: Windows Build
|
name: Windows Build
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
|
- 'release/**'
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
windows_build:
|
windows_build:
|
||||||
runs-on: windows-2019
|
runs-on: windows-2022
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
attestations: write
|
||||||
|
artifact-metadata: write
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
platform: [x64, win32]
|
platform: [x64]
|
||||||
arch: [x64, x86]
|
arch: [x64]
|
||||||
exclude:
|
|
||||||
- platform: x64
|
|
||||||
arch: x86
|
|
||||||
- platform: win32
|
|
||||||
arch: x64
|
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v7
|
||||||
|
with:
|
||||||
|
python-version: '3.14.3'
|
||||||
|
architecture: ${{ matrix.arch }}
|
||||||
|
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: |
|
run: |
|
||||||
New-Item -Name "deps" -ItemType "Directory"
|
New-Item -Name "deps" -ItemType "Directory" -Force | Out-Null
|
||||||
|
|
||||||
Invoke-WebRequest http://files.jrsoftware.org/is/5/innosetup-5.5.9-unicode.exe -OutFile deps\innosetup-unicode.exe
|
python -m pip install --upgrade pip
|
||||||
|
python -m pip install cffi
|
||||||
|
python -m pip install zstandard
|
||||||
|
|
||||||
|
$ProgressPreference = 'SilentlyContinue'
|
||||||
|
function Download-WithRetry {
|
||||||
|
param(
|
||||||
|
[string]$Url,
|
||||||
|
[string]$OutFile,
|
||||||
|
[int]$MaxAttempts = 5,
|
||||||
|
[int]$InitialDelaySeconds = 2
|
||||||
|
)
|
||||||
|
for ($attempt = 1; $attempt -le $MaxAttempts; $attempt++) {
|
||||||
|
try {
|
||||||
|
Invoke-WebRequest -Uri $Url -OutFile $OutFile -ErrorAction Stop
|
||||||
|
return
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
if ($attempt -eq $MaxAttempts) {
|
||||||
|
throw
|
||||||
|
}
|
||||||
|
Start-Sleep -Seconds ($InitialDelaySeconds * [math]::Pow(2, $attempt - 1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Download-WithRetry -Url https://github.com/jrsoftware/issrc/releases/download/is-6_7_1/innosetup-6.7.1.exe -OutFile deps\innosetup-unicode.exe
|
||||||
& deps\innosetup-unicode.exe /VERYSILENT | Out-Null
|
& deps\innosetup-unicode.exe /VERYSILENT | Out-Null
|
||||||
|
|
||||||
Invoke-WebRequest https://github.com/zoitechat/gvsbuild/releases/download/zoitechat-2.17.0/idpsetup-1.5.1.exe -OutFile deps\idpsetup.exe
|
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.20.0-alpha.1/GTK3_Gvsbuild_zoitechat-2.20.0-alpha.1_x64.zip -OutFile deps\gtk-${{ matrix.arch }}.zip
|
||||||
& deps\idpsetup.exe /VERYSILENT
|
Expand-Archive -LiteralPath deps\gtk-${{ matrix.arch }}.zip -DestinationPath C:\gtk-build\gtk\x64\release -Force
|
||||||
|
|
||||||
Invoke-WebRequest https://github.com/zoitechat/gvsbuild/releases/download/zoitechat-2.17.0/gtk-${{ matrix.platform }}-2018-08-29-openssl1.1.7z -OutFile deps\gtk-${{ matrix.arch }}.7z
|
# The GTK3 archive omits librsvg. Add only its renderer, loader and
|
||||||
& 7z.exe x deps\gtk-${{ matrix.arch }}.7z -oC:\gtk-build\gtk
|
# license from the companion release, keeping the GTK3 DLLs intact.
|
||||||
|
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.20.0-alpha.1/GTK4_Gvsbuild_zoitechat-2.20.0-alpha.1_x64.zip -OutFile deps\svg-runtime.zip
|
||||||
|
if ((Get-FileHash deps\svg-runtime.zip -Algorithm SHA256).Hash -ne 'fb657f9ebae3a6807defb15e66091d643a703ee66cb37488e3e11e5646f45adb') {
|
||||||
|
throw 'Unexpected SVG runtime archive checksum'
|
||||||
|
}
|
||||||
|
$svgArchive = [System.IO.Compression.ZipFile]::OpenRead((Resolve-Path deps\svg-runtime.zip))
|
||||||
|
try {
|
||||||
|
foreach ($name in @('bin/rsvg-2-2.dll', 'lib/gdk-pixbuf-2.0/2.10.0/loaders/pixbufloader_svg.dll', 'share/doc/librsvg/COPYING.LIB')) {
|
||||||
|
$entry = $svgArchive.GetEntry($name)
|
||||||
|
if ($null -eq $entry) { throw "Missing SVG runtime file: $name" }
|
||||||
|
$destination = Join-Path 'C:\gtk-build\gtk\x64\release' $name
|
||||||
|
New-Item -ItemType Directory -Path (Split-Path $destination) -Force | Out-Null
|
||||||
|
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $destination, $true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally { $svgArchive.Dispose() }
|
||||||
|
# This loads the module now, catching missing DLLs before the build.
|
||||||
|
& C:\gtk-build\gtk\x64\release\bin\gdk-pixbuf-query-loaders.exe --update-cache
|
||||||
|
if ($LASTEXITCODE -ne 0) { throw 'Could not generate the pixbuf loader cache' }
|
||||||
|
if (-not (Select-String -LiteralPath 'C:\gtk-build\gtk\x64\release\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache' -SimpleMatch '"svg"')) {
|
||||||
|
throw 'SVG loader could not be loaded with the GTK3 runtime'
|
||||||
|
}
|
||||||
|
|
||||||
Invoke-WebRequest https://github.com/zoitechat/gvsbuild/releases/download/zoitechat-2.17.0/gendef-20111031.7z -OutFile deps\gendef.7z
|
Download-WithRetry -Url https://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-hicolor-icon-theme-0.18-1-any.pkg.tar.zst -OutFile deps\hicolor-icon-theme.pkg.tar.zst
|
||||||
|
python -c "import tarfile,zstandard,pathlib;archive=pathlib.Path(r'deps\\hicolor-icon-theme.pkg.tar.zst');target=pathlib.Path(r'C:\\gtk-build\\gtk\\x64\\release');dctx=zstandard.ZstdDecompressor();f=archive.open('rb');reader=dctx.stream_reader(f);tf=tarfile.open(fileobj=reader,mode='r|');[tf.extract(m,path=target) for m in tf if m.name.startswith('mingw64/share/icons/hicolor/')];tf.close();reader.close();f.close()"
|
||||||
|
|
||||||
|
Download-WithRetry -Url https://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-libarchive-3.8.6-1-any.pkg.tar.zst -OutFile deps\libarchive.pkg.tar.zst
|
||||||
|
python -c "import tarfile,zstandard,pathlib;archive=pathlib.Path(r'deps\\libarchive.pkg.tar.zst');target=pathlib.Path(r'C:\\gtk-build\\gtk\\x64\\release');dctx=zstandard.ZstdDecompressor();f=archive.open('rb');reader=dctx.stream_reader(f);tf=tarfile.open(fileobj=reader,mode='r|');[tf.extract(m,path=target) for m in tf if m.name.startswith(('mingw64/include/archive','mingw64/lib/libarchive','mingw64/bin/libarchive'))];tf.close();reader.close();f.close()"
|
||||||
|
|
||||||
|
if (Test-Path C:\gtk-build\gtk\x64\release\mingw64\share\icons\hicolor) {
|
||||||
|
New-Item -Path C:\gtk-build\gtk\x64\release\share\icons -ItemType Directory -Force | Out-Null
|
||||||
|
Copy-Item -Path C:\gtk-build\gtk\x64\release\mingw64\share\icons\hicolor -Destination C:\gtk-build\gtk\x64\release\share\icons\hicolor -Recurse -Force
|
||||||
|
}
|
||||||
|
if (Test-Path C:\gtk-build\gtk\x64\release\mingw64\include) {
|
||||||
|
New-Item -Path C:\gtk-build\gtk\x64\release\include -ItemType Directory -Force | Out-Null
|
||||||
|
Copy-Item -Path C:\gtk-build\gtk\x64\release\mingw64\include\archive* -Destination C:\gtk-build\gtk\x64\release\include -Recurse -Force
|
||||||
|
}
|
||||||
|
if (Test-Path C:\gtk-build\gtk\x64\release\mingw64\lib) {
|
||||||
|
New-Item -Path C:\gtk-build\gtk\x64\release\lib -ItemType Directory -Force | Out-Null
|
||||||
|
Copy-Item -Path C:\gtk-build\gtk\x64\release\mingw64\lib\libarchive* -Destination C:\gtk-build\gtk\x64\release\lib -Force
|
||||||
|
}
|
||||||
|
if (Test-Path C:\gtk-build\gtk\x64\release\mingw64\bin) {
|
||||||
|
New-Item -Path C:\gtk-build\gtk\x64\release\bin -ItemType Directory -Force | Out-Null
|
||||||
|
Copy-Item -Path C:\gtk-build\gtk\x64\release\mingw64\bin\libarchive*.dll -Destination C:\gtk-build\gtk\x64\release\bin -Force
|
||||||
|
}
|
||||||
|
if (Test-Path C:\gtk-build\gtk\x64\release\mingw64) {
|
||||||
|
Remove-Item -Path C:\gtk-build\gtk\x64\release\mingw64 -Recurse -Force
|
||||||
|
}
|
||||||
|
|
||||||
|
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.18.0-pre4/gendef20260315.7z -OutFile deps\gendef.7z
|
||||||
& 7z.exe x deps\gendef.7z -oC:\gtk-build
|
& 7z.exe x deps\gendef.7z -oC:\gtk-build
|
||||||
|
|
||||||
Invoke-WebRequest https://github.com/zoitechat/gvsbuild/releases/download/zoitechat-2.17.0/WinSparkle-20151011.7z -OutFile deps\WinSparkle.7z
|
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.18.0-pre4/WinSparkle-20260315.7z -OutFile deps\WinSparkle.7z
|
||||||
& 7z.exe x deps\WinSparkle.7z -oC:\gtk-build\WinSparkle
|
& 7z.exe x deps\WinSparkle.7z -oC:\gtk-build\WinSparkle
|
||||||
|
|
||||||
Invoke-WebRequest https://github.com/zoitechat/gvsbuild/releases/download/zoitechat-2.17.0/perl-5.20.0-${{ matrix.arch }}.7z -OutFile deps\perl-${{ matrix.arch }}.7z
|
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.18.0-pre4/perl-5.42.0.1-${{ matrix.arch }}.7z -OutFile deps\perl-${{ matrix.arch }}.7z
|
||||||
& 7z.exe x deps\perl-${{ matrix.arch }}.7z -oC:\gtk-build\perl-5.20\${{ matrix.platform }}
|
& 7z.exe x deps\perl-${{ matrix.arch }}.7z -oC:\gtk-build\perl-5.42.0.1\${{ matrix.platform }}
|
||||||
|
|
||||||
New-Item -Path "c:\gtk-build" -Name "python-3.8" -ItemType "Directory"
|
$pyRoot = $env:pythonLocation
|
||||||
New-Item -Path "c:\gtk-build\python-3.8" -Name "${{ matrix.platform }}" -ItemType "SymbolicLink" -Value "C:/hostedtoolcache/windows/Python/3.8.10/${{ matrix.arch }}"
|
if (-not $pyRoot) { $pyRoot = & python -c "import sys; print(sys.prefix)" }
|
||||||
|
|
||||||
C:/hostedtoolcache/windows/Python/3.8.10/${{ matrix.arch }}/python.exe -m pip install cffi
|
foreach ($pyDir in @("C:\gtk-build\python-3.14.3", "C:\gtk-build\python-3.14")) {
|
||||||
shell: powershell
|
New-Item -Path $pyDir -ItemType Directory -Force | Out-Null
|
||||||
|
$target = Join-Path $pyDir "${{ matrix.platform }}"
|
||||||
|
if (Test-Path $target) { Remove-Item $target -Recurse -Force }
|
||||||
|
New-Item -Path $pyDir -Name "${{ matrix.platform }}" -ItemType Junction -Value $pyRoot | Out-Null
|
||||||
|
}
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v7
|
||||||
|
with:
|
||||||
|
python-version: '3.8.10'
|
||||||
|
architecture: ${{ matrix.arch }}
|
||||||
|
|
||||||
|
- name: Prepare Python 3.8
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
python -m pip install cffi
|
||||||
|
|
||||||
|
$pyRoot = $env:pythonLocation
|
||||||
|
if (-not $pyRoot) { $pyRoot = & python -c "import sys; print(sys.prefix)" }
|
||||||
|
|
||||||
|
foreach ($pyDir in @("C:\gtk-build\python-3.8.10", "C:\gtk-build\python-3.8")) {
|
||||||
|
New-Item -Path $pyDir -ItemType Directory -Force | Out-Null
|
||||||
|
$target = Join-Path $pyDir "${{ matrix.platform }}"
|
||||||
|
if (Test-Path $target) { Remove-Item $target -Recurse -Force }
|
||||||
|
New-Item -Path $pyDir -Name "${{ matrix.platform }}" -ItemType Junction -Value $pyRoot | Out-Null
|
||||||
|
}
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\VsDevCmd.bat"
|
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
|
||||||
|
|
||||||
|
set "PYTHON_DIR=C:\gtk-build\python-3.14.3\${{ matrix.platform }}"
|
||||||
|
if not exist "%PYTHON_DIR%\libs\python314.lib" (
|
||||||
|
echo Missing %PYTHON_DIR%\libs\python314.lib
|
||||||
|
dir "%PYTHON_DIR%\libs"
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
set "PYTHON38_DIR=C:\gtk-build\python-3.8\${{ matrix.platform }}"
|
||||||
|
if not exist "%PYTHON38_DIR%\libs\python38.lib" (
|
||||||
|
echo Missing %PYTHON38_DIR%\libs\python38.lib
|
||||||
|
dir "%PYTHON38_DIR%\libs"
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
if not exist "%PYTHON38_DIR%\Lib\site-packages\_cffi_backend.cp38*.pyd" (
|
||||||
|
echo Missing %PYTHON38_DIR%\Lib\site-packages\_cffi_backend.cp38*.pyd
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
set "LIB=%PYTHON_DIR%\libs;%LIB%"
|
||||||
|
set "INCLUDE=%PYTHON_DIR%\include;%INCLUDE%"
|
||||||
|
|
||||||
|
powershell -NoProfile -ExecutionPolicy Bypass -Command "$archiveLib='C:\gtk-build\gtk\x64\release\lib\libarchive.lib'; if (-not (Test-Path $archiveLib)) { $archiveDll = Get-ChildItem 'C:\gtk-build\gtk\x64\release\bin\libarchive*.dll' | Select-Object -First 1; if ($archiveDll) { Push-Location 'C:\gtk-build\gtk\x64\release\lib'; & 'C:\gtk-build\gendef\gendef.exe' $archiveDll.FullName | Out-Null; $archiveDef = Get-ChildItem 'libarchive*.def' | Select-Object -First 1; if ($archiveDef) { & lib /def:$archiveDef.Name /machine:${{ matrix.platform }} /out:libarchive.lib | Out-Null }; Pop-Location } }"
|
||||||
|
|
||||||
msbuild win32\zoitechat.sln /m /verbosity:minimal /p:Configuration=Release /p:Platform=${{ matrix.platform }}
|
msbuild win32\zoitechat.sln /m /verbosity:minimal /p:Configuration=Release /p:Platform=${{ matrix.platform }}
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
|
||||||
|
if not exist "..\zoitechat-build\${{ matrix.platform }}\rel\plugins\hcpython38.dll" (
|
||||||
|
echo hcpython38.dll was not built
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
if not exist "..\zoitechat-build\${{ matrix.platform }}\rel\_cffi_backend.cp38*.pyd" (
|
||||||
|
echo _cffi_backend for Python 3.8 was not staged for the installer
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
shell: cmd
|
shell: cmd
|
||||||
|
|
||||||
|
- name: Test emoji catalog, font coverage and picker
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
|
||||||
|
set "PATH=%CD%\..\zoitechat-build\x64\rel;%PATH%"
|
||||||
|
set "GDK_PIXBUF_MODULE_FILE=%CD%\..\zoitechat-build\x64\rel\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache"
|
||||||
|
set "ZOITECHAT_EMOJI_FONT=%CD%\..\zoitechat-build\x64\rel\share\fonts\zoitechat\NotoColorEmoji.ttf"
|
||||||
|
fc /b data\fonts\NotoColorEmoji.ttf "%ZOITECHAT_EMOJI_FONT%"
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
for %%T in (data font ui) do (
|
||||||
|
msbuild win32\emoji-tests.vcxproj /m /verbosity:minimal /p:Configuration=Release /p:Platform=x64 /p:EmojiTestKind=%%T
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
..\zoitechat-build\x64\tests\emoji-%%T-tests.exe --tap
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
- name: Preparing Artifacts
|
- name: Preparing Artifacts
|
||||||
run: |
|
run: |
|
||||||
move ..\zoitechat-build\${{ matrix.platform }}\ZoiteChat*.exe .\
|
move ..\zoitechat-build\${{ matrix.platform }}\ZoiteChat-*.exe .\
|
||||||
move ..\zoitechat-build .\
|
move ..\zoitechat-build .\
|
||||||
shell: cmd
|
shell: cmd
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v2
|
- name: Upload Installer
|
||||||
|
id: upload_installer
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
with:
|
with:
|
||||||
name: Installer ${{ matrix.arch }}
|
name: Installer ${{ matrix.arch }}
|
||||||
path: ZoiteChat*.exe
|
path: ZoiteChat-*.exe
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v2
|
- name: Attest Installer (Artifact Attestation)
|
||||||
|
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
|
||||||
|
uses: actions/attest-build-provenance@v3
|
||||||
with:
|
with:
|
||||||
name: Build Files ${{ matrix.arch }}
|
subject-name: Installer ${{ matrix.arch }}
|
||||||
|
subject-digest: sha256:${{ steps.upload_installer.outputs.artifact-digest }}
|
||||||
|
|
||||||
|
- name: Upload Build Files
|
||||||
|
id: upload_buildfiles
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: Build Files ${{ matrix.arch }}
|
||||||
path: zoitechat-build
|
path: zoitechat-build
|
||||||
|
|
||||||
|
- name: Attest Build Files (Artifact Attestation)
|
||||||
|
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
|
||||||
|
uses: actions/attest-build-provenance@v3
|
||||||
|
with:
|
||||||
|
subject-name: Build Files ${{ matrix.arch }}
|
||||||
|
subject-digest: sha256:${{ steps.upload_buildfiles.outputs.artifact-digest }}
|
||||||
@@ -0,0 +1,428 @@
|
|||||||
|
name: Windows MSI/MSIX Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- 'release/**'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
windows_msi_build:
|
||||||
|
runs-on: windows-2022
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
attestations: write
|
||||||
|
artifact-metadata: write
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
platform: [x64]
|
||||||
|
arch: [x64]
|
||||||
|
fail-fast: false
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v7
|
||||||
|
with:
|
||||||
|
python-version: '3.14.3'
|
||||||
|
architecture: ${{ matrix.arch }}
|
||||||
|
|
||||||
|
- name: Install Dependencies
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
New-Item -Name "deps" -ItemType "Directory" -Force | Out-Null
|
||||||
|
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
python -m pip install cffi
|
||||||
|
python -m pip install zstandard
|
||||||
|
|
||||||
|
$ProgressPreference = 'SilentlyContinue'
|
||||||
|
function Download-WithRetry {
|
||||||
|
param(
|
||||||
|
[string]$Url,
|
||||||
|
[string]$OutFile,
|
||||||
|
[int]$MaxAttempts = 5,
|
||||||
|
[int]$InitialDelaySeconds = 2
|
||||||
|
)
|
||||||
|
for ($attempt = 1; $attempt -le $MaxAttempts; $attempt++) {
|
||||||
|
try {
|
||||||
|
Invoke-WebRequest -Uri $Url -OutFile $OutFile -ErrorAction Stop
|
||||||
|
return
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
if ($attempt -eq $MaxAttempts) {
|
||||||
|
throw
|
||||||
|
}
|
||||||
|
Start-Sleep -Seconds ($InitialDelaySeconds * [math]::Pow(2, $attempt - 1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# The existing solution includes installer.vcxproj, so Inno Setup is
|
||||||
|
# still required to build the unmodified solution. This workflow does
|
||||||
|
# not publish that EXE; it packages the same staged rel tree as MSI/MSIX.
|
||||||
|
Download-WithRetry -Url https://github.com/jrsoftware/issrc/releases/download/is-6_7_1/innosetup-6.7.1.exe -OutFile deps\innosetup-unicode.exe
|
||||||
|
& deps\innosetup-unicode.exe /VERYSILENT | Out-Null
|
||||||
|
|
||||||
|
# Use the same GTK runtime as the existing Windows EXE workflow.
|
||||||
|
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.20.0-alpha.1/GTK3_Gvsbuild_zoitechat-2.20.0-alpha.1_x64.zip -OutFile deps\gtk-${{ matrix.arch }}.zip
|
||||||
|
Expand-Archive -LiteralPath deps\gtk-${{ matrix.arch }}.zip -DestinationPath C:\gtk-build\gtk\x64\release -Force
|
||||||
|
|
||||||
|
# The GTK3 bundle does not contain librsvg. Restore the renderer,
|
||||||
|
# pixbuf loader, and license from the matching GTK4 bundle. Do not
|
||||||
|
# replace the rest of the GTK3 runtime with GTK4 libraries.
|
||||||
|
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.20.0-alpha.1/GTK4_Gvsbuild_zoitechat-2.20.0-alpha.1_x64.zip -OutFile deps\svg-runtime.zip
|
||||||
|
if ((Get-FileHash deps\svg-runtime.zip -Algorithm SHA256).Hash -ne 'fb657f9ebae3a6807defb15e66091d643a703ee66cb37488e3e11e5646f45adb') {
|
||||||
|
throw 'Unexpected SVG runtime archive checksum'
|
||||||
|
}
|
||||||
|
$svgArchive = [System.IO.Compression.ZipFile]::OpenRead((Resolve-Path deps\svg-runtime.zip))
|
||||||
|
try {
|
||||||
|
foreach ($name in @('bin/rsvg-2-2.dll', 'lib/gdk-pixbuf-2.0/2.10.0/loaders/pixbufloader_svg.dll', 'share/doc/librsvg/COPYING.LIB')) {
|
||||||
|
$entry = $svgArchive.GetEntry($name)
|
||||||
|
if ($null -eq $entry) { throw "Missing SVG runtime file: $name" }
|
||||||
|
$destination = Join-Path 'C:\gtk-build\gtk\x64\release' $name
|
||||||
|
New-Item -ItemType Directory -Path (Split-Path $destination) -Force | Out-Null
|
||||||
|
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $destination, $true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally { $svgArchive.Dispose() }
|
||||||
|
|
||||||
|
# Ensure SVG remains loadable before compiling or packaging.
|
||||||
|
& C:\gtk-build\gtk\x64\release\bin\gdk-pixbuf-query-loaders.exe --update-cache
|
||||||
|
if ($LASTEXITCODE -ne 0) { throw 'Could not generate the pixbuf loader cache' }
|
||||||
|
if (-not (Select-String -LiteralPath 'C:\gtk-build\gtk\x64\release\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache' -SimpleMatch '"svg"')) {
|
||||||
|
throw 'SVG loader could not be loaded with the GTK3 runtime'
|
||||||
|
}
|
||||||
|
|
||||||
|
Download-WithRetry -Url https://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-hicolor-icon-theme-0.18-1-any.pkg.tar.zst -OutFile deps\hicolor-icon-theme.pkg.tar.zst
|
||||||
|
python -c "import tarfile,zstandard,pathlib;archive=pathlib.Path(r'deps\\hicolor-icon-theme.pkg.tar.zst');target=pathlib.Path(r'C:\\gtk-build\\gtk\\x64\\release');dctx=zstandard.ZstdDecompressor();f=archive.open('rb');reader=dctx.stream_reader(f);tf=tarfile.open(fileobj=reader,mode='r|');[tf.extract(m,path=target) for m in tf if m.name.startswith('mingw64/share/icons/hicolor/')];tf.close();reader.close();f.close()"
|
||||||
|
|
||||||
|
Download-WithRetry -Url https://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-libarchive-3.8.6-1-any.pkg.tar.zst -OutFile deps\libarchive.pkg.tar.zst
|
||||||
|
python -c "import tarfile,zstandard,pathlib;archive=pathlib.Path(r'deps\\libarchive.pkg.tar.zst');target=pathlib.Path(r'C:\\gtk-build\\gtk\\x64\\release');dctx=zstandard.ZstdDecompressor();f=archive.open('rb');reader=dctx.stream_reader(f);tf=tarfile.open(fileobj=reader,mode='r|');[tf.extract(m,path=target) for m in tf if m.name.startswith(('mingw64/include/archive','mingw64/lib/libarchive','mingw64/bin/libarchive'))];tf.close();reader.close();f.close()"
|
||||||
|
|
||||||
|
if (Test-Path C:\gtk-build\gtk\x64\release\mingw64\share\icons\hicolor) {
|
||||||
|
New-Item -Path C:\gtk-build\gtk\x64\release\share\icons -ItemType Directory -Force | Out-Null
|
||||||
|
Copy-Item -Path C:\gtk-build\gtk\x64\release\mingw64\share\icons\hicolor -Destination C:\gtk-build\gtk\x64\release\share\icons\hicolor -Recurse -Force
|
||||||
|
}
|
||||||
|
if (Test-Path C:\gtk-build\gtk\x64\release\mingw64\include) {
|
||||||
|
New-Item -Path C:\gtk-build\gtk\x64\release\include -ItemType Directory -Force | Out-Null
|
||||||
|
Copy-Item -Path C:\gtk-build\gtk\x64\release\mingw64\include\archive* -Destination C:\gtk-build\gtk\x64\release\include -Recurse -Force
|
||||||
|
}
|
||||||
|
if (Test-Path C:\gtk-build\gtk\x64\release\mingw64\lib) {
|
||||||
|
New-Item -Path C:\gtk-build\gtk\x64\release\lib -ItemType Directory -Force | Out-Null
|
||||||
|
Copy-Item -Path C:\gtk-build\gtk\x64\release\mingw64\lib\libarchive* -Destination C:\gtk-build\gtk\x64\release\lib -Force
|
||||||
|
}
|
||||||
|
if (Test-Path C:\gtk-build\gtk\x64\release\mingw64\bin) {
|
||||||
|
New-Item -Path C:\gtk-build\gtk\x64\release\bin -ItemType Directory -Force | Out-Null
|
||||||
|
Copy-Item -Path C:\gtk-build\gtk\x64\release\mingw64\bin\libarchive*.dll -Destination C:\gtk-build\gtk\x64\release\bin -Force
|
||||||
|
}
|
||||||
|
if (Test-Path C:\gtk-build\gtk\x64\release\mingw64) {
|
||||||
|
Remove-Item -Path C:\gtk-build\gtk\x64\release\mingw64 -Recurse -Force
|
||||||
|
}
|
||||||
|
|
||||||
|
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.18.0-pre4/gendef20260315.7z -OutFile deps\gendef.7z
|
||||||
|
& 7z.exe x deps\gendef.7z -oC:\gtk-build
|
||||||
|
|
||||||
|
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.18.0-pre4/WinSparkle-20260315.7z -OutFile deps\WinSparkle.7z
|
||||||
|
& 7z.exe x deps\WinSparkle.7z -oC:\gtk-build\WinSparkle
|
||||||
|
|
||||||
|
Download-WithRetry -Url https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.18.0-pre4/perl-5.42.0.1-${{ matrix.arch }}.7z -OutFile deps\perl-${{ matrix.arch }}.7z
|
||||||
|
& 7z.exe x deps\perl-${{ matrix.arch }}.7z -oC:\gtk-build\perl-5.42.0.1\${{ matrix.platform }}
|
||||||
|
|
||||||
|
$pyRoot = $env:pythonLocation
|
||||||
|
if (-not $pyRoot) { $pyRoot = & python -c "import sys; print(sys.prefix)" }
|
||||||
|
|
||||||
|
foreach ($pyDir in @("C:\gtk-build\python-3.14.3", "C:\gtk-build\python-3.14")) {
|
||||||
|
New-Item -Path $pyDir -ItemType Directory -Force | Out-Null
|
||||||
|
$target = Join-Path $pyDir "${{ matrix.platform }}"
|
||||||
|
if (Test-Path $target) { Remove-Item $target -Recurse -Force }
|
||||||
|
New-Item -Path $pyDir -Name "${{ matrix.platform }}" -ItemType Junction -Value $pyRoot | Out-Null
|
||||||
|
}
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v7
|
||||||
|
with:
|
||||||
|
python-version: '3.8.10'
|
||||||
|
architecture: ${{ matrix.arch }}
|
||||||
|
|
||||||
|
- name: Prepare Python 3.8
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
python -m pip install cffi
|
||||||
|
|
||||||
|
$pyRoot = $env:pythonLocation
|
||||||
|
if (-not $pyRoot) { $pyRoot = & python -c "import sys; print(sys.prefix)" }
|
||||||
|
|
||||||
|
foreach ($pyDir in @("C:\gtk-build\python-3.8.10", "C:\gtk-build\python-3.8")) {
|
||||||
|
New-Item -Path $pyDir -ItemType Directory -Force | Out-Null
|
||||||
|
$target = Join-Path $pyDir "${{ matrix.platform }}"
|
||||||
|
if (Test-Path $target) { Remove-Item $target -Recurse -Force }
|
||||||
|
New-Item -Path $pyDir -Name "${{ matrix.platform }}" -ItemType Junction -Value $pyRoot | Out-Null
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
|
||||||
|
|
||||||
|
set "PYTHON_DIR=C:\gtk-build\python-3.14.3\${{ matrix.platform }}"
|
||||||
|
if not exist "%PYTHON_DIR%\libs\python314.lib" (
|
||||||
|
echo Missing %PYTHON_DIR%\libs\python314.lib
|
||||||
|
dir "%PYTHON_DIR%\libs"
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
set "PYTHON38_DIR=C:\gtk-build\python-3.8\${{ matrix.platform }}"
|
||||||
|
if not exist "%PYTHON38_DIR%\libs\python38.lib" (
|
||||||
|
echo Missing %PYTHON38_DIR%\libs\python38.lib
|
||||||
|
dir "%PYTHON38_DIR%\libs"
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
if not exist "%PYTHON38_DIR%\Lib\site-packages\_cffi_backend.cp38*.pyd" (
|
||||||
|
echo Missing %PYTHON38_DIR%\Lib\site-packages\_cffi_backend.cp38*.pyd
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
set "LIB=%PYTHON_DIR%\libs;%LIB%"
|
||||||
|
set "INCLUDE=%PYTHON_DIR%\include;%INCLUDE%"
|
||||||
|
|
||||||
|
powershell -NoProfile -ExecutionPolicy Bypass -Command "$archiveLib='C:\gtk-build\gtk\x64\release\lib\libarchive.lib'; if (-not (Test-Path $archiveLib)) { $archiveDll = Get-ChildItem 'C:\gtk-build\gtk\x64\release\bin\libarchive*.dll' | Select-Object -First 1; if ($archiveDll) { Push-Location 'C:\gtk-build\gtk\x64\release\lib'; & 'C:\gtk-build\gendef\gendef.exe' $archiveDll.FullName | Out-Null; $archiveDef = Get-ChildItem 'libarchive*.def' | Select-Object -First 1; if ($archiveDef) { & lib /def:$archiveDef.Name /machine:${{ matrix.platform }} /out:libarchive.lib | Out-Null }; Pop-Location } }"
|
||||||
|
|
||||||
|
msbuild win32\zoitechat.sln /m /verbosity:minimal /p:Configuration=Release /p:Platform=${{ matrix.platform }}
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
|
||||||
|
if not exist "..\zoitechat-build\${{ matrix.platform }}\rel\plugins\hcpython38.dll" (
|
||||||
|
echo hcpython38.dll was not built
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
if not exist "..\zoitechat-build\${{ matrix.platform }}\rel\_cffi_backend.cp38*.pyd" (
|
||||||
|
echo _cffi_backend for Python 3.8 was not staged for the installer
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
# Master added native emoji font staging and tests after the release
|
||||||
|
# branch split. Run these before packaging so MSI/MSIX use verified files.
|
||||||
|
- name: Test emoji catalog, font coverage and picker
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
|
||||||
|
set "PATH=%CD%\..\zoitechat-build\x64\rel;%PATH%"
|
||||||
|
set "GDK_PIXBUF_MODULE_FILE=%CD%\..\zoitechat-build\x64\rel\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache"
|
||||||
|
set "ZOITECHAT_EMOJI_FONT=%CD%\..\zoitechat-build\x64\rel\share\fonts\zoitechat\NotoColorEmoji.ttf"
|
||||||
|
fc /b data\fonts\NotoColorEmoji.ttf "%ZOITECHAT_EMOJI_FONT%"
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
for %%T in (data font ui) do (
|
||||||
|
msbuild win32\emoji-tests.vcxproj /m /verbosity:minimal /p:Configuration=Release /p:Platform=x64 /p:EmojiTestKind=%%T
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
..\zoitechat-build\x64\tests\emoji-%%T-tests.exe --tap
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
- name: Install WiX Toolset
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
# Keep this pinned. WiX v6 introduced OSMF terms and WiX v7 adds
|
||||||
|
# explicit EULA acceptance; do not silently accept new terms in CI.
|
||||||
|
dotnet tool install --tool-path .wix wix --version 5.0.2
|
||||||
|
if ($LASTEXITCODE -ne 0) { throw 'Failed to install WiX Toolset 5.0.2' }
|
||||||
|
& .\.wix\wix.exe --version
|
||||||
|
if ($LASTEXITCODE -ne 0) { throw 'WiX Toolset could not be executed' }
|
||||||
|
|
||||||
|
- name: Build MSI
|
||||||
|
id: build_msi
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
|
$rawVersion = (Get-Content VERSION -Raw).Trim()
|
||||||
|
if ($rawVersion -notmatch '^(\d+)\.(\d+)\.(\d+)') {
|
||||||
|
throw "VERSION '$rawVersion' does not begin with an MSI-compatible major.minor.patch version"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Keep the full development version in the filename, while MSI's
|
||||||
|
# ProductVersion is numeric (e.g. 2.20.0-dev -> 2.20.0).
|
||||||
|
$msiVersion = "$($Matches[1]).$($Matches[2]).$($Matches[3])"
|
||||||
|
$safeVersion = $rawVersion -replace '[^0-9A-Za-z._-]', '-'
|
||||||
|
$sourceDir = (Resolve-Path "..\zoitechat-build\${{ matrix.platform }}\rel").Path
|
||||||
|
$outputPath = Join-Path $PWD "ZoiteChat-${safeVersion}_${{ matrix.arch }}.msi"
|
||||||
|
|
||||||
|
if (-not (Test-Path (Join-Path $sourceDir 'zoitechat.exe'))) {
|
||||||
|
throw "Staged ZoiteChat executable is missing from $sourceDir"
|
||||||
|
}
|
||||||
|
|
||||||
|
& .\.wix\wix.exe build win32\wix\zoitechat.wxs `
|
||||||
|
-arch x64 `
|
||||||
|
-d "SourceDir=$sourceDir" `
|
||||||
|
-d "ProductVersion=$msiVersion" `
|
||||||
|
-out $outputPath
|
||||||
|
if ($LASTEXITCODE -ne 0) { throw 'WiX MSI build failed' }
|
||||||
|
|
||||||
|
if (-not (Test-Path $outputPath)) {
|
||||||
|
throw "Expected MSI was not created: $outputPath"
|
||||||
|
}
|
||||||
|
|
||||||
|
"path=$outputPath" >> $env:GITHUB_OUTPUT
|
||||||
|
"filename=$(Split-Path $outputPath -Leaf)" >> $env:GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Test MSI administrative extraction
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
$msi = '${{ steps.build_msi.outputs.path }}'
|
||||||
|
$adminImage = Join-Path $PWD 'msi-admin-image'
|
||||||
|
New-Item -ItemType Directory -Path $adminImage -Force | Out-Null
|
||||||
|
|
||||||
|
$arguments = "/a `"$msi`" /qn TARGETDIR=`"$adminImage`""
|
||||||
|
$process = Start-Process -FilePath msiexec.exe -ArgumentList $arguments -Wait -PassThru
|
||||||
|
if ($process.ExitCode -ne 0) {
|
||||||
|
throw "MSI administrative extraction failed with exit code $($process.ExitCode)"
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($requiredFile in @(
|
||||||
|
'zoitechat.exe',
|
||||||
|
'hclua.dll',
|
||||||
|
'hcupd.dll',
|
||||||
|
'WinSparkle.dll',
|
||||||
|
'hcchecksum.dll',
|
||||||
|
'hcexec.dll',
|
||||||
|
'hcfishlim.dll',
|
||||||
|
'hcsysinfo.dll',
|
||||||
|
'system.png',
|
||||||
|
'hcperl.dll',
|
||||||
|
'hcpython3.dll',
|
||||||
|
'hcpython38.dll',
|
||||||
|
'NotoColorEmoji.ttf',
|
||||||
|
'OFL.txt'
|
||||||
|
)) {
|
||||||
|
$match = Get-ChildItem -Path $adminImage -Filter $requiredFile -File -Recurse | Select-Object -First 1
|
||||||
|
if ($null -eq $match) {
|
||||||
|
throw "Administrative image does not contain required normal-install file: $requiredFile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($requiredPattern in @('_cffi_backend.cp314*.pyd', '_cffi_backend.cp38*.pyd')) {
|
||||||
|
$match = Get-ChildItem -Path $adminImage -Filter $requiredPattern -File -Recurse | Select-Object -First 1
|
||||||
|
if ($null -eq $match) {
|
||||||
|
throw "Administrative image does not contain required Python support file: $requiredPattern"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($requiredPythonFile in @('zoitechat.py', '_zoitechat.py', 'hexchat.py', 'xchat.py')) {
|
||||||
|
$match = Get-ChildItem -Path $adminImage -Filter $requiredPythonFile -File -Recurse |
|
||||||
|
Where-Object { $_.Directory.Name -eq 'python' } |
|
||||||
|
Select-Object -First 1
|
||||||
|
if ($null -eq $match) {
|
||||||
|
throw "Administrative image does not contain required Python bridge file: $requiredPythonFile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($excludedFile in @(
|
||||||
|
'portable-mode',
|
||||||
|
'zoitechat-text.exe'
|
||||||
|
)) {
|
||||||
|
$match = Get-ChildItem -Path $adminImage -Filter $excludedFile -File -Recurse | Select-Object -First 1
|
||||||
|
if ($null -ne $match) {
|
||||||
|
throw "MSI incorrectly contains Inno custom/portable-only file: $excludedFile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Build MSIX
|
||||||
|
id: build_msix
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
|
$rawVersion = (Get-Content VERSION -Raw).Trim()
|
||||||
|
if ($rawVersion -notmatch '^(\d+)\.(\d+)\.(\d+)') {
|
||||||
|
throw "VERSION '$rawVersion' does not begin with a Store-compatible major.minor.build version"
|
||||||
|
}
|
||||||
|
|
||||||
|
$versionParts = @(
|
||||||
|
[int]$Matches[1],
|
||||||
|
[int]$Matches[2],
|
||||||
|
[int]$Matches[3]
|
||||||
|
)
|
||||||
|
if ($versionParts[0] -eq 0) {
|
||||||
|
throw 'The Microsoft Store requires a non-zero major package version.'
|
||||||
|
}
|
||||||
|
foreach ($part in $versionParts) {
|
||||||
|
if ($part -lt 0 -or $part -gt 65535) {
|
||||||
|
throw "MSIX version component '$part' is outside the Store-supported 0-65535 range."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Partner Center reserves the fourth field as 0. A -dev version
|
||||||
|
# is packaged as a valid 2.20.0.0, without changing VERSION.
|
||||||
|
$packageVersion = "$($versionParts[0]).$($versionParts[1]).$($versionParts[2]).0"
|
||||||
|
$safeVersion = $rawVersion -replace '[^0-9A-Za-z._-]', '-'
|
||||||
|
$sourceDir = (Resolve-Path "..\zoitechat-build\${{ matrix.platform }}\rel").Path
|
||||||
|
$outputPath = Join-Path $PWD "ZoiteChat-${safeVersion}_${{ matrix.arch }}.msix"
|
||||||
|
|
||||||
|
# Reserved ZoiteChat identity from the release branch. Adjust only
|
||||||
|
# if the Product identity page in Partner Center changes.
|
||||||
|
$identityName = 'deependtilde.ZoiteChat'
|
||||||
|
$publisher = 'CN=6C7766BB-6AC6-488B-A09E-E3F8E68E63E4'
|
||||||
|
$publisherDisplayName = 'deepend_tilde'
|
||||||
|
$artifactName = 'MSIX Store Package ${{ matrix.arch }}'
|
||||||
|
|
||||||
|
Write-Host "Building Store MSIX for identity: $identityName"
|
||||||
|
|
||||||
|
& .\win32\msix\build-msix.ps1 `
|
||||||
|
-SourceDir $sourceDir `
|
||||||
|
-OutputPath $outputPath `
|
||||||
|
-PackageVersion $packageVersion `
|
||||||
|
-IdentityName $identityName `
|
||||||
|
-Publisher $publisher `
|
||||||
|
-PublisherDisplayName $publisherDisplayName `
|
||||||
|
-SelfSign
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
throw 'MSIX build script failed'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not (Test-Path $outputPath)) {
|
||||||
|
throw "Expected MSIX was not created: $outputPath"
|
||||||
|
}
|
||||||
|
|
||||||
|
"path=$outputPath" >> $env:GITHUB_OUTPUT
|
||||||
|
"filename=$(Split-Path $outputPath -Leaf)" >> $env:GITHUB_OUTPUT
|
||||||
|
"package_version=$packageVersion" >> $env:GITHUB_OUTPUT
|
||||||
|
"store_ready=true" >> $env:GITHUB_OUTPUT
|
||||||
|
"artifact_name=$artifactName" >> $env:GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Upload MSI Installer
|
||||||
|
id: upload_msi
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: MSI Installer ${{ matrix.arch }}
|
||||||
|
path: ${{ steps.build_msi.outputs.path }}
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
- name: Attest MSI Installer (Artifact Attestation)
|
||||||
|
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
|
||||||
|
uses: actions/attest-build-provenance@v3
|
||||||
|
with:
|
||||||
|
subject-name: MSI Installer ${{ matrix.arch }}
|
||||||
|
subject-digest: sha256:${{ steps.upload_msi.outputs.artifact-digest }}
|
||||||
|
|
||||||
|
- name: Upload MSIX Package
|
||||||
|
id: upload_msix
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: ${{ steps.build_msix.outputs.artifact_name }}
|
||||||
|
path: ${{ steps.build_msix.outputs.path }}
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
- name: Attest MSIX Package (Artifact Attestation)
|
||||||
|
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
|
||||||
|
uses: actions/attest-build-provenance@v3
|
||||||
|
with:
|
||||||
|
subject-name: ${{ steps.build_msix.outputs.artifact_name }}
|
||||||
|
subject-digest: sha256:${{ steps.upload_msix.outputs.artifact-digest }}
|
||||||
@@ -27,3 +27,9 @@ osx/.ZoiteChat.app
|
|||||||
*.dmg
|
*.dmg
|
||||||
*.VC.db
|
*.VC.db
|
||||||
*.VC.opendb
|
*.VC.opendb
|
||||||
|
|
||||||
|
# Native macOS packaging output
|
||||||
|
/build-macos*/
|
||||||
|
/dist/
|
||||||
|
/packaging/macos/__pycache__/
|
||||||
|
/packaging/macos/tests/__pycache__/
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
Berke Viktor <github.bviktor@outlook.com> <berkeviktor@aol.com>
|
Berke Viktor <github.bviktor@outlook.com> <berkeviktor@aol.com>
|
||||||
Berke Viktor <github.bviktor@outlook.com> <bviktor@zoitechat.org>
|
Berke Viktor <github.bviktor@outlook.com> <bviktor@hexchat.org>
|
||||||
Berke Viktor <github.bviktor@outlook.com> <bviktor@outlook.com>
|
Berke Viktor <github.bviktor@outlook.com> <bviktor@outlook.com>
|
||||||
Berke Viktor <github.bviktor@outlook.com> berkeviktor@aol.com
|
Berke Viktor <github.bviktor@outlook.com> berkeviktor@aol.com
|
||||||
Patrick Griffis <tingping@tingping.se> TingPing <tingping@fedoraproject.org>
|
Patrick Griffis <tingping@tingping.se> TingPing <tingping@fedoraproject.org>
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
debian/patches
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
series
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
2
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
readmechanges.patch
|
||||||
|
default-servers.patch
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
version: 2
|
||||||
|
sphinx:
|
||||||
|
configuration: 'docs/conf.py'
|
||||||
|
build:
|
||||||
|
os: 'ubuntu-22.04'
|
||||||
|
tools:
|
||||||
|
python: '3.11'
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
<https://fsf.org/>
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
Preamble
|
Preamble
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
The licenses for most software are designed to take away your
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
|
|||||||
General Public License applies to most of the Free Software
|
General Public License applies to most of the Free Software
|
||||||
Foundation's software and to any other program whose authors commit to
|
Foundation's software and to any other program whose authors commit to
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
your programs, too.
|
your programs, too.
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
When we speak of free software, we are referring to freedom, not
|
||||||
@@ -55,8 +55,8 @@ patent must be licensed for everyone's free use or not licensed at all.
|
|||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
The precise terms and conditions for copying, distribution and
|
||||||
modification follow.
|
modification follow.
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
0. This License applies to any program or other work which contains
|
||||||
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
|
|||||||
License. (Exception: if the Program itself is interactive but
|
License. (Exception: if the Program itself is interactive but
|
||||||
does not normally print such an announcement, your work based on
|
does not normally print such an announcement, your work based on
|
||||||
the Program is not required to print an announcement.)
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
These requirements apply to the modified work as a whole. If
|
||||||
identifiable sections of that work are not derived from the Program,
|
identifiable sections of that work are not derived from the Program,
|
||||||
and can be reasonably considered independent and separate works in
|
and can be reasonably considered independent and separate works in
|
||||||
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
|
|||||||
access to copy the source code from the same place counts as
|
access to copy the source code from the same place counts as
|
||||||
distribution of the source code, even though third parties are not
|
distribution of the source code, even though third parties are not
|
||||||
compelled to copy the source along with the object code.
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
except as expressly provided under this License. Any attempt
|
except as expressly provided under this License. Any attempt
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
@@ -225,7 +225,7 @@ impose that choice.
|
|||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
This section is intended to make thoroughly clear what is believed to
|
||||||
be a consequence of the rest of this License.
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
original copyright holder who places the Program under this License
|
original copyright holder who places the Program under this License
|
||||||
@@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals
|
|||||||
of preserving the free status of all derivatives of our free software and
|
of preserving the free status of all derivatives of our free software and
|
||||||
of promoting the sharing and reuse of software generally.
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
NO WARRANTY
|
NO WARRANTY
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
@@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
If you develop a new program, and you want it to be of the greatest
|
||||||
possible use to the public, the best way to achieve this is to make it
|
possible use to the public, the best way to achieve this is to make it
|
||||||
@@ -291,7 +291,7 @@ convey the exclusion of warranty; and each file should have at least
|
|||||||
the "copyright" line and a pointer to where the full notice is found.
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
Copyright (C) 19yy <name of author>
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -303,17 +303,15 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License along
|
||||||
along with this program; if not, write to the Free Software
|
with this program; if not, see <https://www.gnu.org/licenses/>.
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
If the program is interactive, make it output a short notice like this
|
||||||
when it starts in an interactive mode:
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
This is free software, and you are welcome to redistribute it
|
This is free software, and you are welcome to redistribute it
|
||||||
under certain conditions; type `show c' for details.
|
under certain conditions; type `show c' for details.
|
||||||
@@ -330,11 +328,34 @@ necessary. Here is a sample; alter the names:
|
|||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
<signature of Moe Ghoul>, 1 April 1989
|
||||||
Ty Coon, President of Vice
|
Moe Ghoul, President of Vice
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
This General Public License does not permit incorporating your program into
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
consider it more useful to permit linking proprietary applications with the
|
consider it more useful to permit linking proprietary applications with the
|
||||||
library. If this is what you want to do, use the GNU Library General
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
Public License instead of this License.
|
Public License instead of this License.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
ADDITIONAL LICENSE NOTICE
|
||||||
|
======================================================================
|
||||||
|
|
||||||
|
ZoiteChat source code:
|
||||||
|
GPL version 2
|
||||||
|
See Above.
|
||||||
|
|
||||||
|
Unicode Emoji and CLDR data:
|
||||||
|
Unicode License v3
|
||||||
|
data/emoji/LICENSE-UNICODE.txt
|
||||||
|
|
||||||
|
gemoji shortcode data:
|
||||||
|
MIT License
|
||||||
|
Copyright (c) 2019 GitHub, Inc.
|
||||||
|
data/emoji/LICENSE-GEMOJI.txt
|
||||||
|
|
||||||
|
Noto Color Emoji:
|
||||||
|
SIL Open Font License 1.1
|
||||||
|
data/fonts/OFL.txt
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
PREFIX ?= /usr/local
|
||||||
|
BUILD_DIR ?= build
|
||||||
|
MESON ?= meson
|
||||||
|
NINJA ?= ninja
|
||||||
|
C_STD ?= c17
|
||||||
|
MESON_SETUP_ARGS ?=
|
||||||
|
MESON_SETUP_ARGS += -Dc_std=$(C_STD)
|
||||||
|
MESON_COMPILE_ARGS ?=
|
||||||
|
MESON_INSTALL_ARGS ?=
|
||||||
|
|
||||||
|
CONFIG_STAMP := $(BUILD_DIR)/build.ninja
|
||||||
|
|
||||||
|
.PHONY: all configure build reconfigure install uninstall clean distclean
|
||||||
|
|
||||||
|
all: build
|
||||||
|
|
||||||
|
$(CONFIG_STAMP):
|
||||||
|
@mkdir -p $(BUILD_DIR)
|
||||||
|
@env NINJA=$(NINJA) $(MESON) setup $(BUILD_DIR) --prefix=$(PREFIX) $(MESON_SETUP_ARGS)
|
||||||
|
|
||||||
|
configure: $(CONFIG_STAMP)
|
||||||
|
|
||||||
|
build: configure
|
||||||
|
@env NINJA=$(NINJA) $(MESON) compile -C $(BUILD_DIR) $(MESON_COMPILE_ARGS)
|
||||||
|
|
||||||
|
reconfigure:
|
||||||
|
@mkdir -p $(BUILD_DIR)
|
||||||
|
@env NINJA=$(NINJA) $(MESON) setup --reconfigure $(BUILD_DIR) --prefix=$(PREFIX) $(MESON_SETUP_ARGS)
|
||||||
|
|
||||||
|
install: build
|
||||||
|
@env NINJA=$(NINJA) $(MESON) install -C $(BUILD_DIR) $(MESON_INSTALL_ARGS)
|
||||||
|
|
||||||
|
uninstall: configure
|
||||||
|
@$(NINJA) -C $(BUILD_DIR) uninstall
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@if [ -f "$(CONFIG_STAMP)" ]; then \
|
||||||
|
env NINJA=$(NINJA) $(MESON) compile -C $(BUILD_DIR) --clean; \
|
||||||
|
else \
|
||||||
|
echo "Nothing to clean (no $(CONFIG_STAMP))."; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
distclean:
|
||||||
|
rm -rf $(BUILD_DIR)
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
UNICODE LICENSE V3
|
||||||
|
|
||||||
|
COPYRIGHT AND PERMISSION NOTICE
|
||||||
|
|
||||||
|
Copyright © 1991-2026 Unicode, Inc.
|
||||||
|
|
||||||
|
NOTICE TO USER: Carefully read the following legal agreement. BY
|
||||||
|
DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR
|
||||||
|
SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
|
||||||
|
TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT
|
||||||
|
DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of data files and any associated documentation (the "Data Files") or
|
||||||
|
software and any associated documentation (the "Software") to deal in the
|
||||||
|
Data Files or Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, and/or sell
|
||||||
|
copies of the Data Files or Software, and to permit persons to whom the
|
||||||
|
Data Files or Software are furnished to do so, provided that either (a)
|
||||||
|
this copyright and permission notice appear with all copies of the Data
|
||||||
|
Files or Software, or (b) this copyright and permission notice appear in
|
||||||
|
associated Documentation.
|
||||||
|
|
||||||
|
THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||||
|
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
||||||
|
THIRD PARTY RIGHTS.
|
||||||
|
|
||||||
|
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
|
||||||
|
BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,
|
||||||
|
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||||
|
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA
|
||||||
|
FILES OR SOFTWARE.
|
||||||
|
|
||||||
|
Except as contained in this notice, the name of a copyright holder shall
|
||||||
|
not be used in advertising or otherwise to promote the sale, use or other
|
||||||
|
dealings in these Data Files or Software without prior written
|
||||||
|
authorization of the copyright holder.
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# Bundled emoji data
|
||||||
|
|
||||||
|
These are pinned copies of the upstream data files that
|
||||||
|
`tools/gen-emoji-data.py` compiles into ZoiteChat's emoji picker catalog
|
||||||
|
at build time. Bundling them means every ZoiteChat package exposes the
|
||||||
|
same emoji, names, categories and search keywords, independent of the
|
||||||
|
GTK runtime version or the emoji data a distribution installs under
|
||||||
|
`/usr/share/gtk-3.0/emoji`.
|
||||||
|
|
||||||
|
Nothing here affects what is sent over IRC: the picker inserts plain
|
||||||
|
Unicode sequences. Official builds register the bundled Noto Color Emoji
|
||||||
|
font privately for consistent rendering, while preserving platform font
|
||||||
|
fallback if registration is unavailable.
|
||||||
|
|
||||||
|
| File | Source | Version |
|
||||||
|
| ---- | ------ | ------- |
|
||||||
|
| `emoji-test.txt` | [Unicode emoji data](https://unicode.org/Public/emoji/17.0/emoji-test.txt) (mirrored at [unicode-org/unicodetools](https://github.com/unicode-org/unicodetools/blob/main/unicodetools/data/emoji/17.0/emoji-test.txt)) | Emoji 17.0 |
|
||||||
|
| `cldr-annotations-en.xml` | [unicode-org/cldr](https://github.com/unicode-org/cldr/blob/release-48/common/annotations/en.xml) `common/annotations/en.xml` | CLDR release 48 |
|
||||||
|
| `cldr-annotations-derived-en.xml` | [unicode-org/cldr](https://github.com/unicode-org/cldr/blob/release-48/common/annotationsDerived/en.xml) `common/annotationsDerived/en.xml` | CLDR release 48 |
|
||||||
|
| `gemoji.json` | [github/gemoji](https://github.com/github/gemoji/blob/v4.1.0/db/emoji.json) `db/emoji.json` | v4.1.0 |
|
||||||
|
|
||||||
|
The pinned versions are recorded in `VERSIONS`.
|
||||||
|
|
||||||
|
## Licenses
|
||||||
|
|
||||||
|
- `emoji-test.txt`, `cldr-annotations-en.xml`,
|
||||||
|
`cldr-annotations-derived-en.xml`: © Unicode, Inc., distributed under
|
||||||
|
the [Unicode License v3](https://www.unicode.org/license.txt).
|
||||||
|
- `gemoji.json`: from the gemoji project, MIT licensed,
|
||||||
|
© GitHub, Inc.
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
# Pinned versions of the emoji source data in this directory.
|
||||||
|
# Keep in sync with the files themselves; tools/gen-emoji-data.py
|
||||||
|
# verifies unicode-emoji against the emoji-test.txt header.
|
||||||
|
unicode-emoji=17.0
|
||||||
|
cldr=48
|
||||||
|
gemoji=4.1.0
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
Copyright 2013 Google LLC
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
https://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) shall not be
|
||||||
|
used to promote, endorse or advertise any Modified Version, except to
|
||||||
|
acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s)
|
||||||
|
or with their explicit written permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
# Bundled emoji font
|
||||||
|
|
||||||
|
`NotoColorEmoji.ttf` reports Noto Color Emoji version 2.051 and covers
|
||||||
|
Unicode Emoji 17.0. It is vendored from Debian's
|
||||||
|
`fonts-noto-color-emoji` 2.051 package, built from the corresponding
|
||||||
|
Google Noto Emoji release.
|
||||||
|
|
||||||
|
By default, GTK builds install this exact file, including Windows
|
||||||
|
(installer and portable builds), AppImage, Flatpak, and native Meson/RPM.
|
||||||
|
Meson packagers can set `-Dinstall-emoji-font=false` to omit the bundled
|
||||||
|
font and its installed notices and use system emoji fonts instead. An
|
||||||
|
explicit `ZOITECHAT_EMOJI_FONT` path still enables the private font map
|
||||||
|
in such builds. With the bundled font, it is registered privately as
|
||||||
|
`ZoiteChat Emoji`; an older system Noto font cannot replace it. No font
|
||||||
|
is installed globally on Windows.
|
||||||
|
|
||||||
|
Chat windows and the emoji picker share this map. Fontconfig still loads
|
||||||
|
system fonts and configuration for ordinary text, and the configured text
|
||||||
|
font, size and style remain in effect. In particular, plain digits, `#`
|
||||||
|
and `*` are not assigned emoji metrics.
|
||||||
|
|
||||||
|
Windows uses the same FreeType backend rather than GDI registration or an
|
||||||
|
OS-version-specific picker. The dependency bundle already ships FreeType,
|
||||||
|
Fontconfig and PangoFT2. This rendering path does not require Windows' native
|
||||||
|
color-font support. Actual Windows 7 execution still needs testing on that OS.
|
||||||
|
|
||||||
|
Meson requires PangoFT2 >= 1.44 and Fontconfig >= 2.13. Normal installations
|
||||||
|
load `share/fonts/zoitechat/NotoColorEmoji.ttf` beneath the configured data
|
||||||
|
directory; Windows resolves it relative to the executable. AppImage sets
|
||||||
|
`ZOITECHAT_EMOJI_FONT` to its own copy. For an uninstalled development build:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ZOITECHAT_EMOJI_FONT="$PWD/data/fonts/NotoColorEmoji.ttf" build/src/fe-gtk/zoitechat
|
||||||
|
```
|
||||||
|
|
||||||
|
An unexpectedly missing or unloadable bundled font logs a warning and retains
|
||||||
|
system-font fallback. When installation is disabled deliberately, fallback is
|
||||||
|
quiet unless an explicit `ZOITECHAT_EMOJI_FONT` override is invalid.
|
||||||
|
CI verifies the installed copy and tests catalog/font coverage; AppImage and
|
||||||
|
Windows also run the interactive picker regression tests. Native themes,
|
||||||
|
DPI and different Pango/Cairo versions can still affect pixel-level output.
|
||||||
|
|
||||||
|
Upstream release: https://github.com/googlefonts/noto-emoji/releases/tag/v2.051
|
||||||
|
|
||||||
|
Vendored file SHA-256:
|
||||||
|
`dac5c27651082d6c53dab5081f50d2022ddf6877d730fa919cf6a4fc2af22de0`
|
||||||
|
|
||||||
|
The font is distributed under the SIL Open Font License 1.1. See
|
||||||
|
`OFL.txt`.
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
emoji_font_dir = join_paths(get_option('datadir'), 'fonts', 'zoitechat')
|
||||||
|
emoji_font_doc_dir = join_paths(get_option('datadir'), 'doc', 'zoitechat', 'fonts')
|
||||||
|
|
||||||
|
if get_option('install-emoji-font')
|
||||||
|
install_data(
|
||||||
|
'NotoColorEmoji.ttf',
|
||||||
|
install_dir: emoji_font_dir,
|
||||||
|
)
|
||||||
|
|
||||||
|
install_data(
|
||||||
|
'OFL.txt',
|
||||||
|
'README.md',
|
||||||
|
install_dir: emoji_font_doc_dir,
|
||||||
|
)
|
||||||
|
endif
|
||||||
|
Before Width: | Height: | Size: 841 B After Width: | Height: | Size: 806 B |
@@ -1,11 +1,11 @@
|
|||||||
icondir = join_paths(get_option('datadir'), 'icons/hicolor')
|
icondir = join_paths(get_option('datadir'), 'icons/hicolor')
|
||||||
install_data(
|
install_data(
|
||||||
'zoitechat.png',
|
'zoitechat.png',
|
||||||
rename: 'io.github.Hexchat.png',
|
rename: 'net.zoite.Zoitechat.png',
|
||||||
install_dir: join_paths(icondir, '48x48/apps')
|
install_dir: join_paths(icondir, '48x48/apps')
|
||||||
)
|
)
|
||||||
install_data(
|
install_data(
|
||||||
'zoitechat.svg',
|
'zoitechat.svg',
|
||||||
rename: 'io.github.Hexchat.svg',
|
rename: 'net.zoite.Zoitechat.svg',
|
||||||
install_dir: join_paths(icondir, 'scalable/apps')
|
install_dir: join_paths(icondir, 'scalable/apps')
|
||||||
)
|
)
|
||||||
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 422 B After Width: | Height: | Size: 874 B |
|
Before Width: | Height: | Size: 911 B After Width: | Height: | Size: 835 B |
|
Before Width: | Height: | Size: 568 B After Width: | Height: | Size: 815 B |
|
Before Width: | Height: | Size: 611 B After Width: | Height: | Size: 861 B |
|
Before Width: | Height: | Size: 660 B After Width: | Height: | Size: 662 B |
|
Before Width: | Height: | Size: 668 B After Width: | Height: | Size: 724 B |
|
Before Width: | Height: | Size: 593 B After Width: | Height: | Size: 678 B |
|
Before Width: | Height: | Size: 691 B After Width: | Height: | Size: 744 B |
|
Before Width: | Height: | Size: 678 B After Width: | Height: | Size: 691 B |
|
Before Width: | Height: | Size: 670 B After Width: | Height: | Size: 694 B |
@@ -1,49 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
width="256"
|
|
||||||
height="256"
|
|
||||||
viewBox="0 0 67.733334 67.733334"
|
|
||||||
version="1.1"
|
|
||||||
id="svg1"
|
|
||||||
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
|
|
||||||
sodipodi:docname="zoitechat-b.svg"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg">
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="namedview1"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#000000"
|
|
||||||
borderopacity="0.25"
|
|
||||||
inkscape:showpageshadow="2"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pagecheckerboard="0"
|
|
||||||
inkscape:deskcolor="#d1d1d1"
|
|
||||||
inkscape:document-units="mm"
|
|
||||||
inkscape:zoom="1.0324986"
|
|
||||||
inkscape:cx="396.61071"
|
|
||||||
inkscape:cy="561.25984"
|
|
||||||
inkscape:window-width="2560"
|
|
||||||
inkscape:window-height="1368"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="0"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:current-layer="layer1" />
|
|
||||||
<defs
|
|
||||||
id="defs1" />
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1">
|
|
||||||
<image
|
|
||||||
width="67.73333"
|
|
||||||
height="67.73333"
|
|
||||||
href="data:image/png;base64,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 truncated
|
|
||||||
id="image1"
|
|
||||||
x="0.19017649"
|
|
||||||
y="-0.23783305" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 250 KiB |
@@ -1,49 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
width="256"
|
|
||||||
height="256"
|
|
||||||
viewBox="0 0 67.733334 67.733334"
|
|
||||||
version="1.1"
|
|
||||||
id="svg1"
|
|
||||||
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
|
|
||||||
sodipodi:docname="zoitechat-shadowless.svg"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg">
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="namedview1"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#000000"
|
|
||||||
borderopacity="0.25"
|
|
||||||
inkscape:showpageshadow="2"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pagecheckerboard="0"
|
|
||||||
inkscape:deskcolor="#d1d1d1"
|
|
||||||
inkscape:document-units="mm"
|
|
||||||
inkscape:zoom="1.0324986"
|
|
||||||
inkscape:cx="396.61071"
|
|
||||||
inkscape:cy="561.25984"
|
|
||||||
inkscape:window-width="2560"
|
|
||||||
inkscape:window-height="1368"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="0"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:current-layer="layer1" />
|
|
||||||
<defs
|
|
||||||
id="defs1" />
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1">
|
|
||||||
<image
|
|
||||||
width="67.73333"
|
|
||||||
height="67.73333"
|
|
||||||
href="data:image/png;base64,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 truncated
|
|
||||||
id="image1"
|
|
||||||
x="0.19017649"
|
|
||||||
y="-0.23783305" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.8 KiB |
@@ -1,49 +1,46 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="900px" height="900px" viewBox="0 0 900 900" version="1.1">
|
||||||
|
<defs>
|
||||||
<svg
|
<linearGradient id="linear0" gradientUnits="userSpaceOnUse" x1="14.94" y1="500" x2="893.400024" y2="500" gradientTransform="matrix(0.990818,0,0,0.899663,0,0.168452)">
|
||||||
width="256"
|
<stop offset="0" style="stop-color:rgb(0.392157%,63.137255%,98.431373%);stop-opacity:1;"/>
|
||||||
height="256"
|
<stop offset="1" style="stop-color:rgb(0%,27.843137%,73.72549%);stop-opacity:1;"/>
|
||||||
viewBox="0 0 67.733334 67.733334"
|
</linearGradient>
|
||||||
version="1.1"
|
<linearGradient id="linear1" gradientUnits="userSpaceOnUse" x1="14.94" y1="533.090027" x2="823" y2="533.090027" gradientTransform="matrix(0.990818,0,0,0.899663,0,0.168452)">
|
||||||
id="svg1"
|
<stop offset="0" style="stop-color:rgb(0%,27.843137%,73.72549%);stop-opacity:1;"/>
|
||||||
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
|
<stop offset="1" style="stop-color:rgb(0.392157%,63.137255%,98.431373%);stop-opacity:1;"/>
|
||||||
sodipodi:docname="zoitechat.svg"
|
</linearGradient>
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
<filter id="alpha" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
<feColorMatrix type="matrix" in="SourceGraphic" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
</filter>
|
||||||
xmlns:svg="http://www.w3.org/2000/svg">
|
<mask id="mask0">
|
||||||
<sodipodi:namedview
|
<g filter="url(#alpha)">
|
||||||
id="namedview1"
|
<rect x="0" y="0" width="900" height="900" style="fill:rgb(0%,0%,0%);fill-opacity:0.301961;stroke:none;"/>
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#000000"
|
|
||||||
borderopacity="0.25"
|
|
||||||
inkscape:showpageshadow="2"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pagecheckerboard="0"
|
|
||||||
inkscape:deskcolor="#d1d1d1"
|
|
||||||
inkscape:document-units="mm"
|
|
||||||
inkscape:zoom="1.0324986"
|
|
||||||
inkscape:cx="396.61071"
|
|
||||||
inkscape:cy="561.25984"
|
|
||||||
inkscape:window-width="2560"
|
|
||||||
inkscape:window-height="1368"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="0"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:current-layer="layer1" />
|
|
||||||
<defs
|
|
||||||
id="defs1" />
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1">
|
|
||||||
<image
|
|
||||||
width="67.73333"
|
|
||||||
height="67.73333"
|
|
||||||
href="data:image/png;base64,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 truncated
|
|
||||||
id="image1"
|
|
||||||
x="0.19017649"
|
|
||||||
y="-0.23783305" />
|
|
||||||
</g>
|
</g>
|
||||||
|
</mask>
|
||||||
|
<clipPath id="clip1">
|
||||||
|
<rect x="0" y="0" width="900" height="900"/>
|
||||||
|
</clipPath>
|
||||||
|
<g id="surface6" clip-path="url(#clip1)">
|
||||||
|
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 807.664062 446.90625 C 807.664062 254.1875 635.601562 97.953125 423.355469 97.953125 C 299.296875 97.953125 188.988281 151.347656 118.71875 234.1875 C 185.085938 129.585938 309.460938 59.160156 451.960938 59.160156 C 664.214844 59.160156 836.269531 215.394531 836.269531 408.113281 C 836.269531 488.183594 806.546875 561.945312 756.597656 620.828125 C 789.078125 569.628906 807.664062 510.242188 807.664062 446.90625 Z M 807.664062 446.90625 "/>
|
||||||
|
</g>
|
||||||
|
<mask id="mask1">
|
||||||
|
<g filter="url(#alpha)">
|
||||||
|
<rect x="0" y="0" width="900" height="900" style="fill:rgb(0%,0%,0%);fill-opacity:0.501961;stroke:none;"/>
|
||||||
|
</g>
|
||||||
|
</mask>
|
||||||
|
<image id="image9" width="314" height="273" xlink:href="data:image/png;base64,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 truncated
|
||||||
|
<clipPath id="clip2">
|
||||||
|
<rect x="0" y="0" width="900" height="900"/>
|
||||||
|
</clipPath>
|
||||||
|
<g id="surface10" clip-path="url(#clip2)">
|
||||||
|
<use xlink:href="#image9" transform="matrix(1.581172,0,0,1.435704,208.067513,213.172682)"/>
|
||||||
|
</g>
|
||||||
|
</defs>
|
||||||
|
<g id="surface2">
|
||||||
|
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear0);" d="M 207.476562 790.304688 C 214.847656 775.902344 220.566406 761.195312 224.71875 746.339844 C 98.894531 677.074219 14.804688 551.554688 14.804688 408.183594 C 14.804688 189.945312 209.648438 13.023438 450 13.023438 C 690.351562 13.023438 885.195312 189.945312 885.195312 408.183594 C 885.195312 626.425781 690.351562 803.34375 450 803.34375 C 417.175781 803.34375 385.199219 800.023438 354.457031 793.761719 C 297.789062 857.851562 209.816406 892.078125 120.78125 886.34375 C 156.996094 862.296875 187.226562 829.847656 207.476562 790.296875 Z M 207.476562 790.304688 "/>
|
||||||
|
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear1);" d="M 207.476562 790.304688 C 214.820312 775.984375 220.496094 761.347656 224.648438 746.582031 C 98.875 677.453125 14.804688 552.058594 14.804688 408.824219 C 14.804688 266.605469 97.683594 141.980469 221.972656 72.5625 C 178.703125 133.902344 153.617188 206.828125 153.617188 285.074219 C 153.617188 502.964844 348.144531 679.59375 588.109375 679.59375 C 671.449219 679.59375 749.296875 658.273438 815.433594 621.332031 C 738.210938 730.792969 603.082031 803.34375 449.296875 803.34375 C 416.679688 803.34375 384.914062 800.058594 354.355469 793.871094 C 297.691406 857.898438 209.757812 892.078125 120.769531 886.34375 C 156.984375 862.296875 187.214844 829.847656 207.46875 790.296875 Z M 207.476562 790.304688 "/>
|
||||||
|
<use xlink:href="#surface6" mask="url(#mask0)"/>
|
||||||
|
<use xlink:href="#surface10" mask="url(#mask1)"/>
|
||||||
|
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 677.402344 225.28125 L 259.328125 225.28125 L 220.765625 309.644531 L 467.875 309.644531 L 220.765625 579.972656 L 638.898438 579.972656 L 677.402344 495.550781 L 430.363281 495.550781 L 677.402344 225.273438 Z M 677.402344 225.28125 "/>
|
||||||
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 250 KiB After Width: | Height: | Size: 14 KiB |
@@ -1,4 +1,4 @@
|
|||||||
.TH HEXCHAT "1" "April 2013" "ZoiteChat @VERSION@" "User Commands"
|
.TH ZOITECHAT "1" "April 2013" "ZoiteChat @VERSION@" "User Commands"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
ZoiteChat \- IRC Client
|
ZoiteChat \- IRC Client
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
|
|||||||
@@ -3,9 +3,8 @@ if get_option('plugin')
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
if get_option('gtk-frontend')
|
if get_option('gtk-frontend')
|
||||||
|
subdir('fonts')
|
||||||
subdir('icons')
|
subdir('icons')
|
||||||
subdir('misc')
|
subdir('misc')
|
||||||
subdir('man')
|
subdir('man')
|
||||||
elif get_option('theme-manager')
|
|
||||||
subdir('misc')
|
|
||||||
endif
|
endif
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Name=ZoiteChat Theme Manager
|
|
||||||
Comment=A simple theme manager for ZoiteChat
|
|
||||||
Exec=thememan %f
|
|
||||||
Icon=zoitechat
|
|
||||||
Terminal=false
|
|
||||||
Type=Application
|
|
||||||
MimeType=application/x-hct;
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
|
|
||||||
<mime-type type="application/x-hct">
|
|
||||||
<comment>ZoiteChat theme archives</comment>
|
|
||||||
<icon name="zoitechat" />
|
|
||||||
<glob pattern="*.hct" weight="100" />
|
|
||||||
</mime-type>
|
|
||||||
</mime-info>
|
|
||||||
@@ -1,163 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<component type="desktop-application">
|
|
||||||
<id>io.github.Hexchat</id>
|
|
||||||
<name>ZoiteChat</name>
|
|
||||||
<launchable type="desktop-id">io.github.Hexchat.desktop</launchable>
|
|
||||||
<developer_name>ZoiteChat</developer_name>
|
|
||||||
<metadata_license>CC0-1.0</metadata_license>
|
|
||||||
<project_license>GPL-2.0+</project_license>
|
|
||||||
<translation type="gettext">zoitechat</translation>
|
|
||||||
<summary>IRC Client</summary>
|
|
||||||
<description>
|
|
||||||
<p>ZoiteChat is an easy to use yet extensible IRC Client. It allows you to securely join multiple networks and talk to users privately or in channels using a customizable interface. You can even transfer files.</p>
|
|
||||||
<p>ZoiteChat supports features such as: DCC, SASL, proxies, spellcheck, alerts, logging, custom themes, and Python/Perl scripts.</p>
|
|
||||||
</description>
|
|
||||||
<url type="homepage">http://zoitechat.github.io</url>
|
|
||||||
<url type="bugtracker">https://github.com/zoitechat/zoitechat</url>
|
|
||||||
<url type="donation">https://goo.gl/jESZvU</url>
|
|
||||||
<url type="help">https://zoitechat.readthedocs.io/en/latest/</url>
|
|
||||||
<screenshots>
|
|
||||||
<screenshot type="default">
|
|
||||||
<image>http://i.imgur.com/tLMguQz.png</image>
|
|
||||||
<caption>Main Chat Window</caption>
|
|
||||||
</screenshot>
|
|
||||||
</screenshots>
|
|
||||||
<provides>
|
|
||||||
<!-- Renamed from this -->
|
|
||||||
<id>zoitechat.desktop</id>
|
|
||||||
</provides>
|
|
||||||
<releases>
|
|
||||||
<release date="2024-02-07" version="2.16.2">
|
|
||||||
<description>
|
|
||||||
<p>This is a minor release with small improvements and fixes:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Add support for SCRAM SASL mechanisms</li>
|
|
||||||
<li>Add option to hide nick from window title</li>
|
|
||||||
<li>Change SERVER command to default to TLS, adding an "-insecure" argument</li>
|
|
||||||
<li>Increase max server password length to 1024</li>
|
|
||||||
<li>Fix detecting some URLS causing a crash</li>
|
|
||||||
</ul>
|
|
||||||
</description>
|
|
||||||
</release>
|
|
||||||
<release date="2022-02-12" version="2.16.1">
|
|
||||||
<description>
|
|
||||||
<p>This is a minor release with mostly bug-fixes:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Add `-NOOVERRIDE` flag to the `GUI COLOR` command</li>
|
|
||||||
<li>Add `-q` (quiet) flag to the `EXECWRITE` command</li>
|
|
||||||
<li>Rename installed icon to match app-id (Fixes notification icon)</li>
|
|
||||||
<li>Fix escaping already escaped URLs when opening them</li>
|
|
||||||
<li>Fix Python scripts not being opened as UTF-8</li>
|
|
||||||
<li>Fix `TIMER` command supporting decimals regardless of locale</li>
|
|
||||||
</ul>
|
|
||||||
</description>
|
|
||||||
</release>
|
|
||||||
<release date="2021-10-01" version="2.16.0">
|
|
||||||
<description>
|
|
||||||
<p>This is a feature release:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Add support for IRCv3 SETNAME, invite-notify, account-tag, standard replies, and UTF8ONLY</li>
|
|
||||||
<li>Add support for strikethrough formatting</li>
|
|
||||||
<li>Fix text clipping issues by respecting font line height</li>
|
|
||||||
<li>Fix URLs not being escaped when opened</li>
|
|
||||||
<li>Fix possible hang when showing notifications</li>
|
|
||||||
<li>Print ChanServ notices in the front tab by default</li>
|
|
||||||
<li>Update network list</li>
|
|
||||||
<li>python: Rewrite plugin improving memory usage and compatibility</li>
|
|
||||||
<li>fishlim: Add support for CBC and other improvements</li>
|
|
||||||
</ul>
|
|
||||||
</description>
|
|
||||||
</release>
|
|
||||||
<release date="2019-12-20" version="2.14.3">
|
|
||||||
<description>
|
|
||||||
<p>This is a bug-fix release:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Fix various incorrect parsing of IRC messages relating to trailing parameters</li>
|
|
||||||
<li>Fix SASL negotiation combined with multi-line cap</li>
|
|
||||||
<li>Fix input box theming with Yaru theme</li>
|
|
||||||
<li>python: Work around Python 3.7 regression causing crash on unload</li>
|
|
||||||
<li>sysinfo: Add support for /etc/os-release</li>
|
|
||||||
<li>sysinfo: Ignore irrelevant mounts when calculating storage size</li>
|
|
||||||
</ul>
|
|
||||||
</description>
|
|
||||||
</release>
|
|
||||||
<release date="2018-08-29" version="2.14.2">
|
|
||||||
<description>
|
|
||||||
<p>This is a minor release:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Remove shift+click to close tab binding</li>
|
|
||||||
<li>Always unminimize when opening from tray</li>
|
|
||||||
<li>Fix some translations containing invalid text events</li>
|
|
||||||
<li>Fix sending server passwords starting with ":"</li>
|
|
||||||
</ul>
|
|
||||||
</description>
|
|
||||||
</release>
|
|
||||||
<release date="2018-03-13" version="2.14.1">
|
|
||||||
<description>
|
|
||||||
<p>This is a very minor bug-fix release:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Fix performance regression</li>
|
|
||||||
</ul>
|
|
||||||
</description>
|
|
||||||
</release>
|
|
||||||
<release date="2018-03-10" version="2.14.0">
|
|
||||||
<description>
|
|
||||||
<p>This is largely a bug fix release though it has some large behind the scenes changes:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Rename data files to use *io.github.Hexchat* name</li>
|
|
||||||
<li>Add option (irc_reconnect_rejoin) to disable auto-rejoin on reconnect</li>
|
|
||||||
<li>Add ability to set custom tray icon separate of app icon</li>
|
|
||||||
<li>Fix Enchant 2.0+ support</li>
|
|
||||||
<li>Fix input box theming with Adwaita-dark</li>
|
|
||||||
<li>Fix custom sounds not respecting omit if away option</li>
|
|
||||||
<li>Fix detecting if a tray doesn't exist on x11</li>
|
|
||||||
<li>Fix cutting off ctcp text after ending \01</li>
|
|
||||||
<li>Fix /ignore not accepting full hosts</li>
|
|
||||||
<li>Fix characters getting cut off when their width changes</li>
|
|
||||||
<li>Fix various possible crashes</li>
|
|
||||||
<li>Change preference window to be scroll-able</li>
|
|
||||||
<li>Remove ctrl+w binding by default</li>
|
|
||||||
<li>doat: Fix channels with / in them</li>
|
|
||||||
<li>fishlim: Fix key exchange</li>
|
|
||||||
<li>fishlim: Fix building against LibreSSL</li>
|
|
||||||
<li>sysinfo: Fix pci.ids file not being found on some distros</li>
|
|
||||||
<li>sysinfo: Make libpci optional</li>
|
|
||||||
<li>lua: Avoid loading the same script multiple times</li>
|
|
||||||
<li>Update translations</li>
|
|
||||||
</ul>
|
|
||||||
</description>
|
|
||||||
</release>
|
|
||||||
<release date="2016-12-10" version="2.12.4">
|
|
||||||
<description>
|
|
||||||
<p>This is another bug fix release:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Fix issue with timers causing ping timeouts</li>
|
|
||||||
<li>Fix building against OpenSSL 1.1</li>
|
|
||||||
<li>Fix /exec output printing invalid utf8</li>
|
|
||||||
<li>Replace doat plugin with an internal command</li>
|
|
||||||
<li>Change how tab colors interact with plugins</li>
|
|
||||||
<li>Enable filtering the beep character by default</li>
|
|
||||||
</ul>
|
|
||||||
</description>
|
|
||||||
</release>
|
|
||||||
<release date="2016-10-22" version="2.12.3">
|
|
||||||
<description>
|
|
||||||
<p>This is a minor bug fix release just cleaning up a few issues:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Fix crash with bad translations</li>
|
|
||||||
<li>Add new mhop command</li>
|
|
||||||
<li>Change ping timeout to 60 by default</li>
|
|
||||||
</ul>
|
|
||||||
</description>
|
|
||||||
</release>
|
|
||||||
</releases>
|
|
||||||
<kudos>
|
|
||||||
<kudo>UserDocs</kudo>
|
|
||||||
<kudo>HiDpiIcon</kudo>
|
|
||||||
<kudo>Notifications</kudo>
|
|
||||||
</kudos>
|
|
||||||
<content_rating type="oars-1.1">
|
|
||||||
<content_attribute id="social-chat">intense</content_attribute>
|
|
||||||
</content_rating>
|
|
||||||
<update_contact>tingping_at_fedoraproject.org</update_contact>
|
|
||||||
</component>
|
|
||||||
@@ -1,41 +1,42 @@
|
|||||||
appdir = join_paths(get_option('datadir'), 'applications')
|
appdir = join_paths(get_option('datadir'), 'applications')
|
||||||
metainfodir = join_paths(get_option('datadir'), 'metainfo')
|
metainfodir = join_paths(get_option('datadir'), 'metainfo')
|
||||||
|
mimedir = join_paths(get_option('datadir'), 'mime', 'packages')
|
||||||
desktop_utils = find_program('desktop-file-validate', required: false)
|
desktop_utils = find_program('desktop-file-validate', required: false)
|
||||||
|
appstreamcli = find_program('appstreamcli', required: false)
|
||||||
|
|
||||||
if get_option('gtk-frontend')
|
if get_option('gtk-frontend')
|
||||||
if get_option('install-appdata')
|
if get_option('install-appdata')
|
||||||
zoitechat_appdata = i18n.merge_file(
|
zoitechat_appdata = i18n.merge_file(
|
||||||
input: 'io.github.Hexchat.appdata.xml.in',
|
input: 'net.zoite.Zoitechat.appdata.xml.in',
|
||||||
output: 'io.github.Hexchat.appdata.xml',
|
output: 'net.zoite.Zoitechat.appdata.xml',
|
||||||
po_dir: '../../po',
|
po_dir: '../../po',
|
||||||
install: true,
|
install: true,
|
||||||
install_dir: metainfodir
|
install_dir: metainfodir
|
||||||
)
|
)
|
||||||
|
|
||||||
appstream_util = find_program('appstream-util', required: false)
|
if appstreamcli.found()
|
||||||
if appstream_util.found()
|
test('Validate net.zoite.Zoitechat.appdata.xml', appstreamcli,
|
||||||
test('Validate io.github.Hexchat.appdata.xml', appstream_util,
|
args: ['validate', zoitechat_appdata]
|
||||||
args: ['validate-relax', zoitechat_appdata]
|
|
||||||
)
|
)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
desktop_conf = configuration_data()
|
desktop_conf = configuration_data()
|
||||||
if dbus_glib_dep.found()
|
if dbus_dep.found()
|
||||||
desktop_conf.set('exec_command', 'zoitechat --existing %U')
|
desktop_conf.set('exec_command', 'zoitechat --existing %U')
|
||||||
else
|
else
|
||||||
desktop_conf.set('exec_command', 'zoitechat %U')
|
desktop_conf.set('exec_command', 'zoitechat %U')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
desktop_file = configure_file(
|
desktop_file = configure_file(
|
||||||
input: 'io.github.Hexchat.desktop.in.in',
|
input: 'net.zoite.Zoitechat.desktop.in.in',
|
||||||
output: 'io.github.Hexchat.desktop.in',
|
output: 'net.zoite.Zoitechat.desktop.in',
|
||||||
configuration: desktop_conf
|
configuration: desktop_conf
|
||||||
)
|
)
|
||||||
|
|
||||||
zoitechat_desktop = i18n.merge_file(
|
zoitechat_desktop = i18n.merge_file(
|
||||||
input: desktop_file,
|
input: desktop_file,
|
||||||
output: 'io.github.Hexchat.desktop',
|
output: 'net.zoite.Zoitechat.desktop',
|
||||||
po_dir: '../../po',
|
po_dir: '../../po',
|
||||||
type: 'desktop',
|
type: 'desktop',
|
||||||
install: true,
|
install: true,
|
||||||
@@ -43,33 +44,12 @@ if get_option('gtk-frontend')
|
|||||||
)
|
)
|
||||||
|
|
||||||
if desktop_utils.found()
|
if desktop_utils.found()
|
||||||
test('Validate io.github.Hexchat.desktop', desktop_utils,
|
test('Validate net.zoite.Zoitechat.desktop', desktop_utils,
|
||||||
args: [zoitechat_desktop]
|
args: [zoitechat_desktop]
|
||||||
)
|
)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if get_option('theme-manager')
|
|
||||||
htm_desktop = i18n.merge_file(
|
|
||||||
input: 'io.github.Hexchat.ThemeManager.desktop.in',
|
|
||||||
output: 'io.github.Hexchat.ThemeManager.desktop',
|
|
||||||
po_dir: '../../po',
|
|
||||||
type: 'desktop',
|
|
||||||
install: true,
|
|
||||||
install_dir: appdir
|
|
||||||
)
|
|
||||||
|
|
||||||
if desktop_utils.found()
|
|
||||||
test('Validate io.github.Hexchat.ThemeManager.desktop', desktop_utils,
|
|
||||||
args: [htm_desktop]
|
|
||||||
)
|
|
||||||
endif
|
|
||||||
|
|
||||||
install_data('io.github.Hexchat.ThemeManager.xml',
|
|
||||||
install_dir: join_paths(get_option('datadir'), 'mime/packages')
|
|
||||||
)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if get_option('plugin')
|
if get_option('plugin')
|
||||||
plugin_metainfo = []
|
plugin_metainfo = []
|
||||||
|
|
||||||
@@ -117,11 +97,18 @@ if get_option('plugin')
|
|||||||
conf.set('SUMMARY', metainfo[1])
|
conf.set('SUMMARY', metainfo[1])
|
||||||
conf.set('LICENSE', metainfo[2])
|
conf.set('LICENSE', metainfo[2])
|
||||||
|
|
||||||
configure_file(
|
plugin_appdata = configure_file(
|
||||||
input: 'io.github.Hexchat.Plugin.metainfo.xml.in',
|
input: 'net.zoite.Zoitechat.Plugin.metainfo.xml.in',
|
||||||
output: 'io.github.Hexchat.Plugin.@0@.metainfo.xml'.format(name),
|
output: 'net.zoite.Zoitechat.Plugin.@0@.metainfo.xml'.format(name),
|
||||||
configuration: conf,
|
configuration: conf,
|
||||||
install_dir: get_option('install-plugin-metainfo') ? metainfodir : '',
|
install_dir: get_option('install-plugin-metainfo') ? metainfodir : '',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if appstreamcli.found()
|
||||||
|
test('Validate net.zoite.Zoitechat.Plugin.@0@.metainfo.xml'.format(name), appstreamcli,
|
||||||
|
args: ['validate', plugin_appdata]
|
||||||
|
)
|
||||||
|
endif
|
||||||
|
|
||||||
endforeach
|
endforeach
|
||||||
endif
|
endif
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<component type="addon">
|
<component type="addon">
|
||||||
<id>io.github.Hexchat.Plugin.@NAME@</id>
|
<id>net.zoite.Zoitechat.Plugin.@NAME@</id>
|
||||||
<extends>io.github.Hexchat</extends>
|
<extends>net.zoite.Zoitechat</extends>
|
||||||
<name>@NAME@ Plugin</name>
|
<name>@NAME@ Plugin</name>
|
||||||
<summary>@SUMMARY@</summary>
|
<summary>@SUMMARY@</summary>
|
||||||
<url type="homepage">https://zoitechat.github.io/</url>
|
<url type="homepage">https://zoitechat.org/</url>
|
||||||
<project_license>@LICENSE@</project_license>
|
<project_license>@LICENSE@</project_license>
|
||||||
<metadata_license>CC0-1.0</metadata_license>
|
<metadata_license>CC0-1.0</metadata_license>
|
||||||
<update_contact>tingping_AT_fedoraproject.org</update_contact>
|
<update_contact>deepend_AT_zoite.net</update_contact>
|
||||||
</component>
|
</component>
|
||||||
@@ -0,0 +1,466 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<component type="desktop-application">
|
||||||
|
<id>net.zoite.Zoitechat</id>
|
||||||
|
<name>ZoiteChat</name>
|
||||||
|
<launchable type="desktop-id">net.zoite.Zoitechat.desktop</launchable>
|
||||||
|
|
||||||
|
<developer id="net.zoite">
|
||||||
|
<name translate="no">ZoiteChat</name>
|
||||||
|
</developer>
|
||||||
|
|
||||||
|
<metadata_license>CC0-1.0</metadata_license>
|
||||||
|
<project_license>GPL-2.0+</project_license>
|
||||||
|
<translation type="gettext">zoitechat</translation>
|
||||||
|
<summary>IRC Client</summary>
|
||||||
|
<description>
|
||||||
|
<p>ZoiteChat is an easy to use yet extensible IRC Client based on Hexchat. It allows you to securely join multiple networks and talk to users privately or in channels using a customizable interface. You can even transfer files.</p>
|
||||||
|
<p>ZoiteChat supports features such as: DCC, SASL, proxies, spellcheck, alerts, logging, custom themes, and Python/Perl scripts.</p>
|
||||||
|
</description>
|
||||||
|
<url type="homepage">https://zoitechat.org</url>
|
||||||
|
<url type="bugtracker">https://github.com/zoitechat/zoitechat</url>
|
||||||
|
<url type="help">https://docs.zoitechat.org/en/latest/</url>
|
||||||
|
<screenshots>
|
||||||
|
<screenshot type="default">
|
||||||
|
<image>https://zoitechat.org/assets/img/zoitechat-screenshot.png</image>
|
||||||
|
<caption>Main Chat Window</caption>
|
||||||
|
</screenshot>
|
||||||
|
</screenshots>
|
||||||
|
<provides>
|
||||||
|
<id>zoitechat.desktop</id>
|
||||||
|
</provides>
|
||||||
|
<releases>
|
||||||
|
<release date="2026-09-15" version="2.19.1">
|
||||||
|
<description>
|
||||||
|
<ul>
|
||||||
|
<li>Fixed /msg messages showing twice on servers using IRCv3 <code>echo-message</code>.</li>
|
||||||
|
<li>Fixed escaping a leading command slash so <code>//text</code> sends <code>/text</code> as normal chat.</li>
|
||||||
|
<li>Fixed automatic away clearing when sending messages on servers using <code>echo-message</code>.</li>
|
||||||
|
<li>Fixed other users' away status not updating until rejoining a channel when <code>away-notify</code> updates are missed.</li>
|
||||||
|
<li>Fixed private messages and <code>/me</code> actions being routed to the wrong window when using WeeChat's IRC relay, while preserving channel ACTION routing.</li>
|
||||||
|
<li>Fixed a Flatpak startup error caused by the D-Bus service still using the old HexChat app ID.</li>
|
||||||
|
<li>Fixed optional Windows 10 theme downloads in the Windows installer.</li>
|
||||||
|
<li>Fixed the GTK warning when switching from channel tabs to the channel tree.</li>
|
||||||
|
<li>Fixed GTK3 theme archive root detection so themes with an <code>index.theme</code> file are preferred correctly.</li>
|
||||||
|
<li>Fixed source-build configuration when plugin AppStream metadata installation is disabled, and corrected the minimum Meson version to 0.59.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-07-28" version="2.19.0">
|
||||||
|
<description>
|
||||||
|
<ul>
|
||||||
|
<li>Added Python 3.8 compatibility for older Windows releases.</li>
|
||||||
|
<li>Added on-demand SASL password prompts, including renewed prompts after reconnecting.</li>
|
||||||
|
<li>Corrected NickServ authentication to use the decrypted password for the active network.</li>
|
||||||
|
<li>Made system theme matching the default and polished GTK3 theme integration.</li>
|
||||||
|
<li>Applied more settings changes immediately, reducing the need to restart ZoiteChat.</li>
|
||||||
|
<li>Added descriptive tooltips to the color picker choices and refined default text-event colors.</li>
|
||||||
|
<li>Stabilized channel tree font handling across palette and theme updates.</li>
|
||||||
|
<li>Corrected the chat scrollbar increment used by its arrow buttons.</li>
|
||||||
|
<li>Improved Windows URL launching through the native shell.</li>
|
||||||
|
<li>Restored expected minimize behavior when clicking ZoiteChat on the Windows taskbar.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-06-29" version="2.18.3">
|
||||||
|
<description>
|
||||||
|
<ul>
|
||||||
|
<li>Added IRCv3 support for message tags, echo-message, typing notifications, and replies.</li>
|
||||||
|
<li>Restored the accept-invalid-cert TLS bypass behavior.</li>
|
||||||
|
<li>Replaced legacy IPv4 APIs and added support for OpenSSL 4 APIs.</li>
|
||||||
|
<li>Snapshot Python hooks during plugin unload for safer plugin shutdown.</li>
|
||||||
|
<li>Fixed Windows GtkStatusIcon tray menu popup behavior.</li>
|
||||||
|
<li>Fixed self-echoed private messages routing to the target tab.</li>
|
||||||
|
<li>Fixed the lag ping timeout window.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-06-20" version="2.18.2">
|
||||||
|
<description>
|
||||||
|
<p>Security and connections:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Improved TLS, certificate and hostname validation, FiSHLiM OpenSSL handling, keyring support, and DCC host lookups.</li>
|
||||||
|
</ul>
|
||||||
|
<p>FiSHLiM:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added a GTK key manager with context-menu access and clearer channel/private-message key handling.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Interface and preferences:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Improved keybind customization, reset support, channel-name switching, <code>/server -noproxy</code>, and stale-link ping checks.</li>
|
||||||
|
<li>Refined GTK behavior with native file choosers, topic layout preferences, timestamp/date tooltips, text scroll controls, and aligned network meters.</li>
|
||||||
|
<li>Added privacy and display options for hiding join/part hostmasks and controlling topic/multiline layout.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Fixes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fixed tray restore, DBus unload handling, GTK3 theme refresh/saving, topic relayout, and tab switcher compatibility.</li>
|
||||||
|
<li>Updated project documentation.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-05-21" version="2.18.1">
|
||||||
|
<description>
|
||||||
|
<ul>
|
||||||
|
<li>Migrated D-Bus handling to GDBus.</li>
|
||||||
|
<li>Enabled mouse wheel channel switching by default and consumed handled tab wheel events.</li>
|
||||||
|
<li>Switched main panes to native GTK scrollbars.</li>
|
||||||
|
<li>Tightened userlist button and meter layout.</li>
|
||||||
|
<li>Made the native Windows file chooser modal.</li>
|
||||||
|
<li>Set the Windows AppUserModelID before GTK startup.</li>
|
||||||
|
<li>Updated Windows CI to use the new GTK3 bundle zip.</li>
|
||||||
|
<li>Updated Windows installer architecture checks to use x64-compatible detection.</li>
|
||||||
|
<li>Bumped the Flatpak Perl runtime to 5.42.2.</li>
|
||||||
|
<li>Fixed palette color reads to preserve base GTK state.</li>
|
||||||
|
<li>Fixed auto-replace whole-word matching.</li>
|
||||||
|
<li>Fixed checksum file stream cleanup.</li>
|
||||||
|
<li>Fixed byte handling in the Python console.</li>
|
||||||
|
<li>Guarded GTK drag-and-drop handlers against null windows.</li>
|
||||||
|
<li>Fixed size_t and integer handling issues.</li>
|
||||||
|
<li>Removed the Winamp plugin.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-04-20" version="2.18.0">
|
||||||
|
<description>
|
||||||
|
<p>Tabs and navigation:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added optional close buttons on tabs.</li>
|
||||||
|
<li>Added Ctrl+W to close tabs and Ctrl+Shift+T to reopen recently closed tabs.</li>
|
||||||
|
<li>Improved channel tree behavior by ignoring collapsed parent selections.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Themes and appearance:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Expanded theme import support with .hct support in colors.conf import.</li>
|
||||||
|
<li>Added pevent import support from .hct theme files and improved import result messaging.</li>
|
||||||
|
<li>Expanded palette and selection CSS styling for better theme consistency.</li>
|
||||||
|
<li>Auto-sizes the topic bar to wrapped text for better multi-line topic handling.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Links and text handling:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Refined command-character parsing when pasting path-like text.</li>
|
||||||
|
<li>Tightened topic link detection and opening rules.</li>
|
||||||
|
<li>Added Public Suffix List validation for host links to reduce bad link matches.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Packaging and platform integration:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Sanitized the Linux open environment for AppImage builds and added safer fallback handling.</li>
|
||||||
|
<li>Labeled Windows installer runtimes with exact versions.</li>
|
||||||
|
<li>Fixed the notification icon and corrected the Flatpak screenshot asset.</li>
|
||||||
|
<li>Improved AppStream metainfo validation.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-03-30" version="2.18.0~pre6">
|
||||||
|
<description>
|
||||||
|
<p>GTK theme and UI:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Applied app theme CSS to the menubar consistently across the app.</li>
|
||||||
|
<li>Restored horizontal separator lines in menus.</li>
|
||||||
|
<li>Fixed duplicate dialog buttons persisting in the UI.</li>
|
||||||
|
<li>Fixed GTK auto-replace cursor snapback.</li>
|
||||||
|
<li>Restored hiding of formatting control bytes so only formatted output is shown.</li>
|
||||||
|
<li>Fixed xtext link hit-testing coordinates.</li>
|
||||||
|
<li>Fixed short-palette fallback clobbering tab colors.</li>
|
||||||
|
<li>Added a None option for resetting the GTK3 theme back to system/default behavior.</li>
|
||||||
|
<li>Wrapped the topic bar in a scroller with bounded height.</li>
|
||||||
|
<li>Fixed fallback GTK menu highlight states.</li>
|
||||||
|
<li>Applied configured font preferences to the topic bar, channel tree, user list, and input box.</li>
|
||||||
|
<li>Removed unused UI icons.</li>
|
||||||
|
<li>Added close buttons to tabs.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Preferences and search:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Lazy-loads Preferences pages on first open for faster dialog startup.</li>
|
||||||
|
<li>Added channel-only mode to Ctrl+F search.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Security and certificates:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added one-click client SSL certificate tools, including generation with P-256 certificates.</li>
|
||||||
|
<li>Added client SSL certificate import support in the network editor.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Windows and packaging:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Improved Windows installer VC++ redistributable handling by failing loudly when missing and using the official Microsoft download endpoint.</li>
|
||||||
|
<li>Fixed Windows locale path resolution in both GTK and text frontends.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Other changes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added 99-color support.</li>
|
||||||
|
<li>Disabled disk info in sysinfo.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-03-22" version="2.18.0~pre5">
|
||||||
|
<description>
|
||||||
|
<p>Preferences and config saving:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Overhauled preferences/config saving: fully staged and transactional, debounced with flush on close, write failures now surfaced.</li>
|
||||||
|
</ul>
|
||||||
|
<p>GTK theme and UI:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Overhauled GTK theme handling: live preview, correct colour reset persistence, proper <code>file://</code> import paths, consistent menubar CSS.</li>
|
||||||
|
<li>Fixed GTK entry scroll artifact in the input box.</li>
|
||||||
|
<li>Split topic/mode rows in channel bar, tighten spacing, persist userlist column widths.</li>
|
||||||
|
<li>Preserve saved right-pane size on first layout.</li>
|
||||||
|
<li>Fixed sounds prefs section.</li>
|
||||||
|
<li>Fixed chanview tree layout and header alignment; tighten topic URL hit-testing.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Tray:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Hardened tray menu lifetime; fixed stale pointer crash on menu destruction.</li>
|
||||||
|
<li>Fixed AppIndicator tray init for Wayland/source builds; skip redundant X11 tray probe for AppIndicator builds.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Build and packaging:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Dropped <code>realpath()</code> in favour of GLib-only absolute path build.</li>
|
||||||
|
<li>Made About dialog links explicit; added GPL licence URL.</li>
|
||||||
|
<li>Added licence headers to new source files.</li>
|
||||||
|
<li>Windows installer: fixed VC++ redist URL, added non-plugin download fallback, switched to registry-based runtime detection.</li>
|
||||||
|
<li>Made <code>libayatana-appindicator</code> a required dep in PKGBUILD.</li>
|
||||||
|
<li>Cleaned up Meson libperl detection.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-03-14" version="2.18.0~pre4">
|
||||||
|
<description>
|
||||||
|
<p>UI fixes, topic bar improvements, and selection styling updates:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fixed a regression where <code>Ctrl+A</code> could incorrectly mark you away instead of selecting all text.</li>
|
||||||
|
<li>Fixed a crash when toggling the GUI with <code>F9</code> or the menu toggle action.</li>
|
||||||
|
<li>Fixed sidebar collapse behavior on fresh installs.</li>
|
||||||
|
<li>Added multiline topic bar support with clickable URLs.</li>
|
||||||
|
<li>Improved GTK selection styling so text selection is shown visually in the topic bar and chat input box.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-03-13" version="2.18.0~pre3">
|
||||||
|
<description>
|
||||||
|
<p>GTK3 theming, UI, and platform improvements:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added a major GTK3 theming overhaul with improved theme importing, inheritance, rollback safety, and caching.</li>
|
||||||
|
<li>Merged theme settings into Appearance and added a new Advanced section.</li>
|
||||||
|
<li>Added a full color editor and improved widget, chat text, userlist, and tab color handling.</li>
|
||||||
|
<li>Added <code>colors.conf</code> import support and improved compatibility with older themes.</li>
|
||||||
|
<li>Improved chat background image handling and switched to a native file picker.</li>
|
||||||
|
<li>Bundled more built-in icons, including OK/Cancel, and improved emoji fallback support.</li>
|
||||||
|
<li>Embedded the app SVG icon and improved headerbar icon handling.</li>
|
||||||
|
<li>Fixed KDE Wayland alert flashing.</li>
|
||||||
|
<li>Fixed tray hide/restore labels so tray state stays in sync with the real window state.</li>
|
||||||
|
<li>Fixed several GTK3 styling issues, warning spam, and imported CSS cleanup problems.</li>
|
||||||
|
<li>Removed menubar icons and simplified Away menu behavior.</li>
|
||||||
|
<li>Improved Flatpak behavior on KDE and enabled Python/Perl plugin support.</li>
|
||||||
|
<li>Manual addons now persist properly by being copied into the user addon directory.</li>
|
||||||
|
<li>Updated the bundled server list and added a checker script for server list maintenance.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-02-25" version="2.18.0~pre2">
|
||||||
|
<description>
|
||||||
|
<p>Compatibility and UI improvements:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added HexChat plugin compatibility improvements.</li>
|
||||||
|
<li>Fixed the user info right-click menu so it updates properly.</li>
|
||||||
|
<li>Added support for emoji characters in alert highlights.</li>
|
||||||
|
<li>Removed remaining unused GTK2 code paths.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-02-16" version="2.18.0~pre1">
|
||||||
|
<description>
|
||||||
|
<p>Packaging and GTK3 improvements:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Switched Debian package builds to GTK 3.</li>
|
||||||
|
<li>Added split-package install manifests for Debian outputs.</li>
|
||||||
|
<li>Fixed unassigned Debian package files (man page and MIME XML).</li>
|
||||||
|
<li>Updated Debian CI artifact upload handling for GitHub Actions v4.</li>
|
||||||
|
<li>Improved GTK3 channel/user list font consistency when applying theme updates.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-02-03" version="2.17.4">
|
||||||
|
<description>
|
||||||
|
<p>Fixes and minor features:</p>
|
||||||
|
<ul>
|
||||||
|
<li>STS handling now persists server policies, enforces upgrades more consistently, and falls back to current ports when needed.</li>
|
||||||
|
<li>Windows build workflow updated (MSYS2 setup changes) and OpenSSL trust store handling tightened for safer TLS connections.</li>
|
||||||
|
<li>Reduced GLib coupling in multiple Windows subsystems (spellcheck, history, sysinfo) plus small stability fixes.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-01-17" version="2.17.3">
|
||||||
|
<description>
|
||||||
|
<p>Fixes and minor features:</p>
|
||||||
|
<ul>
|
||||||
|
<li>SNI extension handling: RFC 6066-compliant validation (ASCII-only hostnames; skips IP literals) before setting SNI on SSL connections.</li>
|
||||||
|
<li>Logs an SSL message when an invalid SNI host name is skipped to aid troubleshooting.</li>
|
||||||
|
<li>Theme support integrated into Preferences; removed the standalone Theme Manager application.</li>
|
||||||
|
<li>Added colour emoji support and an emoji selector menu.</li>
|
||||||
|
<li>Updated bundled Python to v3.14.2.</li>
|
||||||
|
<li>Fixed newline issues affecting syncing of Windows/Linux server list files.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Known issues:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Opening a theme file (.zct or .hct) spawns a new ZoiteChat instance during import; import succeeds but leaves an extra window open.</li>
|
||||||
|
<li>Colour emojis render in all builds except Windows (GTK2 limitation/issue on Windows).</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-01-13" version="2.17.2">
|
||||||
|
<description>
|
||||||
|
<p>This is a release with small fixes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Changes to Auto Replace. Will make matches in almost any scenario, Pasted, typed, beginning, end or middle of words/scentences etc.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-01-12" version="2.17.1">
|
||||||
|
<description>
|
||||||
|
<p>This is a release with small improvements and fixes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>First implementation of dark mode.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2026-01-06" version="2.17.0">
|
||||||
|
<description>
|
||||||
|
<p>This is a minor release with small improvements and fixes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Start of Zoitechat code base. Forked from Hexchat.</li>
|
||||||
|
<li>Fixed flatpak python plugin causing freezing.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2024-02-07" version="2.16.2">
|
||||||
|
<description>
|
||||||
|
<p>This is a minor release with small improvements and fixes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Add support for SCRAM SASL mechanisms</li>
|
||||||
|
<li>Add option to hide nick from window title</li>
|
||||||
|
<li>Change SERVER command to default to TLS, adding an "-insecure" argument</li>
|
||||||
|
<li>Increase max server password length to 1024</li>
|
||||||
|
<li>Fix detecting some URLS causing a crash</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2022-02-12" version="2.16.1">
|
||||||
|
<description>
|
||||||
|
<p>This is a minor release with mostly bug-fixes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Add `-NOOVERRIDE` flag to the `GUI COLOR` command</li>
|
||||||
|
<li>Add `-q` (quiet) flag to the `EXECWRITE` command</li>
|
||||||
|
<li>Rename installed icon to match app-id (Fixes notification icon)</li>
|
||||||
|
<li>Fix escaping already escaped URLs when opening them</li>
|
||||||
|
<li>Fix Python scripts not being opened as UTF-8</li>
|
||||||
|
<li>Fix `TIMER` command supporting decimals regardless of locale</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2021-10-01" version="2.16.0">
|
||||||
|
<description>
|
||||||
|
<p>This is a feature release:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Add support for IRCv3 SETNAME, invite-notify, account-tag, standard replies, and UTF8ONLY</li>
|
||||||
|
<li>Add support for strikethrough formatting</li>
|
||||||
|
<li>Fix text clipping issues by respecting font line height</li>
|
||||||
|
<li>Fix URLs not being escaped when opened</li>
|
||||||
|
<li>Fix possible hang when showing notifications</li>
|
||||||
|
<li>Print ChanServ notices in the front tab by default</li>
|
||||||
|
<li>Update network list</li>
|
||||||
|
<li>python: Rewrite plugin improving memory usage and compatibility</li>
|
||||||
|
<li>fishlim: Add support for CBC and other improvements</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2019-12-20" version="2.14.3">
|
||||||
|
<description>
|
||||||
|
<p>This is a bug-fix release:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fix various incorrect parsing of IRC messages relating to trailing parameters</li>
|
||||||
|
<li>Fix SASL negotiation combined with multi-line cap</li>
|
||||||
|
<li>Fix input box theming with Yaru theme</li>
|
||||||
|
<li>python: Work around Python 3.7 regression causing crash on unload</li>
|
||||||
|
<li>sysinfo: Add support for /etc/os-release</li>
|
||||||
|
<li>sysinfo: Ignore irrelevant mounts when calculating storage size</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2018-08-29" version="2.14.2">
|
||||||
|
<description>
|
||||||
|
<p>This is a minor release:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Remove shift+click to close tab binding</li>
|
||||||
|
<li>Always unminimize when opening from tray</li>
|
||||||
|
<li>Fix some translations containing invalid text events</li>
|
||||||
|
<li>Fix sending server passwords starting with ":"</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2018-03-13" version="2.14.1">
|
||||||
|
<description>
|
||||||
|
<p>This is a very minor bug-fix release:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fix performance regression</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2018-03-10" version="2.14.0">
|
||||||
|
<description>
|
||||||
|
<p>This is largely a bug fix release though it has some large behind the scenes changes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Rename data files to use *net.zoite.Zoitechat* name</li>
|
||||||
|
<li>Add option (irc_reconnect_rejoin) to disable auto-rejoin on reconnect</li>
|
||||||
|
<li>Add ability to set custom tray icon separate of app icon</li>
|
||||||
|
<li>Fix Enchant 2.0+ support</li>
|
||||||
|
<li>Fix input box theming with Adwaita-dark</li>
|
||||||
|
<li>Fix custom sounds not respecting omit if away option</li>
|
||||||
|
<li>Fix detecting if a tray doesn't exist on x11</li>
|
||||||
|
<li>Fix cutting off ctcp text after ending \01</li>
|
||||||
|
<li>Fix /ignore not accepting full hosts</li>
|
||||||
|
<li>Fix characters getting cut off when their width changes</li>
|
||||||
|
<li>Fix various possible crashes</li>
|
||||||
|
<li>Change preference window to be scroll-able</li>
|
||||||
|
<li>Remove ctrl+w binding by default</li>
|
||||||
|
<li>doat: Fix channels with / in them</li>
|
||||||
|
<li>fishlim: Fix key exchange</li>
|
||||||
|
<li>fishlim: Fix building against LibreSSL</li>
|
||||||
|
<li>sysinfo: Fix pci.ids file not being found on some distros</li>
|
||||||
|
<li>sysinfo: Make libpci optional</li>
|
||||||
|
<li>lua: Avoid loading the same script multiple times</li>
|
||||||
|
<li>Update translations</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2016-12-10" version="2.12.4">
|
||||||
|
<description>
|
||||||
|
<p>This is another bug fix release:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fix issue with timers causing ping timeouts</li>
|
||||||
|
<li>Fix building against OpenSSL 1.1</li>
|
||||||
|
<li>Fix /exec output printing invalid utf8</li>
|
||||||
|
<li>Replace doat plugin with an internal command</li>
|
||||||
|
<li>Change how tab colors interact with plugins</li>
|
||||||
|
<li>Enable filtering the beep character by default</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release date="2016-10-22" version="2.12.3">
|
||||||
|
<description>
|
||||||
|
<p>This is a minor bug fix release just cleaning up a few issues:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fix crash with bad translations</li>
|
||||||
|
<li>Add new mhop command</li>
|
||||||
|
<li>Change ping timeout to 60 by default</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
</releases>
|
||||||
|
<kudos>
|
||||||
|
<kudo>UserDocs</kudo>
|
||||||
|
<kudo>HiDpiIcon</kudo>
|
||||||
|
<kudo>Notifications</kudo>
|
||||||
|
</kudos>
|
||||||
|
<content_rating type="oars-1.1">
|
||||||
|
<content_attribute id="social-chat">intense</content_attribute>
|
||||||
|
</content_rating>
|
||||||
|
<update_contact>deepend_at_zoite.net</update_contact>
|
||||||
|
</component>
|
||||||
@@ -4,12 +4,12 @@ GenericName=IRC Client
|
|||||||
Comment=Chat with other people online
|
Comment=Chat with other people online
|
||||||
Keywords=IM;Chat;
|
Keywords=IM;Chat;
|
||||||
Exec=@exec_command@
|
Exec=@exec_command@
|
||||||
Icon=io.github.Hexchat
|
Icon=net.zoite.Zoitechat
|
||||||
Terminal=false
|
Terminal=false
|
||||||
Type=Application
|
Type=Application
|
||||||
Categories=GTK;Network;IRCClient;
|
Categories=GTK;Network;IRCClient;
|
||||||
StartupNotify=true
|
StartupNotify=true
|
||||||
StartupWMClass=Hexchat
|
StartupWMClass=net.zoite.Zoitechat
|
||||||
X-GNOME-UsesNotifications=true
|
X-GNOME-UsesNotifications=true
|
||||||
MimeType=x-scheme-handler/irc;x-scheme-handler/ircs;
|
MimeType=x-scheme-handler/irc;x-scheme-handler/ircs;
|
||||||
Actions=SafeMode;
|
Actions=SafeMode;
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
|
||||||
|
</mime-info>
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
<gresources>
|
<gresources>
|
||||||
<gresource prefix="/icons">
|
<gresource prefix="/icons">
|
||||||
<file alias="zoitechat.png" preprocess="to-pixdata">icons/zoitechat.png</file>
|
<file alias="zoitechat.png" preprocess="to-pixdata">icons/zoitechat.png</file>
|
||||||
|
<file alias="zoitechat.svg">icons/zoitechat.svg</file>
|
||||||
<file alias="book.png" preprocess="to-pixdata">icons/book.png</file>
|
<file alias="book.png" preprocess="to-pixdata">icons/book.png</file>
|
||||||
|
|
||||||
<file alias="ulist_voice.png" preprocess="to-pixdata">icons/ulist_voice.png</file>
|
<file alias="ulist_voice.png" preprocess="to-pixdata">icons/ulist_voice.png</file>
|
||||||
@@ -20,5 +21,7 @@
|
|||||||
<file alias="tree_dialog.png" preprocess="to-pixdata">icons/tree_dialog.png</file>
|
<file alias="tree_dialog.png" preprocess="to-pixdata">icons/tree_dialog.png</file>
|
||||||
<file alias="tree_server.png" preprocess="to-pixdata">icons/tree_server.png</file>
|
<file alias="tree_server.png" preprocess="to-pixdata">icons/tree_server.png</file>
|
||||||
<file alias="tree_util.png" preprocess="to-pixdata">icons/tree_util.png</file>
|
<file alias="tree_util.png" preprocess="to-pixdata">icons/tree_util.png</file>
|
||||||
|
|
||||||
|
|
||||||
</gresource>
|
</gresource>
|
||||||
</gresources>
|
</gresources>
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
# Source https://coderwall.com/p/wws2uq
|
||||||
|
sudo: false
|
||||||
|
language: python
|
||||||
|
python:
|
||||||
|
- "2.7"
|
||||||
|
cache:
|
||||||
|
pip: true
|
||||||
|
custom_install: true
|
||||||
|
# command to install dependencies
|
||||||
|
install: pip install --upgrade Sphinx
|
||||||
|
# command to run tests
|
||||||
|
script: sphinx-build -n -b html -d _build/doctrees . _build/html
|
||||||
|
# Flags used here, not in `make html`:
|
||||||
|
# -n Run in nit-picky mode. Currently, this generates warnings for all missing references.
|
||||||
|
# -W Turn warnings into errors. This means that the build stops at the first warning and sphinx-build exits with exit status 1.
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
[main]
|
||||||
|
host = https://www.transifex.com
|
||||||
|
type = PO
|
||||||
|
|
||||||
|
[zoitechat-documentation.addons]
|
||||||
|
file_filter = po/<lang>/LC_MESSAGES/addons.po
|
||||||
|
source_file = _build/locale/addons.pot
|
||||||
|
source_lang = en
|
||||||
|
|
||||||
|
[zoitechat-documentation.appearance]
|
||||||
|
file_filter = po/<lang>/LC_MESSAGES/appearance.po
|
||||||
|
source_file = _build/locale/appearance.pot
|
||||||
|
source_lang = en
|
||||||
|
|
||||||
|
[zoitechat-documentation.building]
|
||||||
|
file_filter = po/<lang>/LC_MESSAGES/building.po
|
||||||
|
source_file = _build/locale/building.pot
|
||||||
|
source_lang = en
|
||||||
|
|
||||||
|
[zoitechat-documentation.changelog]
|
||||||
|
file_filter = po/<lang>/LC_MESSAGES/changelog.po
|
||||||
|
source_file = _build/locale/changelog.pot
|
||||||
|
source_lang = en
|
||||||
|
|
||||||
|
[zoitechat-documentation.commands]
|
||||||
|
file_filter = po/<lang>/LC_MESSAGES/commands.po
|
||||||
|
source_file = _build/locale/commands.pot
|
||||||
|
source_lang = en
|
||||||
|
|
||||||
|
#[zoitechat-documentation.developers]
|
||||||
|
#file_filter = po/<lang>/LC_MESSAGES/developers.po
|
||||||
|
#source_file = _build/locale/developers.pot
|
||||||
|
#source_lang = en
|
||||||
|
|
||||||
|
[zoitechat-documentation.faq]
|
||||||
|
file_filter = po/<lang>/LC_MESSAGES/faq.po
|
||||||
|
source_file = _build/locale/faq.pot
|
||||||
|
source_lang = en
|
||||||
|
|
||||||
|
#[zoitechat-documentation.getting_started]
|
||||||
|
#file_filter = po/<lang>/LC_MESSAGES/getting_started.po
|
||||||
|
#source_file = _build/locale/getting_started.pot
|
||||||
|
#source_lang = en
|
||||||
|
|
||||||
|
#[zoitechat-documentation.helping]
|
||||||
|
#file_filter = po/<lang>/LC_MESSAGES/helping.po
|
||||||
|
#source_file = _build/locale/helping.pot
|
||||||
|
#source_lang = en
|
||||||
|
|
||||||
|
#[zoitechat-documentation.index]
|
||||||
|
#file_filter = po/<lang>/LC_MESSAGES/index.po
|
||||||
|
#source_file = _build/locale/index.pot
|
||||||
|
#source_lang = en
|
||||||
|
|
||||||
|
#[zoitechat-documentation.perl_modules]
|
||||||
|
#file_filter = po/<lang>/LC_MESSAGES/perl_modules.po
|
||||||
|
#source_file = _build/locale/perl_modules.pot
|
||||||
|
#source_lang = en
|
||||||
|
|
||||||
|
#[zoitechat-documentation.plugins]
|
||||||
|
#file_filter = po/<lang>/LC_MESSAGES/plugins.po
|
||||||
|
#source_file = _build/locale/plugins.pot
|
||||||
|
#source_lang = en
|
||||||
|
|
||||||
|
#[zoitechat-documentation.script_dbus]
|
||||||
|
#file_filter = po/<lang>/LC_MESSAGES/script_dbus.po
|
||||||
|
#source_file = _build/locale/script_dbus.pot
|
||||||
|
#source_lang = en
|
||||||
|
|
||||||
|
#[zoitechat-documentation.script_javascript]
|
||||||
|
#file_filter = po/<lang>/LC_MESSAGES/script_javascript.po
|
||||||
|
#source_file = _build/locale/script_javascript.pot
|
||||||
|
#source_lang = en
|
||||||
|
|
||||||
|
#[zoitechat-documentation.script_perl]
|
||||||
|
#file_filter = po/<lang>/LC_MESSAGES/script_perl.po
|
||||||
|
#source_file = _build/locale/script_perl.pot
|
||||||
|
#source_lang = en
|
||||||
|
|
||||||
|
#[zoitechat-documentation.script_python]
|
||||||
|
#file_filter = po/<lang>/LC_MESSAGES/script_python.po
|
||||||
|
#source_file = _build/locale/script_python.pot
|
||||||
|
#source_lang = en
|
||||||
|
|
||||||
|
[zoitechat-documentation.settings]
|
||||||
|
file_filter = po/<lang>/LC_MESSAGES/settings.po
|
||||||
|
source_file = _build/locale/settings.pot
|
||||||
|
source_lang = en
|
||||||
|
|
||||||
|
[zoitechat-documentation.tips]
|
||||||
|
file_filter = po/<lang>/LC_MESSAGES/tips.po
|
||||||
|
source_file = _build/locale/tips.pot
|
||||||
|
source_lang = en
|
||||||
|
|
||||||
@@ -0,0 +1,157 @@
|
|||||||
|
# Makefile for Sphinx documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
# You can set these variables from the command line.
|
||||||
|
SPHINXOPTS =
|
||||||
|
SPHINXBUILD = sphinx-build
|
||||||
|
PAPER =
|
||||||
|
BUILDDIR = _build
|
||||||
|
|
||||||
|
# Internal variables.
|
||||||
|
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||||
|
PAPEROPT_letter = -D latex_paper_size=letter
|
||||||
|
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||||
|
# the i18n builder cannot share the environment and doctrees with the others
|
||||||
|
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||||
|
|
||||||
|
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "Please use \`make <target>' where <target> is one of"
|
||||||
|
@echo " html to make standalone HTML files"
|
||||||
|
@echo " dirhtml to make HTML files named index.html in directories"
|
||||||
|
@echo " singlehtml to make a single large HTML file"
|
||||||
|
@echo " pickle to make pickle files"
|
||||||
|
@echo " json to make JSON files"
|
||||||
|
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||||
|
@echo " qthelp to make HTML files and a qthelp project"
|
||||||
|
@echo " devhelp to make HTML files and a Devhelp project"
|
||||||
|
@echo " epub to make an epub"
|
||||||
|
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||||
|
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||||
|
@echo " text to make text files"
|
||||||
|
@echo " man to make manual pages"
|
||||||
|
@echo " texinfo to make Texinfo files"
|
||||||
|
@echo " info to make Texinfo files and run them through makeinfo"
|
||||||
|
@echo " gettext to make PO message catalogs"
|
||||||
|
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||||
|
@echo " linkcheck to check all external links for integrity"
|
||||||
|
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm -rf $(BUILDDIR)/*
|
||||||
|
|
||||||
|
html:
|
||||||
|
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||||
|
|
||||||
|
dirhtml:
|
||||||
|
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||||
|
|
||||||
|
singlehtml:
|
||||||
|
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||||
|
|
||||||
|
pickle:
|
||||||
|
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can process the pickle files."
|
||||||
|
|
||||||
|
json:
|
||||||
|
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can process the JSON files."
|
||||||
|
|
||||||
|
htmlhelp:
|
||||||
|
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||||
|
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||||
|
|
||||||
|
qthelp:
|
||||||
|
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||||
|
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||||
|
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/ZoiteChat.qhcp"
|
||||||
|
@echo "To view the help file:"
|
||||||
|
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ZoiteChat.qhc"
|
||||||
|
|
||||||
|
devhelp:
|
||||||
|
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||||
|
@echo
|
||||||
|
@echo "Build finished."
|
||||||
|
@echo "To view the help file:"
|
||||||
|
@echo "# mkdir -p $$HOME/.local/share/devhelp/ZoiteChat"
|
||||||
|
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ZoiteChat"
|
||||||
|
@echo "# devhelp"
|
||||||
|
|
||||||
|
epub:
|
||||||
|
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||||
|
|
||||||
|
latex:
|
||||||
|
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||||
|
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||||
|
"(use \`make latexpdf' here to do that automatically)."
|
||||||
|
|
||||||
|
latexpdf:
|
||||||
|
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||||
|
@echo "Running LaTeX files through pdflatex..."
|
||||||
|
$(MAKE) -C $(BUILDDIR)/latex all-pdf
|
||||||
|
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||||
|
|
||||||
|
text:
|
||||||
|
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||||
|
|
||||||
|
man:
|
||||||
|
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||||
|
|
||||||
|
texinfo:
|
||||||
|
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
|
||||||
|
@echo "Run \`make' in that directory to run these through makeinfo" \
|
||||||
|
"(use \`make info' here to do that automatically)."
|
||||||
|
|
||||||
|
info:
|
||||||
|
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||||
|
@echo "Running Texinfo files through makeinfo..."
|
||||||
|
make -C $(BUILDDIR)/texinfo info
|
||||||
|
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
|
||||||
|
|
||||||
|
gettext:
|
||||||
|
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
|
||||||
|
|
||||||
|
changes:
|
||||||
|
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||||
|
@echo
|
||||||
|
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||||
|
|
||||||
|
linkcheck:
|
||||||
|
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||||
|
@echo
|
||||||
|
@echo "Link check complete; look for any errors in the above output " \
|
||||||
|
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||||
|
|
||||||
|
doctest:
|
||||||
|
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||||
|
@echo "Testing of doctests in the sources finished, look at the " \
|
||||||
|
"results in $(BUILDDIR)/doctest/output.txt."
|
||||||
|
|
||||||
|
server:
|
||||||
|
@cd $(BUILDDIR)/html
|
||||||
|
@python -u -m SimpleHTTPServer
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
# ZoiteChat documentation
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
|
||||||
|
* Install [Python 3](https://www.python.org/)
|
||||||
|
* Install pip for Python 3
|
||||||
|
* Install Sphinx: `python -m pip install sphinx`
|
||||||
|
* On Windows: ensure your Python 3 installation is on `PATH`
|
||||||
|
* Run `make html` to build the HTML files
|
||||||
|
* Run the Python webserver to test your changes: `make server`
|
||||||
|
(http://localhost:8000/)
|
||||||
|
|
||||||
|
|
||||||
|
## Conventions
|
||||||
|
|
||||||
|
* 4 Spaces are used for indentation.
|
||||||
|
* Ordered or unordered lists use visual indentation, where any non-list
|
||||||
|
subelement would use an indentation of a multiple of 4 again.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```rest
|
||||||
|
- a list item
|
||||||
|
- a list item
|
||||||
|
with a visually indented continuation
|
||||||
|
- a list item with a sub-list
|
||||||
|
|
||||||
|
- that is also visually indented
|
||||||
|
- a list item with a code block
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
that is not visually indented
|
||||||
|
```
|
||||||
|
|
||||||
|
## HTML theme
|
||||||
|
|
||||||
|
The `zoitechat` theme inherits Sphinx's built-in `basic` theme. It uses the
|
||||||
|
same compact layout, blue navigation, and system fonts as zoitechat.org.
|
||||||
|
Appearance starts in System mode on each page. Light and Dark are available
|
||||||
|
for the current page; no cookies or browser storage are used.
|
||||||
|
|
||||||
|
The theme's templates are in `_theme/zoitechat/`. Its readable CSS and
|
||||||
|
JavaScript are in `_static/css/zoitechat-docs.css` and
|
||||||
|
`_static/js/zoitechat-docs.js`. No minification, JavaScript package manager,
|
||||||
|
external fonts, or CDN assets are required.
|
||||||
|
|
||||||
|
Navigation URLs, including `zoite_atlas_url`, are configured through
|
||||||
|
`html_context` in `conf.py`. The logo
|
||||||
|
is `_static/zoitechat-logo.svg`. Standard Sphinx search, indexes, source
|
||||||
|
links, anchors, translations, and previous/next links remain available.
|
||||||
|
The HTML output also works as locally installed documentation; project-site
|
||||||
|
links only access the network when clicked.
|
||||||
|
|
||||||
|
Build from the repository root:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sphinx-build -b html docs docs/_build/html
|
||||||
|
```
|
||||||
|
|
||||||
|
Use a clean output directory when switching themes so stale assets from
|
||||||
|
earlier builds are not included in a package.
|
||||||
|
|
||||||
|
## Debian packaging
|
||||||
|
|
||||||
|
The `zoitechat` theme uses Sphinx's built-in `basic` theme. It does not
|
||||||
|
bundle Bootstrap, jQuery, jQuery Cookie, Font Awesome, or icon fonts.
|
||||||
|
Its font stack includes DejaVu Sans and DejaVu Sans Mono; no font files
|
||||||
|
are bundled by the theme.
|
||||||
|
|
||||||
|
No pre-minified third-party theme assets need to be added or rebuilt.
|
||||||
|
|
||||||
|
The Meson option `-Dinstall-docs` defaults to `false`, so platforms that
|
||||||
|
do not ship offline documentation do not need Sphinx just to build ZoiteChat.
|
||||||
|
Pass `-Dinstall-docs=true` when packaging local HTML documentation. Fedora
|
||||||
|
and AppImage enable it explicitly; the Debian documentation package can do
|
||||||
|
the same.
|
||||||
|
|
||||||
|
Build with the distribution's `python3-sphinx`. After installing the HTML
|
||||||
|
into the package staging directory, use `dh_sphinxdoc` (or `dh --with
|
||||||
|
sphinxdoc`) to replace Sphinx's standard JavaScript files with system
|
||||||
|
symlinks. Include `${sphinxdoc:Depends}` in the package dependencies and
|
||||||
|
`${sphinxdoc:Built-Using}` where required for generated assets. The custom
|
||||||
|
`zoitechat-docs.js` remains a small, readable project source file.
|
||||||
|
|
||||||
|
A built-in theme is still selectable with `-D html_theme=classic` if a
|
||||||
|
packager needs a different layout. The old RST content has existing build
|
||||||
|
diagnostics; changing the theme does not suppress or alter them.
|
||||||
|
|
||||||
|
Shared website chrome is in `_static/css/zoitechat-site.css`, copied from the main site. Keep that readable stylesheet in sync when changing the shared header, navigation, typography, or colours.
|
||||||
@@ -0,0 +1,843 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
/* Keep the docs close to the desktop client and the main project's website. */
|
||||||
|
:root {
|
||||||
|
color-scheme: light;
|
||||||
|
--page: #ffffff;
|
||||||
|
--panel: #f1f2f3;
|
||||||
|
--text: #25282c;
|
||||||
|
--muted: #58616b;
|
||||||
|
--line: #bdc3c9;
|
||||||
|
--soft-line: #dce0e4;
|
||||||
|
--blue: #215a9e;
|
||||||
|
--link: #174f92;
|
||||||
|
--selection: #e6effa;
|
||||||
|
--code: #f2f4f6;
|
||||||
|
--comment: #58616b;
|
||||||
|
--string: #236741;
|
||||||
|
--number: #7842ab;
|
||||||
|
--font: system-ui, -apple-system, "Segoe UI", "DejaVu Sans", sans-serif;
|
||||||
|
--mono: Consolas, "DejaVu Sans Mono", "Liberation Mono", monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
html[data-theme="dark"] {
|
||||||
|
color-scheme: dark;
|
||||||
|
--page: #191c1f;
|
||||||
|
--panel: #25292d;
|
||||||
|
--text: #eef0f2;
|
||||||
|
--muted: #b2bbc4;
|
||||||
|
--line: #50575e;
|
||||||
|
--soft-line: #353c43;
|
||||||
|
--blue: #2865a8;
|
||||||
|
--link: #8dc0ff;
|
||||||
|
--selection: #233951;
|
||||||
|
--code: #111518;
|
||||||
|
--comment: #b2bbc4;
|
||||||
|
--string: #92d5ab;
|
||||||
|
--number: #dfacff;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root:not([data-theme]) {
|
||||||
|
color-scheme: dark;
|
||||||
|
--page: #191c1f;
|
||||||
|
--panel: #25292d;
|
||||||
|
--text: #eef0f2;
|
||||||
|
--muted: #b2bbc4;
|
||||||
|
--line: #50575e;
|
||||||
|
--soft-line: #353c43;
|
||||||
|
--blue: #2865a8;
|
||||||
|
--link: #8dc0ff;
|
||||||
|
--selection: #233951;
|
||||||
|
--code: #111518;
|
||||||
|
--comment: #b2bbc4;
|
||||||
|
--string: #92d5ab;
|
||||||
|
--number: #dfacff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
scroll-padding-top: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
background: var(--page);
|
||||||
|
color: var(--text);
|
||||||
|
font: 14px/1.7 var(--font);
|
||||||
|
}
|
||||||
|
|
||||||
|
a,
|
||||||
|
a:visited {
|
||||||
|
color: var(--link);
|
||||||
|
text-underline-offset: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
:focus-visible {
|
||||||
|
outline: 3px solid var(--link);
|
||||||
|
outline-offset: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
[hidden] {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
button,
|
||||||
|
input,
|
||||||
|
select {
|
||||||
|
font: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
button,
|
||||||
|
summary,
|
||||||
|
select {
|
||||||
|
touch-action: manipulation;
|
||||||
|
}
|
||||||
|
|
||||||
|
button,
|
||||||
|
summary {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4 {
|
||||||
|
color: var(--text);
|
||||||
|
font-family: var(--font);
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 1.35;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin: 0 0 20px;
|
||||||
|
font-size: 28px;
|
||||||
|
letter-spacing: -0.5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
margin: 28px 0 12px;
|
||||||
|
font-size: 21px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
margin: 22px 0 10px;
|
||||||
|
font-size: 17px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0 0 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input,
|
||||||
|
select,
|
||||||
|
button {
|
||||||
|
min-height: 34px;
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 6px 9px;
|
||||||
|
background: var(--page);
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="submit"],
|
||||||
|
button {
|
||||||
|
background: var(--panel);
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="submit"]:hover,
|
||||||
|
button:hover {
|
||||||
|
background: var(--selection);
|
||||||
|
}
|
||||||
|
|
||||||
|
.skip-link {
|
||||||
|
position: absolute;
|
||||||
|
top: -100px;
|
||||||
|
left: 15px;
|
||||||
|
z-index: 10;
|
||||||
|
padding: 10px;
|
||||||
|
background: var(--page);
|
||||||
|
}
|
||||||
|
|
||||||
|
.skip-link:focus {
|
||||||
|
top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-header,
|
||||||
|
.docs-layout,
|
||||||
|
.site-footer {
|
||||||
|
width: min(1200px, calc(100% - 48px));
|
||||||
|
margin-inline: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-header {
|
||||||
|
padding-top: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.topbar {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 20px;
|
||||||
|
padding-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
color: var(--text) !important;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand img {
|
||||||
|
display: block;
|
||||||
|
width: 38px;
|
||||||
|
height: 42px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand strong {
|
||||||
|
font-size: 28px;
|
||||||
|
font-weight: 650;
|
||||||
|
letter-spacing: -0.8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.appearance {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.appearance select {
|
||||||
|
min-height: 30px;
|
||||||
|
padding: 3px 7px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-nav {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: stretch;
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
background: var(--panel);
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-nav > a,
|
||||||
|
.support-menu > summary {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
min-height: 36px;
|
||||||
|
padding: 6px 15px;
|
||||||
|
color: var(--text);
|
||||||
|
font-size: 13px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-nav > a:hover,
|
||||||
|
.support-menu > summary:hover {
|
||||||
|
background: var(--selection);
|
||||||
|
color: var(--link);
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-nav > a.selected {
|
||||||
|
background: var(--blue);
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.support-menu {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.support-menu > summary {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.support-menu > summary::after {
|
||||||
|
content: "⌄";
|
||||||
|
margin-left: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.support-menu > summary::-webkit-details-marker {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.support-links {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 100%;
|
||||||
|
z-index: 5;
|
||||||
|
min-width: 235px;
|
||||||
|
padding: 5px;
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
background: var(--page);
|
||||||
|
}
|
||||||
|
|
||||||
|
.support-links a {
|
||||||
|
display: block;
|
||||||
|
padding: 10px 12px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.support-links a:hover {
|
||||||
|
background: var(--selection);
|
||||||
|
}
|
||||||
|
|
||||||
|
.support-links small {
|
||||||
|
display: block;
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-location {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: start;
|
||||||
|
gap: 20px;
|
||||||
|
margin-top: 12px;
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-location nav {
|
||||||
|
min-width: 0;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-location nav > span {
|
||||||
|
margin-inline: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-version {
|
||||||
|
flex-shrink: 0;
|
||||||
|
font-family: var(--mono);
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-layout {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 240px minmax(0, 1fr);
|
||||||
|
align-items: start;
|
||||||
|
gap: 36px;
|
||||||
|
padding-block: 26px 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-layout.no-sidebar {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-sidebar {
|
||||||
|
position: sticky;
|
||||||
|
top: 16px;
|
||||||
|
max-height: calc(100vh - 32px);
|
||||||
|
overflow: auto;
|
||||||
|
padding-right: 15px;
|
||||||
|
border-right: 1px solid var(--soft-line);
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-navigation > summary {
|
||||||
|
margin-bottom: 14px;
|
||||||
|
padding: 5px 0;
|
||||||
|
color: var(--text);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-sidebar h2,
|
||||||
|
.docs-sidebar h3 {
|
||||||
|
margin: 20px 0 8px;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
border-bottom: 1px solid var(--line);
|
||||||
|
font-size: 14px;
|
||||||
|
letter-spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-sidebar ul {
|
||||||
|
margin: 0;
|
||||||
|
padding-left: 17px;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-sidebar nav > ul {
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-sidebar li {
|
||||||
|
margin: 5px 0;
|
||||||
|
line-height: 1.55;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-sidebar li.current > a,
|
||||||
|
.docs-sidebar a.current {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-sidebar .current > a {
|
||||||
|
text-decoration-thickness: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-search > label {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-inputs {
|
||||||
|
display: flex;
|
||||||
|
align-items: stretch;
|
||||||
|
gap: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-inputs input {
|
||||||
|
width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-inputs button {
|
||||||
|
flex-shrink: 0;
|
||||||
|
padding-inline: 7px;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content {
|
||||||
|
min-width: 0;
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content > :first-child,
|
||||||
|
.docs-content > section:first-child > :first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content li {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content dl {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content dt {
|
||||||
|
margin-top: 14px;
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content dd {
|
||||||
|
margin-left: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content code,
|
||||||
|
.docs-content pre,
|
||||||
|
.docs-content kbd {
|
||||||
|
font-family: var(--mono);
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content code.literal {
|
||||||
|
padding: 1px 4px;
|
||||||
|
border: 1px solid var(--soft-line);
|
||||||
|
background: var(--code);
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content pre {
|
||||||
|
margin: 0;
|
||||||
|
white-space: pre;
|
||||||
|
line-height: 1.7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content .highlight,
|
||||||
|
.docs-content .literal-block {
|
||||||
|
max-width: 100%;
|
||||||
|
margin: 16px 0;
|
||||||
|
padding: 14px;
|
||||||
|
overflow-x: auto;
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
background: var(--code);
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight pre {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight span {
|
||||||
|
color: var(--text) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight .k,
|
||||||
|
.highlight .kc,
|
||||||
|
.highlight .kd,
|
||||||
|
.highlight .kn,
|
||||||
|
.highlight .kp,
|
||||||
|
.highlight .kr,
|
||||||
|
.highlight .kt,
|
||||||
|
.highlight .o,
|
||||||
|
.highlight .ow,
|
||||||
|
.highlight .nb,
|
||||||
|
.highlight .nf {
|
||||||
|
color: var(--link) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight .c,
|
||||||
|
.highlight .c1,
|
||||||
|
.highlight .cm,
|
||||||
|
.highlight .cp,
|
||||||
|
.highlight .cs,
|
||||||
|
.highlight .sd {
|
||||||
|
color: var(--comment) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight .s,
|
||||||
|
.highlight .s1,
|
||||||
|
.highlight .s2,
|
||||||
|
.highlight .sa,
|
||||||
|
.highlight .sb,
|
||||||
|
.highlight .sc,
|
||||||
|
.highlight .se,
|
||||||
|
.highlight .sh,
|
||||||
|
.highlight .si,
|
||||||
|
.highlight .sr,
|
||||||
|
.highlight .ss {
|
||||||
|
color: var(--string) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight .m,
|
||||||
|
.highlight .mb,
|
||||||
|
.highlight .mf,
|
||||||
|
.highlight .mh,
|
||||||
|
.highlight .mi,
|
||||||
|
.highlight .mo,
|
||||||
|
.highlight .il {
|
||||||
|
color: var(--number) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.docutils,
|
||||||
|
table.indextable,
|
||||||
|
table.genindextable {
|
||||||
|
width: 100%;
|
||||||
|
margin: 16px 0;
|
||||||
|
border-collapse: collapse;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.docutils th,
|
||||||
|
table.docutils td {
|
||||||
|
padding: 9px 12px;
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
text-align: left;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.docutils th {
|
||||||
|
background: var(--panel);
|
||||||
|
}
|
||||||
|
|
||||||
|
table.docutils tbody tr:nth-child(even) {
|
||||||
|
background: var(--panel);
|
||||||
|
}
|
||||||
|
|
||||||
|
table.genindextable td,
|
||||||
|
table.indextable td {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content .admonition,
|
||||||
|
.docs-content .topic,
|
||||||
|
.docs-content .sidebar {
|
||||||
|
float: none;
|
||||||
|
width: auto;
|
||||||
|
margin: 18px 0;
|
||||||
|
padding: 12px 16px;
|
||||||
|
border: 1px solid var(--soft-line);
|
||||||
|
border-left: 3px solid var(--blue);
|
||||||
|
background: var(--panel);
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content .admonition-title,
|
||||||
|
.docs-content .topic-title,
|
||||||
|
.docs-content .sidebar-title {
|
||||||
|
margin-bottom: 6px;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content .admonition > :last-child,
|
||||||
|
.docs-content .topic > :last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content img,
|
||||||
|
.docs-content .figure {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content img {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content .figure {
|
||||||
|
margin-inline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content .caption {
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.headerlink {
|
||||||
|
padding-left: 6px;
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 0.8em;
|
||||||
|
text-decoration: none;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1:hover > .headerlink,
|
||||||
|
h2:hover > .headerlink,
|
||||||
|
h3:hover > .headerlink,
|
||||||
|
h4:hover > .headerlink,
|
||||||
|
dt:hover > .headerlink,
|
||||||
|
a.headerlink:focus-visible {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlighted {
|
||||||
|
background: var(--selection);
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-relations {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 24px;
|
||||||
|
margin-top: 32px;
|
||||||
|
padding-top: 16px;
|
||||||
|
border-top: 1px solid var(--line);
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-relations > div {
|
||||||
|
max-width: 46%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-relations > div:last-child {
|
||||||
|
margin-left: auto;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-relations small {
|
||||||
|
display: block;
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-footer {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 12px 20px;
|
||||||
|
padding: 17px 0 28px;
|
||||||
|
border-top: 1px solid var(--line);
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-footer nav {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 5px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 1000px) {
|
||||||
|
.docs-layout {
|
||||||
|
grid-template-columns: 220px minmax(0, 1fr);
|
||||||
|
gap: 26px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-nav > a,
|
||||||
|
.support-menu > summary {
|
||||||
|
padding-inline: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 760px) {
|
||||||
|
.site-header,
|
||||||
|
.docs-layout,
|
||||||
|
.site-footer {
|
||||||
|
width: calc(100% - 30px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-header {
|
||||||
|
padding-top: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand strong {
|
||||||
|
font-size: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand img {
|
||||||
|
width: 32px;
|
||||||
|
height: 36px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.appearance > span {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-nav > a,
|
||||||
|
.support-menu > summary {
|
||||||
|
min-height: 38px;
|
||||||
|
padding: 7px 9px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-layout {
|
||||||
|
display: block;
|
||||||
|
padding-top: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-sidebar {
|
||||||
|
position: static;
|
||||||
|
max-height: none;
|
||||||
|
margin-bottom: 23px;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-navigation {
|
||||||
|
padding: 7px 12px;
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
background: var(--panel);
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-navigation > summary {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-content {
|
||||||
|
padding-top: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-sidebar ul {
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-sidebar .sidebar-content {
|
||||||
|
max-height: 60vh;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 26px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-version {
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.support-links {
|
||||||
|
right: 0;
|
||||||
|
min-width: 210px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content table {
|
||||||
|
display: block;
|
||||||
|
max-width: 100%;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
.site-header,
|
||||||
|
.docs-sidebar,
|
||||||
|
.site-footer,
|
||||||
|
.page-relations,
|
||||||
|
a.headerlink {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-layout,
|
||||||
|
.docs-layout.no-sidebar {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content,
|
||||||
|
.docs-content * {
|
||||||
|
color: #000000 !important;
|
||||||
|
background: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content .highlight,
|
||||||
|
.docs-content .literal-block {
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content pre {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-content .highlight span {
|
||||||
|
color: #000000 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The shared site stylesheet owns the page shell and primary navigation. */
|
||||||
|
:root {
|
||||||
|
--page: var(--bg);
|
||||||
|
--panel: var(--chrome);
|
||||||
|
--font: system-ui, -apple-system, "Segoe UI", "DejaVu Sans", sans-serif;
|
||||||
|
}
|
||||||
|
.site-header { padding: 0; }
|
||||||
|
.appearance select { min-height: 0; border-radius: 3px; }
|
||||||
|
.docs-layout {
|
||||||
|
width: min(1040px, calc(100% - 48px));
|
||||||
|
grid-template-columns: minmax(0, 1fr) 220px;
|
||||||
|
gap: 40px;
|
||||||
|
padding-block: 28px 20px;
|
||||||
|
}
|
||||||
|
.docs-content { grid-column: 1; grid-row: 1; }
|
||||||
|
.docs-sidebar {
|
||||||
|
grid-column: 2;
|
||||||
|
grid-row: 1;
|
||||||
|
padding: 3px 0 0;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
.site-footer { display: block; }
|
||||||
|
.site-footer .footer-links { gap: 5px 14px; }
|
||||||
|
.docs-location { width: 100%; margin-top: 0; margin-bottom: 20px; }
|
||||||
|
@media (max-width: 800px) {
|
||||||
|
.docs-layout { grid-template-columns: minmax(0, 1fr) 185px; gap: 26px; }
|
||||||
|
}
|
||||||
|
@media (max-width: 760px) {
|
||||||
|
.docs-layout { display: block; }
|
||||||
|
}
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
.docs-layout { width: calc(100% - 30px); padding-top: 23px; }
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
.docs-layout, .docs-layout.no-sidebar { width: 100%; padding: 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-footer, .footer-grid { font-size: inherit; color: inherit; }
|
||||||
@@ -0,0 +1,526 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
/* Shared chrome copied from ZoiteChat/site assets/css/site.css (1df996a). */
|
||||||
|
:root {
|
||||||
|
color-scheme: light;
|
||||||
|
--bg: #fff;
|
||||||
|
--surface: #fff;
|
||||||
|
--chrome: #f1f2f3;
|
||||||
|
--chrome2: #e3e5e7;
|
||||||
|
--text: #25282c;
|
||||||
|
--muted: #58616b;
|
||||||
|
--line: #bdc3c9;
|
||||||
|
--soft-line: #dce0e4;
|
||||||
|
--blue: #215a9e;
|
||||||
|
--link: #174f92;
|
||||||
|
--selection: #e6effa;
|
||||||
|
--success: #236741;
|
||||||
|
--code: #f2f4f6;
|
||||||
|
--shadow: none;
|
||||||
|
--mono: Consolas,"DejaVu Sans Mono","Liberation Mono",monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
html[data-theme=dark] {
|
||||||
|
color-scheme: dark;
|
||||||
|
--bg: #111416;
|
||||||
|
--surface: #191c1f;
|
||||||
|
--chrome: #25292d;
|
||||||
|
--chrome2: #30353a;
|
||||||
|
--text: #eef0f2;
|
||||||
|
--muted: #b2bbc4;
|
||||||
|
--line: #50575e;
|
||||||
|
--soft-line: #353c43;
|
||||||
|
--blue: #2865a8;
|
||||||
|
--link: #8dc0ff;
|
||||||
|
--selection: #233951;
|
||||||
|
--success: #92d5ab;
|
||||||
|
--code: #111518;
|
||||||
|
--shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
background: var(--bg);
|
||||||
|
color: var(--text);
|
||||||
|
font: 15px/1.6 system-ui,-apple-system,"Segoe UI","DejaVu Sans",sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: var(--link);
|
||||||
|
text-underline-offset: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
button, input, select {
|
||||||
|
font: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
button, summary {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
button, a, input, select, summary {
|
||||||
|
touch-action: manipulation;
|
||||||
|
}
|
||||||
|
|
||||||
|
:focus-visible {
|
||||||
|
outline: 3px solid var(--link);
|
||||||
|
outline-offset: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
[hidden] {
|
||||||
|
display: none!important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sr-only {
|
||||||
|
position: absolute;
|
||||||
|
width: 1px;
|
||||||
|
height: 1px;
|
||||||
|
padding: 0;
|
||||||
|
margin: -1px;
|
||||||
|
overflow: hidden;
|
||||||
|
clip-path: inset(50%);
|
||||||
|
white-space: nowrap;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.skip-link {
|
||||||
|
position: absolute;
|
||||||
|
left: 12px;
|
||||||
|
top: -100px;
|
||||||
|
z-index: 10;
|
||||||
|
padding: 10px;
|
||||||
|
background: var(--surface);
|
||||||
|
}
|
||||||
|
|
||||||
|
.skip-link:focus {
|
||||||
|
top: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.topbar {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 20px;
|
||||||
|
padding: 0 0 16px;
|
||||||
|
background: var(--surface);
|
||||||
|
border-bottom: 1px solid var(--line);
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand {
|
||||||
|
display: flex;
|
||||||
|
gap: 12px;
|
||||||
|
align-items: center;
|
||||||
|
color: var(--text);
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand img {
|
||||||
|
width: 38px;
|
||||||
|
height: 42px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand strong {
|
||||||
|
font-size: 28px;
|
||||||
|
letter-spacing: -.8px;
|
||||||
|
font-weight: 650;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand small {
|
||||||
|
display: block;
|
||||||
|
font-size: 12px;
|
||||||
|
color: var(--muted);
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.appearance {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
font-size: 11px;
|
||||||
|
color: var(--muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
border-radius: 3px;
|
||||||
|
padding: 5px 8px;
|
||||||
|
background: var(--surface);
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.navigation {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
gap: 12px;
|
||||||
|
background: var(--chrome);
|
||||||
|
border-bottom: 1px solid var(--line);
|
||||||
|
padding: 0;
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
display: flex;
|
||||||
|
align-items: stretch;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links>a, .nav-menu summary {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
min-height: 36px;
|
||||||
|
padding: 6px 15px;
|
||||||
|
color: var(--text);
|
||||||
|
font-size: 13px;
|
||||||
|
text-decoration: none;
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links>a[aria-current=page] {
|
||||||
|
color: #fff;
|
||||||
|
border-bottom-color: var(--blue);
|
||||||
|
font-weight: 500;
|
||||||
|
background: var(--blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links>a:hover, .nav-menu summary:hover {
|
||||||
|
background: var(--selection);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-menu {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-menu summary {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-menu summary::after {
|
||||||
|
content: "⌄";
|
||||||
|
margin-left: 9px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-menu summary::-webkit-details-marker {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-menu-panel {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 100%;
|
||||||
|
z-index: 5;
|
||||||
|
min-width: 280px;
|
||||||
|
background: var(--surface);
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
box-shadow: var(--shadow);
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-menu-panel a {
|
||||||
|
display: block;
|
||||||
|
padding: 10px 12px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-menu-panel a:hover {
|
||||||
|
background: var(--selection);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-menu-panel span {
|
||||||
|
display: block;
|
||||||
|
font-size: 12px;
|
||||||
|
color: var(--muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-main {
|
||||||
|
min-height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, p {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: clamp(30px,3.9vw,46px);
|
||||||
|
line-height: 1.16;
|
||||||
|
letter-spacing: -1.5px;
|
||||||
|
font-weight: 650;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 20px;
|
||||||
|
line-height: 1.3;
|
||||||
|
letter-spacing: 0;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: var(--text);
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.7;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-footer {
|
||||||
|
padding: 17px 0;
|
||||||
|
background: var(--surface);
|
||||||
|
border-top: 1px solid var(--line);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-grid {
|
||||||
|
display: flex;
|
||||||
|
align-items: start;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-copy {
|
||||||
|
font-size: 11px;
|
||||||
|
max-width: 62ch;
|
||||||
|
margin: 0;
|
||||||
|
color: var(--muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-links {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 5px 14px;
|
||||||
|
max-width: 400px;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width:1000px) {
|
||||||
|
.navigation {
|
||||||
|
padding: 0 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links>a, .nav-menu summary {
|
||||||
|
padding: 8px 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width:650px) {
|
||||||
|
.topbar {
|
||||||
|
padding: 13px 16px;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand strong {
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand small {
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand img {
|
||||||
|
width: 28px;
|
||||||
|
height: 31px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.appearance {
|
||||||
|
gap: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.appearance>span {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.appearance select {
|
||||||
|
font-size: 12px;
|
||||||
|
max-width: 98px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navigation {
|
||||||
|
padding: 0 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
gap: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links>a, .nav-menu summary {
|
||||||
|
min-height: 44px;
|
||||||
|
padding: 8px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 34px;
|
||||||
|
letter-spacing: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-grid {
|
||||||
|
display: grid;
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-footer {
|
||||||
|
padding: 20px 17px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-menu-panel {
|
||||||
|
position: fixed;
|
||||||
|
right: 10px;
|
||||||
|
left: 10px;
|
||||||
|
top: auto;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion:reduce) {
|
||||||
|
* {
|
||||||
|
scroll-behavior: auto!important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.appearance select {
|
||||||
|
font-size: 12px;
|
||||||
|
padding: 3px 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links>a:hover {
|
||||||
|
background: var(--selection);
|
||||||
|
color: var(--link);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 28px;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: -.5px;
|
||||||
|
line-height: 1.3;
|
||||||
|
margin: 0 0 16px;
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width:1100px) {
|
||||||
|
.navigation {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width:800px) {
|
||||||
|
.nav-links>a, .nav-menu summary {
|
||||||
|
padding: 6px 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width:600px) {
|
||||||
|
.topbar {
|
||||||
|
padding: 0 0 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand strong {
|
||||||
|
font-size: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand img {
|
||||||
|
width: 32px;
|
||||||
|
height: 36px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links>a, .nav-menu summary {
|
||||||
|
padding: 7px 9px;
|
||||||
|
min-height: 38px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-grid {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-links {
|
||||||
|
margin-top: 10px;
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-footer {
|
||||||
|
padding: 14px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 26px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root:not([data-theme]) {
|
||||||
|
color-scheme: dark;
|
||||||
|
--bg: #111416;
|
||||||
|
--surface: #191c1f;
|
||||||
|
--chrome: #25292d;
|
||||||
|
--chrome2: #30353a;
|
||||||
|
--text: #eef0f2;
|
||||||
|
--muted: #b2bbc4;
|
||||||
|
--line: #50575e;
|
||||||
|
--soft-line: #353c43;
|
||||||
|
--blue: #2865a8;
|
||||||
|
--link: #8dc0ff;
|
||||||
|
--selection: #233951;
|
||||||
|
--success: #92d5ab;
|
||||||
|
--code: #111518;
|
||||||
|
--shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-header, .site-main, .site-footer {
|
||||||
|
width: min(1040px, calc(100% - 48px));
|
||||||
|
margin-inline: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-header {
|
||||||
|
margin-top: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-main {
|
||||||
|
padding-block: 28px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-header .topbar {
|
||||||
|
padding: 0 0 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-header .navigation {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
.site-header, .site-main, .site-footer {
|
||||||
|
width: calc(100% - 30px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-header {
|
||||||
|
margin-top: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-main {
|
||||||
|
padding-top: 23px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Match the browser's heading defaults used by the main site. */
|
||||||
|
h2, h3 { font-weight: bold; }
|
||||||
|
h2 { margin-top: .83em; }
|
||||||
|
h3 { margin-block: 1em; }
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 5.0 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 9.3 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 50 KiB |
@@ -0,0 +1,44 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
(() => {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const initialise = () => {
|
||||||
|
const picker = document.getElementById('theme-picker');
|
||||||
|
const preference = window.matchMedia('(prefers-color-scheme: dark)');
|
||||||
|
|
||||||
|
if (picker instanceof HTMLSelectElement) {
|
||||||
|
const applyTheme = () => {
|
||||||
|
const dark = picker.value === 'dark'
|
||||||
|
|| (picker.value === 'system' && preference.matches);
|
||||||
|
document.documentElement.dataset.theme = dark ? 'dark' : 'light';
|
||||||
|
document.querySelectorAll('meta[name="theme-color"]').forEach((meta) => {
|
||||||
|
meta.setAttribute('content', dark ? '#111416' : '#ffffff');
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Follow the OS on every visit, including browser back/forward navigation.
|
||||||
|
const resetTheme = () => {
|
||||||
|
picker.value = 'system';
|
||||||
|
applyTheme();
|
||||||
|
};
|
||||||
|
picker.addEventListener('change', applyTheme);
|
||||||
|
preference.addEventListener('change', applyTheme);
|
||||||
|
window.addEventListener('pageshow', resetTheme);
|
||||||
|
resetTheme();
|
||||||
|
}
|
||||||
|
|
||||||
|
const navigation = document.getElementById('docs-navigation');
|
||||||
|
const compact = window.matchMedia('(max-width: 760px)');
|
||||||
|
if (navigation instanceof HTMLDetailsElement) {
|
||||||
|
const fitNavigation = () => { navigation.open = !compact.matches; };
|
||||||
|
compact.addEventListener('change', fitNavigation);
|
||||||
|
fitNavigation();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (document.readyState === 'loading') {
|
||||||
|
document.addEventListener('DOMContentLoaded', initialise, { once: true });
|
||||||
|
} else {
|
||||||
|
initialise();
|
||||||
|
}
|
||||||
|
})();
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 908.34 1000">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: url(#linear-gradient-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-3 {
|
||||||
|
isolation: isolate;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-4 {
|
||||||
|
opacity: .3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-5 {
|
||||||
|
mix-blend-mode: multiply;
|
||||||
|
opacity: .5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-6 {
|
||||||
|
fill: url(#linear-gradient);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<linearGradient id="linear-gradient" x1="14.94" y1="500" x2="893.4" y2="500" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#01a1fb"/>
|
||||||
|
<stop offset="1" stop-color="#0047bc"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="linear-gradient-2" x1="14.94" y1="533.09" x2="823" y2="533.09" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#0047bc"/>
|
||||||
|
<stop offset="1" stop-color="#01a1fb"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="cls-3">
|
||||||
|
<g id="Layer_1" data-name="Layer 1">
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path class="cls-6" d="m209.4,878.26c7.44-16.01,13.21-32.36,17.4-48.87C99.81,752.4,14.94,612.88,14.94,453.52c0-242.58,196.65-439.23,439.23-439.23,242.58,0,439.23,196.65,439.23,439.23,0,242.58-196.65,439.23-439.23,439.23-33.13,0-65.4-3.69-96.43-10.65-57.19,71.24-145.98,109.28-235.84,102.91,36.55-26.73,67.06-62.8,87.5-106.76Z"/>
|
||||||
|
<path class="cls-1" d="m209.4,878.26c7.41-15.92,13.14-32.19,17.33-48.6C99.79,752.82,14.94,613.44,14.94,454.23c0-158.08,83.65-296.6,209.09-373.76-43.67,68.18-68.99,149.24-68.99,236.21,0,242.19,196.33,438.52,438.52,438.52,84.11,0,162.68-23.7,229.43-64.76-77.94,121.67-214.32,202.31-369.53,202.31-32.92,0-64.98-3.65-95.82-10.53-57.19,71.17-145.94,109.16-235.75,102.79,36.55-26.73,67.06-62.8,87.5-106.76Z"/>
|
||||||
|
<g class="cls-4">
|
||||||
|
<path class="cls-2" d="m815.15,496.56c0-214.21-173.66-387.87-387.87-387.87-125.21,0-236.54,59.35-307.46,151.43,66.98-116.27,192.51-194.55,336.33-194.55,214.22,0,387.87,173.66,387.87,387.87,0,89-30,170.99-80.41,236.44,32.78-56.91,51.54-122.92,51.54-193.32Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<image class="cls-5" width="316" height="274" transform="translate(209.32 236.76) scale(1.59)" xlink:href="data:image/png;base64,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 truncated
|
||||||
|
<path class="cls-2" d="m683.68,250.22h-421.95l-38.92,93.77h249.4l-249.4,300.48h422.01l38.86-93.84h-249.33l249.33-300.42Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,5 @@
|
|||||||
|
{# SPDX-License-Identifier: GPL-2.0-or-later #}
|
||||||
|
<nav class="global-toc" aria-label="{{ _('Documentation contents') }}">
|
||||||
|
<h2>{{ _('Contents') }}</h2>
|
||||||
|
{{ toctree(maxdepth=2, collapse=true, includehidden=true, titles_only=true) }}
|
||||||
|
</nav>
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
{# SPDX-License-Identifier: GPL-2.0-or-later #}
|
||||||
|
{% extends "basic/layout.html" %}
|
||||||
|
{% set docs_root = root_doc|default(master_doc) %}
|
||||||
|
|
||||||
|
{% block extrahead %}
|
||||||
|
{{ super() }}
|
||||||
|
<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)">
|
||||||
|
<meta name="theme-color" content="#111416" media="(prefers-color-scheme: dark)">
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block body_tag %}<body id="top">{% endblock %}
|
||||||
|
|
||||||
|
{% block header %}
|
||||||
|
<a class="skip-link" href="#main-content">{{ _('Skip to content') }}</a>
|
||||||
|
<header class="site-header">
|
||||||
|
<div class="topbar">
|
||||||
|
<a class="brand" href="{{ pathto(docs_root)|e }}">
|
||||||
|
<img src="{{ logo_url|default(pathto('_static/zoitechat-logo.svg', 1), true)|e }}" alt="" width="38" height="42">
|
||||||
|
<strong>{{ project|e }}</strong>
|
||||||
|
</a>
|
||||||
|
<label class="appearance" for="theme-picker">
|
||||||
|
<span>{{ _('Appearance') }}</span>
|
||||||
|
<select id="theme-picker" aria-label="{{ _('Documentation appearance') }}">
|
||||||
|
<option value="system" selected>{{ _('System') }}</option>
|
||||||
|
<option value="light">{{ _('Light') }}</option>
|
||||||
|
<option value="dark">{{ _('Dark') }}</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="navigation">
|
||||||
|
<nav class="nav-links" aria-label="{{ _('Primary') }}">
|
||||||
|
<a href="{{ zoite_site_url|e }}">{{ _('Home') }}</a>
|
||||||
|
<a href="{{ zoite_download_url|e }}">{{ _('Downloads') }}</a>
|
||||||
|
<a href="{{ zoite_addons_url|e }}">{{ _('Addons') }}</a>
|
||||||
|
<a href="{{ zoite_announcements_url|e }}">{{ _('Announcements') }}</a>
|
||||||
|
<a href="{{ pathto(docs_root)|e }}" aria-current="page">{{ _('Documentation') }}</a>
|
||||||
|
<a href="{{ zoite_atlas_url|e }}">{{ _('Atlas') }}</a>
|
||||||
|
<a href="{{ zoite_github_url|e }}" target="_blank" rel="noopener">{{ _('GitHub') }}</a>
|
||||||
|
<details class="nav-menu">
|
||||||
|
<summary>{{ _('IRC support') }}</summary>
|
||||||
|
<div class="nav-menu-panel" aria-label="{{ _('IRC support channels') }}">
|
||||||
|
<a href="{{ zoite_irc_url|e }}" target="_blank" rel="noopener"><strong>{{ _('Zoite IRC') }}</strong><span>{{ _('Official support') }} · #zoitechat</span></a>
|
||||||
|
<a href="{{ libera_irc_url|e }}" target="_blank" rel="noopener"><strong>{{ _('Libera.Chat') }}</strong><span>{{ _('Secondary support') }} · #zoitechat</span></a>
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block relbar1 %}{% endblock %}
|
||||||
|
{% block relbar2 %}{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="docs-layout{% if not render_sidebar %} no-sidebar{% endif %}">
|
||||||
|
{% if render_sidebar %}
|
||||||
|
<aside class="docs-sidebar" aria-label="{{ _('Documentation navigation') }}">
|
||||||
|
<details class="docs-navigation" id="docs-navigation" open>
|
||||||
|
<summary>{{ _('Documentation') }}</summary>
|
||||||
|
<div class="sidebar-content">
|
||||||
|
{% for sidebartemplate in sidebars %}
|
||||||
|
{% include sidebartemplate %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
</aside>
|
||||||
|
{% endif %}
|
||||||
|
<main class="docs-content" id="main-content" tabindex="-1">
|
||||||
|
<div class="docs-location">
|
||||||
|
<nav aria-label="{{ _('Breadcrumbs') }}">
|
||||||
|
<a href="{{ pathto(docs_root)|e }}">{{ _('Documentation') }}</a>
|
||||||
|
{% for parent in parents %}
|
||||||
|
<span aria-hidden="true">/</span> <a href="{{ parent.link|e }}">{{ parent.title }}</a>
|
||||||
|
{% endfor %}
|
||||||
|
{% if pagename != docs_root %}<span aria-hidden="true">/</span> <span>{{ title|striptags|e }}</span>{% endif %}
|
||||||
|
</nav>
|
||||||
|
<span class="docs-version">{{ release|e }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% block body %}{% endblock %}
|
||||||
|
{% if prev or next %}
|
||||||
|
<nav class="page-relations" aria-label="{{ _('Related pages') }}">
|
||||||
|
<div>
|
||||||
|
{% if prev %}<small>{{ _('Previous') }}</small><a href="{{ prev.link|e }}" rel="prev">{{ prev.title }}</a>{% endif %}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{% if next %}<small>{{ _('Next') }}</small><a href="{{ next.link|e }}" rel="next">{{ next.title }}</a>{% endif %}
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
{% endif %}
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block footer %}
|
||||||
|
<footer class="site-footer">
|
||||||
|
<div class="footer-grid">
|
||||||
|
<p class="footer-copy">{{ project|e }} {{ _('documentation') }} · {{ release|e }}</p>
|
||||||
|
<nav class="footer-links" aria-label="{{ _('Footer navigation') }}">
|
||||||
|
<a href="{{ pathto(docs_root)|e }}">{{ _('Contents') }}</a>
|
||||||
|
<a href="{{ zoite_atlas_url|e }}">{{ _('Atlas') }}</a>
|
||||||
|
{% if hasdoc('search') %}<a href="{{ pathto('search')|e }}">{{ _('Search') }}</a>{% endif %}
|
||||||
|
{% if hasdoc('genindex') %}<a href="{{ pathto('genindex')|e }}">{{ _('Index') }}</a>{% endif %}
|
||||||
|
<a href="#top">{{ _('Back to top') }}</a>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{# SPDX-License-Identifier: GPL-2.0-or-later #}
|
||||||
|
{% if display_toc %}
|
||||||
|
<nav class="local-toc" aria-label="{{ _('On this page') }}">
|
||||||
|
<h2>{{ _('On this page') }}</h2>
|
||||||
|
{{ toc }}
|
||||||
|
</nav>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{# SPDX-License-Identifier: GPL-2.0-or-later #}
|
||||||
|
{% if pagename != "search" %}
|
||||||
|
<form class="docs-search" action="{{ pathto('search')|e }}" method="get" role="search">
|
||||||
|
<label for="docs-search-input">{{ _('Search documentation') }}</label>
|
||||||
|
<div class="search-inputs">
|
||||||
|
<input id="docs-search-input" type="search" name="q" placeholder="{{ _('Search documentation') }}" autocomplete="off" spellcheck="false">
|
||||||
|
<button type="submit">{{ _('Search') }}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[theme]
|
||||||
|
inherit = basic
|
||||||
|
stylesheet = basic.css
|
||||||
|
pygments_style = sphinx
|
||||||
|
sidebars = searchbox.html, globaltoc.html, localtoc.html, sourcelink.html
|
||||||
|
|
||||||
|
[options]
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
Addons
|
||||||
|
======
|
||||||
|
|
||||||
|
ZoiteChat ships with a handful of useful plugins that extend the functionality of the client. In order to auto-load custom ones you just place them in an :file:`addons` subdir within your `config folder <settings.html#config-files>`_, manually with :command:`/load` and :command:`/unload`, or with :menuselection:`Window --> Plugins and Scripts`.
|
||||||
|
|
||||||
|
With the included scripting interfaces you can also use easier to create but equally powerful scripts in languages such as Python. These are loaded/unloaded in the same manner as plugins.
|
||||||
|
|
||||||
|
A directory of existing ZoiteChat addons can be found at `https://zoitechat.org/addons.php <https://zoitechat.org/addons.php>`_. In addition, since ZoiteChat is based on HexChat, most HexChat and many X-Chat 2 scripts and addons are compatible too, as long as they are written in a `supported scripting language <developers.html>`_.
|
||||||
|
|
||||||
|
|
||||||
|
Exec
|
||||||
|
----
|
||||||
|
|
||||||
|
The exec plugin provides the :command:`/exec` command for Windows. On Unix platforms there are built-in commands for this and this documentation does not apply to the behavior of those, see :command:`/help` for more information.
|
||||||
|
|
||||||
|
With Exec you can perform commands as if you ran them in the command line. The output will be printed at once, in the end of execution. If the command takes more than 10 seconds to complete, it gets aborted to avoid locking down ZoiteChat. Usage:
|
||||||
|
|
||||||
|
:command:`/exec ping google.com`
|
||||||
|
|
||||||
|
|
||||||
|
FISHLiM
|
||||||
|
-------
|
||||||
|
|
||||||
|
Adds FiSH encryption support. You set a password for a conversation/channel, and then all your messages get encrypted. Only those who know the password will be able to read your messages. Usage is simple: first you set the password:
|
||||||
|
|
||||||
|
:command:`/setkey yoursecretkey`
|
||||||
|
|
||||||
|
Then you let your fellow chatters know this password. Once they also set the password on their sides, they'll receive messages decrypted and send them encrypted, too.
|
||||||
|
|
||||||
|
You can remove the key with:
|
||||||
|
|
||||||
|
:command:`/delkey #channel`
|
||||||
|
|
||||||
|
Update Checker
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Windows only. Automatically checks for available updates. Can also be manually checked via :menuselection:`Help --> Check for Updates` or by the command:
|
||||||
|
|
||||||
|
:command:`/updchk`
|
||||||
|
|
||||||
|
|
||||||
|
Sysinfo
|
||||||
|
-------
|
||||||
|
|
||||||
|
Prints out basic system information on both Windows and Unix. You can either activate in :menuselection:`Window --> Display System Info` or type:
|
||||||
|
|
||||||
|
:command:`/sysinfo`
|
||||||
|
|
||||||
|
|
||||||
|
Checksum
|
||||||
|
--------
|
||||||
|
|
||||||
|
Automatically calculates the SHA-256 checksum of files sent and recieved via DCC.
|
||||||
|
|
||||||
|
|
||||||
|
Winamp
|
||||||
|
------
|
||||||
|
|
||||||
|
Displays your currently playing song via :menuselection:`Window --> Display Current Song` or by command:
|
||||||
|
|
||||||
|
:command:`/winamp`
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
- Windows-only and untested, but may work
|
||||||
|
- Foobar2000 can also be used with the `foo_winamp_spam <https://github.com/RazielZ/foo_winamp_spam>`_ plugin.
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
Appearance
|
||||||
|
==========
|
||||||
|
|
||||||
|
Theming
|
||||||
|
-------
|
||||||
|
|
||||||
|
Gtk Theme
|
||||||
|
~~~~~~~~~
|
||||||
|
|
||||||
|
Starting with version 2.18.0, ZoiteChat uses GTK 3. Theming is handled differently than it was in 2.17.x, HexChat, or X-Chat 2.
|
||||||
|
|
||||||
|
On Unix, the default is your system GTK theme. You can change the theme ZoiteChat uses in :menuselection:`Settings --> Preferences --> Appearance --> GTK3 theme`. Themes can be imported here too, which will only be available for ZoiteChat.
|
||||||
|
Themes installed via your system package manager or desktop environment control panel will also be available for ZoiteChat, as well as the rest of your GTK3 applications.
|
||||||
|
|
||||||
|
On Windows, the default theme is `Redstone <https://www.opendesktop.org/p/1013482/>`_ which is bundled with the ZoiteChat installer. In :menuselection:`Settings --> Preferences --> Appearance --> GTK3 theme`, you can import other themes as well, just like on Unix.
|
||||||
|
|
||||||
|
On both platforms, the theme selection drop down will show (user) for themes installed through ZoiteChat and (system) for system themes.
|
||||||
|
|
||||||
|
GTK 3 themes can be found on `openDesktop <https://www.opendesktop.org/browse?cat=135>`_ and other places like github. Any theme should work as long as it supports GTK 3.20 or higher.
|
||||||
|
|
||||||
|
Colors
|
||||||
|
~~~~~~
|
||||||
|
|
||||||
|
Colors are defined in :menuselection:`Settings --> Preferences --> Appearance --> Manage all client colors`. Text Colors set the palette for events to use. The rest like background color directly affect parts of the UI.
|
||||||
|
|
||||||
|
`mIRC <http://www.mirc.com/colors.html>`_ colors (00-15) are what you refer to when sending colored text over IRC for others to see and vice versa, because of this they should somewhat follow a set of standards so clients can agree 04 is red.
|
||||||
|
|
||||||
|
Local colors (16-31) can be changed to anything you wish, for instance to use in `text events <appearance.html#text-events>`_. However, ZoiteChat also supports the later `99 colors <https://modern.ircdocs.horse/formatting.html#colors-16-98>`_ standard so if you change the 16-31 colors it may conflict with that.
|
||||||
|
|
||||||
|
HexChat and X-Chat 2 supported color scheme "themes" as :file:`.hct` files, which are ZIP archives. Some of them are available from `HexChat Themes <https://hexchat.github.io/themes.html>`_, and you may have managed them with the discontinued Theme Manager.
|
||||||
|
|
||||||
|
If you want to use a HexChat/X-Chat theme, open the :file:`.hct` file in an application like 7-Zip or Ark and extract :file:`colors.conf`. Then go to :menuselection:`Settings --> Preferences --> Appearance --> Import colors.conf colors` to import it.
|
||||||
|
If the archive includes :file:`pevents.conf`, that can go in your `config folder <settings.html#config-files>`_ but may not work the same way it did in HexChat.
|
||||||
|
|
||||||
|
Text Events
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
Text events control the look of every event you see. They can be customized in :menuselection:`Settings --> Text Events` using these codes to format it:
|
||||||
|
|
||||||
|
- **%C<fg>,<bg>** Color code (e.g. %C02,00 is blue on grey)
|
||||||
|
- **%R** Reverse color
|
||||||
|
- **%U** Underlined text
|
||||||
|
- **%B** Bold text
|
||||||
|
- **%I** Italic text (2.10.0+)
|
||||||
|
- **%H** Hide text
|
||||||
|
- **%O** Normal text
|
||||||
|
- **%%** Escaped %
|
||||||
|
- **$t** Text separator (tab character)
|
||||||
|
- **$aXXX** Ascii value
|
||||||
|
- **$<num>** Event information
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Always hit enter after editing a field.
|
||||||
|
|
||||||
|
Icons
|
||||||
|
~~~~~
|
||||||
|
|
||||||
|
ZoiteChat comes with built in icons for the tray, user list, and channel tree (which can be disabled in Preferences). You can use custom icons by placing png icons (16x16 recommended) in an :file:`icons` subdir, which may need to be created, within your `config folder <settings.html#config-files>`_. The icons must be named exactly as follows including file extensions:
|
||||||
|
|
||||||
|
- User List
|
||||||
|
|
||||||
|
- ulist_netop.png
|
||||||
|
- ulist_founder.png
|
||||||
|
- ulist_owner.png
|
||||||
|
- ulist_op.png
|
||||||
|
- ulist_halfop.png
|
||||||
|
- ulist_voice.png
|
||||||
|
|
||||||
|
- Channel Tree
|
||||||
|
|
||||||
|
- tree_channel.png
|
||||||
|
- tree_dialog.png
|
||||||
|
- tree_server.png
|
||||||
|
- tree_util.png
|
||||||
|
|
||||||
|
- Tray Icon
|
||||||
|
|
||||||
|
- tray_normal.png
|
||||||
|
- tray_fileoffer.png
|
||||||
|
- tray_highlight.png
|
||||||
|
- tray_message.png
|
||||||
|
- zoitechat.png
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Buttons, Menus, and Popups
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Userlist Popup
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Popups are shown when you right click on a nickname, either in the userlist or in the main chat itself. These can be edited in :menuselection:`Settings --> Userlist Popup`
|
||||||
|
|
||||||
|
The Name column can take either just the name of the entry, *SUB*/*ENDSUB* for submenus, *SEP* for separators, and *TOGGLE* for toggleable options.
|
||||||
|
Prefix a character with *_* for keyboard shortcuts (e.g. N_ame will bind a).
|
||||||
|
|
||||||
|
The Command column can take any `command <commands.html>`_ with text formatted using the same codes as `text events <appearance.html#text-events>`_ and on top of that they also have their own codes:
|
||||||
|
|
||||||
|
- **%a** all selected nicks
|
||||||
|
- **%c** current channel
|
||||||
|
- **%h** selected nick's hostname
|
||||||
|
- **%m** machine info
|
||||||
|
- **%n** your nickname
|
||||||
|
- **%s** selected nickname
|
||||||
|
- **%t** time/date
|
||||||
|
- **%u** selected nick's account
|
||||||
|
|
||||||
|
The **gui_ulist_doubleclick** setting can run a command using these codes when double-clicking a nick in the userlist.
|
||||||
|
|
||||||
|
Userlist Buttons
|
||||||
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Buttons are shown below the userlist, can be edited in :menuselection:`Settings --> Userlist Buttons`, and take the same syntax as Userlist Popups.
|
||||||
|
|
||||||
|
Usermenu
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
In order to add custom entries to your menu you need to first enable the usermenu with the command :command:`/set gui_usermenu on` which may require a restart. Once this is enabled you can go to :menuselection:`Usermenu --> Edit this Menu` to add any `command <commands.html>`_ you would like. For menu entries it supports the same syntax as Userlist Popups.
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def prune_unused_local_assets(output_dir):
|
||||||
|
index_path = os.path.join(output_dir, "index.html")
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(index_path, "r", encoding="utf-8") as index_file:
|
||||||
|
index_html = index_file.read()
|
||||||
|
except OSError:
|
||||||
|
return
|
||||||
|
|
||||||
|
if "bootswatch-" not in index_html:
|
||||||
|
for bootstrap_version in ("bootstrap2", "bootstrap3"):
|
||||||
|
css_dir = os.path.join(
|
||||||
|
output_dir, "_static", "css", bootstrap_version
|
||||||
|
)
|
||||||
|
if not os.path.isdir(css_dir):
|
||||||
|
continue
|
||||||
|
|
||||||
|
for filename in os.listdir(css_dir):
|
||||||
|
if filename.startswith("bootswatch-") and filename.endswith(".css"):
|
||||||
|
os.remove(os.path.join(css_dir, filename))
|
||||||
|
|
||||||
|
if "jquery.cookie.min.js" not in index_html:
|
||||||
|
js_dir = os.path.join(output_dir, "_static", "js")
|
||||||
|
for filename in ("jquery.cookie.min.js", "jquery.cookie-1.4.1.min.js"):
|
||||||
|
path = os.path.join(js_dir, filename)
|
||||||
|
if os.path.isfile(path):
|
||||||
|
os.remove(path)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) != 4:
|
||||||
|
raise SystemExit("usage: build-docs.py SOURCE_DIR OUTPUT_DIR STAMP_FILE")
|
||||||
|
|
||||||
|
source_dir = os.path.abspath(sys.argv[1])
|
||||||
|
output_dir = os.path.abspath(sys.argv[2])
|
||||||
|
stamp_file = os.path.abspath(sys.argv[3])
|
||||||
|
doctree_dir = output_dir + ".doctrees"
|
||||||
|
|
||||||
|
shutil.rmtree(output_dir, ignore_errors=True)
|
||||||
|
shutil.rmtree(doctree_dir, ignore_errors=True)
|
||||||
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
|
||||||
|
subprocess.run(
|
||||||
|
[
|
||||||
|
sys.executable,
|
||||||
|
"-m",
|
||||||
|
"sphinx",
|
||||||
|
"-b",
|
||||||
|
"html",
|
||||||
|
"-d",
|
||||||
|
doctree_dir,
|
||||||
|
source_dir,
|
||||||
|
output_dir,
|
||||||
|
],
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
prune_unused_local_assets(output_dir)
|
||||||
|
|
||||||
|
with open(stamp_file, "w", encoding="utf-8") as stamp:
|
||||||
|
stamp.write("built\n")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
Building
|
||||||
|
========
|
||||||
|
|
||||||
|
Windows
|
||||||
|
-------
|
||||||
|
|
||||||
|
The Windows build is currently x64-only and follows the same shape as
|
||||||
|
ZoiteChat's Windows GitHub Actions workflow: prepare ``C:\gtk-build``, put
|
||||||
|
the dependency bundles where ``win32\zoitechat.props`` expects them, then build
|
||||||
|
``win32\zoitechat.sln`` with MSBuild.
|
||||||
|
|
||||||
|
Software
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
Install:
|
||||||
|
|
||||||
|
- `Visual Studio 2022 Community <https://visualstudio.microsoft.com/vs/community/>`_ or `Visual Studio 2022 Build Tools <https://visualstudio.microsoft.com/downloads/>`_ with the **Desktop development with C++** workload
|
||||||
|
- `Git for Windows <https://git-scm.com/download/win>`_
|
||||||
|
- `7-Zip <https://7-zip.org/>`_
|
||||||
|
- `Python 3.14 x64 <https://www.python.org/downloads/windows/>`_
|
||||||
|
- `Inno Setup 6 <https://jrsoftware.org/isdl.php>`_ if you want to build the installer
|
||||||
|
|
||||||
|
Source code
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
Clone the source and enter the checkout::
|
||||||
|
|
||||||
|
git clone https://github.com/zoitechat/zoitechat.git
|
||||||
|
cd zoitechat
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Create the dependency root::
|
||||||
|
|
||||||
|
mkdir C:\gtk-build
|
||||||
|
|
||||||
|
Download the `GTK3 x64 bundle <https://github.com/ZoiteChat/gvsbuild/releases/download/zoitechat-2.18.1/GTK3_Gvsbuild_zoitechat-2.18.1_x64.zip>`_
|
||||||
|
and extract it to ``C:\gtk-build\gtk\x64\release``.
|
||||||
|
|
||||||
|
Download the remaining Windows dependency artifacts from the
|
||||||
|
`ZoiteChat gvsbuild releases <https://github.com/zoitechat/gvsbuild/releases>`_
|
||||||
|
and extract them to these paths:
|
||||||
|
|
||||||
|
- gendef: ``C:\gtk-build\gendef``
|
||||||
|
- WinSparkle x64 bundle: ``C:\gtk-build\WinSparkle\x64``
|
||||||
|
- Perl 5.42 x64 bundle: ``C:\gtk-build\perl-5.42.0.1\x64``
|
||||||
|
|
||||||
|
Set up Python where the project file expects it. From PowerShell, adjust the
|
||||||
|
Python path if your install is elsewhere::
|
||||||
|
|
||||||
|
mkdir C:\gtk-build\python-3.14
|
||||||
|
cmd /c mklink /J C:\gtk-build\python-3.14\x64 C:\Python314
|
||||||
|
C:\gtk-build\python-3.14\x64\python.exe -m pip install --upgrade pip cffi
|
||||||
|
|
||||||
|
If you use different locations, set these environment variables before building
|
||||||
|
instead of editing ``win32\zoitechat.props``:
|
||||||
|
|
||||||
|
- ``ZOITECHAT_DEPS_PATH``
|
||||||
|
- ``ZOITECHAT_GENDEF_PATH``
|
||||||
|
- ``ZOITECHAT_PERL_PATH``
|
||||||
|
- ``ZOITECHAT_PYTHON3_PATH``
|
||||||
|
- ``ZOITECHAT_WINSPARKLE_PATH``
|
||||||
|
- ``ZOITECHAT_ISCC_PATH``
|
||||||
|
|
||||||
|
Building
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
Open **Developer Command Prompt for VS 2022** in the source checkout and run::
|
||||||
|
|
||||||
|
msbuild win32\zoitechat.sln /m /verbosity:minimal /p:Configuration=Release /p:Platform=x64
|
||||||
|
|
||||||
|
To build the installer, open ``win32\zoitechat.sln`` in Visual Studio,
|
||||||
|
set ``release/installer`` as the startup project, then run **Build**.
|
||||||
|
|
||||||
|
The build output is written to ``..\zoitechat-build\x64``. The installer
|
||||||
|
build writes a ``ZoiteChat*.exe`` installer in that output tree.
|
||||||
|
|
||||||
|
Unix
|
||||||
|
----
|
||||||
|
|
||||||
|
First of all, you have to install the build dependencies. Package names
|
||||||
|
differ across distros, so be creative and check meson's output
|
||||||
|
if you get an error.
|
||||||
|
|
||||||
|
Most package-managers can get the dependencies for you:
|
||||||
|
|
||||||
|
- dnf::
|
||||||
|
|
||||||
|
dnf install -y meson gettext-devel gtk3-devel iso-codes-devel libarchive-devel libayatana-appindicator-gtk3-devel libcanberra-devel lua-devel openssl-devel perl-devel perl-ExtUtils-Embed python3-cffi python3-devel
|
||||||
|
|
||||||
|
- apt::
|
||||||
|
|
||||||
|
apt-get install -y meson gettext iso-codes libarchive-dev libayatana-appindicator3-dev libcanberra-dev libglib2.0-dev libgtk-3-dev liblua5.4-dev libpci-dev libperl-dev libssl-dev python3-dev python3-cffi desktop-file-utils
|
||||||
|
|
||||||
|
ZoiteChat has its source code hosted using `Git <http://git-scm.com/>`_, so you have to install Git as
|
||||||
|
well. When it's ready, you can start the actual compilation, which is
|
||||||
|
basically:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
git clone https://github.com/zoitechat/zoitechat.git
|
||||||
|
cd zoitechat
|
||||||
|
meson setup build
|
||||||
|
ninja -C build
|
||||||
|
sudo ninja -C build install
|
||||||
|
|
||||||
|
This will compile with defaults. See ``meson configure build`` for more info
|
||||||
|
about flags.
|
||||||
|
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
Commands
|
||||||
|
========
|
||||||
|
|
||||||
|
Commands in ZoiteChat are prefixed with **/** and to escape them you can type it twice e.g. **//**
|
||||||
|
|
||||||
|
ZoiteChat will first try to run plugin commands, then user commands, then client commands, and lastly send it directly to the server.
|
||||||
|
|
||||||
|
User Commands
|
||||||
|
-------------
|
||||||
|
|
||||||
|
User commands can be used to create aliases, to run multiple commands at a time, or more complex custom commands. They are set in :menuselection:`Settings --> User Commands`.
|
||||||
|
|
||||||
|
An alias is just a shortcut refering to an existing command, for example */j* refers to */join &2*
|
||||||
|
|
||||||
|
Naming two user commands the same thing will run both in the order they are listed.
|
||||||
|
|
||||||
|
For more complex commands you can use these codes:
|
||||||
|
|
||||||
|
- **%c** Current channel
|
||||||
|
- **%e** Current network
|
||||||
|
- **%m** Machine info
|
||||||
|
- **%n** Your nick
|
||||||
|
- **%t** Time/date
|
||||||
|
- **%v** ZoiteChat version
|
||||||
|
- **%<num>** Word
|
||||||
|
- **&<num>** Word from end of line
|
||||||
|
|
||||||
|
.. _commands_list:
|
||||||
|
|
||||||
|
List of Commands
|
||||||
|
----------------
|
||||||
|
|
||||||
|
To get a full list of commands and what they do type :command:`/help -l`.
|
||||||
@@ -0,0 +1,300 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# ZoiteChat documentation build configuration file, created by
|
||||||
|
# sphinx-quickstart on Thu Jan 03 18:13:28 2013.
|
||||||
|
#
|
||||||
|
# This file is execfile()d with the current directory set to its
|
||||||
|
# containing dir.
|
||||||
|
#
|
||||||
|
# Note that not all possible configuration values are present in this
|
||||||
|
# autogenerated file.
|
||||||
|
#
|
||||||
|
# All configuration values have a default; values that are commented out
|
||||||
|
# serve to show the default.
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
|
#sys.path.insert(0, os.path.abspath('.'))
|
||||||
|
|
||||||
|
# -- General configuration ----------------------------------------------------
|
||||||
|
|
||||||
|
# If your documentation needs a minimal Sphinx version, state it here.
|
||||||
|
needs_sphinx = '1.8'
|
||||||
|
|
||||||
|
# Add any Sphinx extension module names here, as strings. They can be
|
||||||
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||||
|
extensions = []
|
||||||
|
|
||||||
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
|
templates_path = ['_templates']
|
||||||
|
|
||||||
|
# The suffix of source filenames.
|
||||||
|
source_suffix = '.rst'
|
||||||
|
|
||||||
|
# The encoding of source files.
|
||||||
|
source_encoding = 'utf-8'
|
||||||
|
|
||||||
|
# The master toctree document.
|
||||||
|
master_doc = 'index'
|
||||||
|
|
||||||
|
# General information about the project.
|
||||||
|
project = u'ZoiteChat'
|
||||||
|
copyright = u'2026, TingPing'
|
||||||
|
|
||||||
|
# Read the release directly from the repository's VERSION file so the
|
||||||
|
# documentation always matches the ZoiteChat source/release being built.
|
||||||
|
_version_file = os.path.abspath(
|
||||||
|
os.path.join(os.path.dirname(__file__), '..', 'VERSION')
|
||||||
|
)
|
||||||
|
with open(_version_file, encoding='utf-8') as version_file:
|
||||||
|
release = version_file.read().strip()
|
||||||
|
|
||||||
|
# The short X.Y version used by Sphinx.
|
||||||
|
version = '.'.join(release.split('.')[:2])
|
||||||
|
|
||||||
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
|
# for a list of supported languages.
|
||||||
|
#language = 'en'
|
||||||
|
|
||||||
|
# There are two options for replacing |today|: either, you set today to some
|
||||||
|
# non-false value, then it is used:
|
||||||
|
#today = ''
|
||||||
|
# Else, today_fmt is used as the format for a strftime call.
|
||||||
|
#today_fmt = '%B %d, %Y'
|
||||||
|
|
||||||
|
# List of patterns, relative to source directory, that match files and
|
||||||
|
# directories to ignore when looking for source files.
|
||||||
|
exclude_patterns = ['_build']
|
||||||
|
|
||||||
|
# The reST default role (used for this markup: `text`) to use for all documents
|
||||||
|
#default_role = None
|
||||||
|
|
||||||
|
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||||
|
#add_function_parentheses = True
|
||||||
|
|
||||||
|
# If true, the current module name will be prepended to all description
|
||||||
|
# unit titles (such as .. function::).
|
||||||
|
#add_module_names = True
|
||||||
|
|
||||||
|
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||||
|
# output. They are ignored by default.
|
||||||
|
#show_authors = False
|
||||||
|
|
||||||
|
# The name of the Pygments (syntax highlighting) style to use.
|
||||||
|
pygments_style = 'sphinx'
|
||||||
|
|
||||||
|
# A list of ignored prefixes for module index sorting.
|
||||||
|
#modindex_common_prefix = []
|
||||||
|
|
||||||
|
# Trim spaces before footnote references that are necessary for the reST
|
||||||
|
# parser to recognize the footnote, but do not look too nice in the output.
|
||||||
|
trim_footnote_reference_space = True
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for HTML output --------------------------------------------------
|
||||||
|
|
||||||
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||||
|
# a list of builtin themes.
|
||||||
|
html_theme = 'zoitechat'
|
||||||
|
|
||||||
|
# Theme options are theme-specific and customize the look and feel of a theme
|
||||||
|
# further. For a list of options available for each theme, see the
|
||||||
|
# documentation.
|
||||||
|
#html_theme_options = {'bootswatch_theme': "united",}
|
||||||
|
|
||||||
|
# Add any paths that contain custom themes here, relative to this directory.
|
||||||
|
html_theme_path = ['_theme']
|
||||||
|
|
||||||
|
# RTD_NEW_THEME = True
|
||||||
|
|
||||||
|
# The name for this set of Sphinx documents. If None, it defaults to
|
||||||
|
# "<project> v<release> documentation".
|
||||||
|
#html_title = 'ZoiteChat project'
|
||||||
|
|
||||||
|
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||||
|
#html_short_title = None
|
||||||
|
|
||||||
|
# A dictionary of values to pass into the template engine’s context for all
|
||||||
|
# pages. Single values can also be put in this dictionary using the -A command-line
|
||||||
|
# option of sphinx-build.
|
||||||
|
#html_context = { 'foo': 'bar' }
|
||||||
|
|
||||||
|
html_context = {
|
||||||
|
'zoite_site_url': 'https://zoitechat.org/',
|
||||||
|
'zoite_download_url': 'https://zoitechat.org/download.php',
|
||||||
|
'zoite_addons_url': 'https://zoitechat.org/addons.php',
|
||||||
|
'zoite_announcements_url': 'https://zoitechat.org/announcements.php',
|
||||||
|
'zoite_github_url': 'https://github.com/ZoiteChat/zoitechat',
|
||||||
|
'zoite_atlas_url': 'https://atlas.zoitechat.org/',
|
||||||
|
'zoite_irc_url': 'https://zoite.net/webchat/?join=%23zoitechat',
|
||||||
|
'libera_irc_url': 'https://web.libera.chat/#zoitechat',
|
||||||
|
}
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top
|
||||||
|
# of the sidebar.
|
||||||
|
html_logo = '_static/zoitechat-logo.svg'
|
||||||
|
|
||||||
|
# Use the ZoiteChat logo instead of the old HexChat favicon.
|
||||||
|
html_favicon = '_static/zoitechat-logo.svg'
|
||||||
|
|
||||||
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
|
html_static_path = ['_static']
|
||||||
|
|
||||||
|
# Local, readable assets shared by hosted and offline HTML documentation.
|
||||||
|
html_css_files = ['css/zoitechat-docs.css', 'css/zoitechat-site.css']
|
||||||
|
html_js_files = ['js/zoitechat-docs.js']
|
||||||
|
|
||||||
|
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||||
|
# using the given strftime format.
|
||||||
|
html_last_updated_fmt = '%b %d %Y, %H:%M:%S'
|
||||||
|
|
||||||
|
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||||
|
# typographically correct entities.
|
||||||
|
html_use_smartypants = True
|
||||||
|
|
||||||
|
# Sphinx will add "permalinks" for each heading and description environment
|
||||||
|
# as paragraph signs that become visible when the mouse hovers over them.
|
||||||
|
# Changed in version 1.1 to take the text of the permalink, but defaults
|
||||||
|
# to paragraph symbol.
|
||||||
|
#html_add_permalinks = True
|
||||||
|
|
||||||
|
# Custom sidebar templates, maps document names to template names.
|
||||||
|
#html_sidebars = {}
|
||||||
|
|
||||||
|
# Additional templates that should be rendered to pages, maps page names to
|
||||||
|
# template names.
|
||||||
|
#html_additional_pages = {}
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#html_domain_indices = True
|
||||||
|
|
||||||
|
# If false, no index is generated.
|
||||||
|
#html_use_index = True
|
||||||
|
|
||||||
|
# If true, the index is split into individual pages for each letter.
|
||||||
|
#html_split_index = False
|
||||||
|
|
||||||
|
# If true, the reST sources are included in the HTML build as _sources/name.
|
||||||
|
# The default is True.
|
||||||
|
#
|
||||||
|
# Warning
|
||||||
|
# If this config value is set to False, the JavaScript search function will
|
||||||
|
# only display the titles of matching documents, and no excerpt from the
|
||||||
|
# matching contents.
|
||||||
|
html_copy_source = True
|
||||||
|
|
||||||
|
# If true, links to the reST sources are added to the pages.
|
||||||
|
#html_show_sourcelink = True
|
||||||
|
|
||||||
|
# If true, an OpenSearch description file will be output, and all pages will
|
||||||
|
# contain a <link> tag referring to it. The value of this option must be the
|
||||||
|
# base URL from which the finished HTML is served.
|
||||||
|
#html_use_opensearch = ''
|
||||||
|
|
||||||
|
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||||
|
html_file_suffix = '.html'
|
||||||
|
|
||||||
|
# Suffix for generated links to HTML files.
|
||||||
|
# The default is whatever html_file_suffix is set to;
|
||||||
|
# it can be set differently (e.g. to support different web server setups).
|
||||||
|
#html_link_suffix = '.html'
|
||||||
|
|
||||||
|
# A string with the fully-qualified name of a HTML Translator class,
|
||||||
|
# that is, a subclass of Sphinx’ HTMLTranslator, that is used to translate
|
||||||
|
# document trees to HTML. Default is None (use the builtin translator).
|
||||||
|
#html_translator_class
|
||||||
|
|
||||||
|
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||||
|
html_show_copyright = False
|
||||||
|
|
||||||
|
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||||
|
html_show_sphinx = False
|
||||||
|
|
||||||
|
# Output file base name for HTML help builder.
|
||||||
|
htmlhelp_basename = 'ZoiteChatdoc'
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for LaTeX output --------------------------------------------------
|
||||||
|
|
||||||
|
latex_elements = {
|
||||||
|
# The paper size ('letterpaper' or 'a4paper').
|
||||||
|
#'papersize': 'letterpaper',
|
||||||
|
|
||||||
|
# The font size ('10pt', '11pt' or '12pt').
|
||||||
|
#'pointsize': '10pt',
|
||||||
|
|
||||||
|
# Additional stuff for the LaTeX preamble.
|
||||||
|
#'preamble': '',
|
||||||
|
}
|
||||||
|
|
||||||
|
# Grouping the document tree into LaTeX files. List of tuples
|
||||||
|
# (source start file, target name, title, author, documentclass [howto/manual]).
|
||||||
|
latex_documents = [
|
||||||
|
('index', 'ZoiteChat.tex', u'ZoiteChat Documentation',
|
||||||
|
u'TingPing', 'manual'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
|
# the title page.
|
||||||
|
#latex_logo = None
|
||||||
|
|
||||||
|
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||||
|
# not chapters.
|
||||||
|
#latex_use_parts = False
|
||||||
|
|
||||||
|
# If true, show page references after internal links.
|
||||||
|
#latex_show_pagerefs = False
|
||||||
|
|
||||||
|
# If true, show URL addresses after external links.
|
||||||
|
#latex_show_urls = False
|
||||||
|
|
||||||
|
# Documents to append as an appendix to all manuals.
|
||||||
|
#latex_appendices = []
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#latex_domain_indices = True
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for manual page output --------------------------------------------
|
||||||
|
|
||||||
|
# One entry per manual page. List of tuples
|
||||||
|
# (source start file, name, description, authors, manual section).
|
||||||
|
man_pages = [
|
||||||
|
('index', 'zoitechat', u'ZoiteChat Documentation',
|
||||||
|
[u'TingPing'], 1)
|
||||||
|
]
|
||||||
|
|
||||||
|
# If true, show URL addresses after external links.
|
||||||
|
#man_show_urls = False
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for Texinfo output ------------------------------------------------
|
||||||
|
|
||||||
|
# Grouping the document tree into Texinfo files. List of tuples
|
||||||
|
# (source start file, target name, title, author,
|
||||||
|
# dir menu entry, description, category)
|
||||||
|
texinfo_documents = [
|
||||||
|
('index', 'ZoiteChat', u'ZoiteChat Documentation',
|
||||||
|
u'TingPing', 'ZoiteChat', 'One line description of project.',
|
||||||
|
'Miscellaneous'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Documents to append as an appendix to all manuals.
|
||||||
|
#texinfo_appendices = []
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#texinfo_domain_indices = True
|
||||||
|
|
||||||
|
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
||||||
|
#texinfo_show_urls = 'footnote'
|
||||||
|
|
||||||
|
# -- Translations ---------------------------------
|
||||||
|
|
||||||
|
locale_dirs = ['po']
|
||||||
|
gettext_compact = False
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
Developers
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
building
|
||||||
|
plugins
|
||||||
|
|
||||||
|
Scripting
|
||||||
|
---------
|
||||||
|
|
||||||
|
ZoiteChat currently supports scripting with Python 3, Perl, and Lua, with Lua being the recommended option.
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
script*
|
||||||
|
|
||||||
|
Building Perl modules on Windows
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
perl_modules
|
||||||