Compare commits
402 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
a786211d6c | 5 years ago |
|
|
716233534b | 5 years ago |
|
|
138b405f0c | 5 years ago |
|
|
67d76bdc68 | 5 years ago |
|
|
61bb8b2241 | 6 years ago |
|
|
bb2e7222ba | 6 years ago |
|
|
f04cac6d6e | 6 years ago |
|
|
f09418bbb6 | 6 years ago |
|
|
ed3ab6b4fc | 6 years ago |
|
|
f087d20e6e | 6 years ago |
|
|
a8e9513783 | 6 years ago |
|
|
c82db690cc | 6 years ago |
|
|
cb3f58ad06 | 7 years ago |
|
|
b69c870a30 | 8 years ago |
|
|
e78b4a9207 | 8 years ago |
|
|
3cd4023fb3 | 8 years ago |
|
|
f40f86fa87 | 8 years ago |
|
|
c3a2e016bb | 8 years ago |
|
|
c8e9479186 | 8 years ago |
|
|
10dfa65860 | 8 years ago |
|
|
3bd8466e93 | 8 years ago |
|
|
76c8c16d79 | 8 years ago |
|
|
3cb34830eb | 8 years ago |
|
|
db2236001c | 8 years ago |
|
|
3756f7f6b8 | 8 years ago |
|
|
99f78fa553 | 8 years ago |
|
|
a9b6a312a7 | 8 years ago |
|
|
6aa8e37efe | 8 years ago |
|
|
ceac8c91ff | 9 years ago |
|
|
5b238c8dab | 9 years ago |
|
|
022d076054 | 9 years ago |
|
|
2952b68db8 | 9 years ago |
|
|
bb3bd6fec3 | 9 years ago |
|
|
e63bf22948 | 9 years ago |
|
|
5376947571 | 9 years ago |
|
|
975c898376 | 9 years ago |
|
|
a137a86a23 | 9 years ago |
|
|
839c7f6939 | 9 years ago |
|
|
7a59cd1457 | 9 years ago |
|
|
24849acada | 9 years ago |
|
|
ab9571bbc5 | 10 years ago |
|
|
56a31dc4a7 | 10 years ago |
|
|
7af4d439bd | 10 years ago |
|
|
cd2d7549b3 | 10 years ago |
|
|
3465bed290 | 10 years ago |
|
|
4ec3a673ff | 10 years ago |
|
|
5ed9c48196 | 10 years ago |
|
|
3c91283ede | 10 years ago |
|
|
e941181f46 | 10 years ago |
|
|
43e82adf0d | 10 years ago |
|
|
42cf1c7d8f | 10 years ago |
|
|
dce4fb3737 | 10 years ago |
|
|
646b351cc7 | 10 years ago |
|
|
e3b7e1d620 | 10 years ago |
|
|
04db03a4e6 | 10 years ago |
|
|
4a4817b3aa | 10 years ago |
|
|
7e1182ce55 | 10 years ago |
|
|
40529e1469 | 10 years ago |
|
|
14343e69cc | 11 years ago |
|
|
35db6d8afc | 11 years ago |
|
|
3d1090ba89 | 12 years ago |
|
|
18248ebf4b | 12 years ago |
|
|
b468873b2b | 12 years ago |
|
|
cdec9782a1 | 13 years ago |
|
|
6af273771c | 13 years ago |
|
|
4fb31e0896 | 13 years ago |
|
|
b800a1d136 | 13 years ago |
|
|
33a74489f0 | 13 years ago |
|
|
5364697914 | 13 years ago |
|
|
7edc596311 | 13 years ago |
|
|
68b400e95d | 13 years ago |
|
|
656882d76f | 13 years ago |
|
|
1479e76f01 | 13 years ago |
|
|
f2544a3318 | 13 years ago |
|
|
aafeaf7317 | 13 years ago |
|
|
f21d46ea7d | 13 years ago |
|
|
c0ba635c50 | 13 years ago |
|
|
0a673ad7a3 | 13 years ago |
|
|
3aabc08ede | 13 years ago |
|
|
d456617f0e | 13 years ago |
|
|
61fe833a06 | 13 years ago |
|
|
917e281634 | 13 years ago |
|
|
31451c3ad3 | 13 years ago |
|
|
344f35f9f5 | 13 years ago |
|
|
87adcd263b | 13 years ago |
|
|
fd3c19bd55 | 13 years ago |
|
|
1bdb393f81 | 14 years ago |
|
|
940feed314 | 14 years ago |
|
|
606b44179d | 14 years ago |
|
|
20f6917910 | 14 years ago |
|
|
820cbb3545 | 14 years ago |
|
|
90f3238301 | 14 years ago |
|
|
3bfc43c3d0 | 14 years ago |
|
|
c1128417a9 | 14 years ago |
|
|
1b62f8fa58 | 14 years ago |
|
|
54c3044dec | 14 years ago |
|
|
51336aa4a3 | 14 years ago |
|
|
c4b6ac812e | 14 years ago |
|
|
873bcb97a9 | 14 years ago |
|
|
907db0a851 | 14 years ago |
|
|
4e7c469862 | 14 years ago |
|
|
26445a0dc9 | 14 years ago |
|
|
b5068e32e9 | 14 years ago |
|
|
f099d2d5b5 | 14 years ago |
|
|
80a9da555e | 14 years ago |
|
|
d21026f0a1 | 14 years ago |
|
|
e5a1e77351 | 14 years ago |
|
|
8262d9e663 | 14 years ago |
|
|
90af1ced3c | 14 years ago |
|
|
5ccd42f807 | 14 years ago |
|
|
1586b7a02d | 14 years ago |
|
|
2420071f4c | 14 years ago |
|
|
04c26574b8 | 14 years ago |
|
|
b1a28ae1da | 14 years ago |
|
|
f68a01cd76 | 14 years ago |
|
|
2b625eb73e | 14 years ago |
|
|
0f1f30daca | 15 years ago |
|
|
dec4850d05 | 15 years ago |
|
|
0de4197cc5 | 15 years ago |
|
|
a372248b80 | 15 years ago |
|
|
69e7d7dfd3 | 15 years ago |
|
|
c99fe7dd7d | 15 years ago |
|
|
d6670a800d | 15 years ago |
|
|
6288c44697 | 15 years ago |
|
|
d5c5c52b30 | 15 years ago |
|
|
d0b4575bf4 | 15 years ago |
|
|
03518ce49e | 15 years ago |
|
|
cd8bb06af5 | 15 years ago |
|
|
3150a8a1be | 15 years ago |
|
|
b3c5f5435a | 15 years ago |
|
|
a692bdcf2b | 15 years ago |
|
|
d83454f6b7 | 15 years ago |
|
|
27b0142203 | 15 years ago |
|
|
867ba36030 | 15 years ago |
|
|
e83f36db10 | 15 years ago |
|
|
212f417e44 | 15 years ago |
|
|
3a392b8558 | 15 years ago |
|
|
92fe06b501 | 15 years ago |
|
|
6cf29bff33 | 15 years ago |
|
|
60c06a7cb4 | 15 years ago |
|
|
1147546122 | 15 years ago |
|
|
d384cee751 | 15 years ago |
|
|
5c710cf89c | 15 years ago |
|
|
8a111c181e | 15 years ago |
|
|
2255bf46a0 | 15 years ago |
|
|
04797343db | 15 years ago |
|
|
e7d41cc188 | 15 years ago |
|
|
22d8818850 | 15 years ago |
|
|
6784429c3c | 15 years ago |
|
|
37fea84de8 | 15 years ago |
|
|
c14d293e51 | 15 years ago |
|
|
79b1657a19 | 15 years ago |
|
|
d24837f1ad | 15 years ago |
|
|
3c2d303c0e | 15 years ago |
|
|
1e20a0f78a | 15 years ago |
|
|
96f9855248 | 15 years ago |
|
|
3c48858ffa | 15 years ago |
|
|
dd46d5b588 | 15 years ago |
|
|
0bc4e41ebd | 15 years ago |
|
|
703c4dd253 | 15 years ago |
|
|
b68528d85d | 15 years ago |
|
|
a644baf674 | 16 years ago |
|
|
c1f8688bfa | 16 years ago |
|
|
bea4dd2490 | 16 years ago |
|
|
83d10be1c1 | 16 years ago |
|
|
1529058f27 | 16 years ago |
|
|
36311d88af | 16 years ago |
|
|
f1a2a3c850 | 16 years ago |
|
|
ee734fae6b | 16 years ago |
|
|
62d3caa999 | 16 years ago |
|
|
4c9b397ff9 | 16 years ago |
|
|
5c6545adf5 | 16 years ago |
|
|
a704b1ee34 | 16 years ago |
|
|
f83d61dfe8 | 16 years ago |
|
|
c6180949a7 | 16 years ago |
|
|
1973ab0643 | 16 years ago |
|
|
427053f8d1 | 16 years ago |
|
|
a88e0373ef | 16 years ago |
|
|
aa9f2be24e | 16 years ago |
|
|
c53b29e60b | 16 years ago |
|
|
d6bdd03d91 | 16 years ago |
|
|
1144e98394 | 16 years ago |
|
|
7671d03a90 | 16 years ago |
|
|
bc554d45d8 | 16 years ago |
|
|
ac4caea921 | 16 years ago |
|
|
161f2d921b | 17 years ago |
|
|
210378f198 | 17 years ago |
|
|
7879616a75 | 17 years ago |
|
|
9e8dd3479d | 17 years ago |
|
|
0b72be924d | 17 years ago |
|
|
91e902f7fe | 17 years ago |
|
|
30fed9a211 | 17 years ago |
|
|
c45d46ad9a | 17 years ago |
|
|
6f55de8310 | 17 years ago |
|
|
07ad298133 | 17 years ago |
|
|
f0a4845e7d | 17 years ago |
|
|
82ec7a7ed4 | 17 years ago |
|
|
e7300e0f6f | 17 years ago |
|
|
c3feffa1e2 | 17 years ago |
|
|
956a430054 | 17 years ago |
|
|
01056b6636 | 17 years ago |
|
|
eb260b1a41 | 17 years ago |
|
|
7fe81359d4 | 17 years ago |
|
|
a3a859b4e9 | 17 years ago |
|
|
9c066c24b3 | 17 years ago |
|
|
0a668922a4 | 17 years ago |
|
|
5762964232 | 17 years ago |
|
|
cba6b211c2 | 17 years ago |
|
|
42750a621b | 17 years ago |
|
|
8ef465d592 | 17 years ago |
|
|
33fe200b52 | 17 years ago |
|
|
91fffb3f7d | 17 years ago |
|
|
1fa31efebf | 17 years ago |
|
|
244addb3f4 | 17 years ago |
|
|
c13be8d620 | 17 years ago |
|
|
dc39ae8568 | 17 years ago |
|
|
966d76a428 | 17 years ago |
|
|
7151bf8329 | 17 years ago |
|
|
dfecd46190 | 17 years ago |
|
|
5bc4db0f76 | 17 years ago |
|
|
999d6e795f | 17 years ago |
|
|
636075297c | 17 years ago |
|
|
6877a00033 | 17 years ago |
|
|
0927d635bc | 17 years ago |
|
|
450b08dde2 | 17 years ago |
|
|
da80487c07 | 17 years ago |
|
|
d9779c06fc | 17 years ago |
|
|
20996c6c5a | 17 years ago |
|
|
8dc9fcf1b9 | 17 years ago |
|
|
fc21dd4b7e | 17 years ago |
|
|
758b100d12 | 17 years ago |
|
|
8420fb1ced | 17 years ago |
|
|
f6128a16f9 | 17 years ago |
|
|
87526be6f0 | 17 years ago |
|
|
565050ac51 | 17 years ago |
|
|
5e408d8ff6 | 17 years ago |
|
|
1724f7fa43 | 17 years ago |
|
|
3e6fe6b541 | 17 years ago |
|
|
6620615ab9 | 17 years ago |
|
|
61c3095f2f | 17 years ago |
|
|
a72dc2fec2 | 17 years ago |
|
|
8b17f5517b | 17 years ago |
|
|
cd96232f7e | 17 years ago |
|
|
a9e145fe6d | 17 years ago |
|
|
5dd92c7655 | 17 years ago |
|
|
52bd69c2a4 | 17 years ago |
|
|
ca376970db | 17 years ago |
|
|
8352f2b3a8 | 17 years ago |
|
|
d4bfde79f3 | 17 years ago |
|
|
7ac8c1d4e1 | 17 years ago |
|
|
16e1ef5d40 | 17 years ago |
|
|
1d729384d1 | 17 years ago |
|
|
25c1eb28f9 | 17 years ago |
|
|
d719cc9a0e | 17 years ago |
|
|
9cde6570cc | 17 years ago |
|
|
e408ca97d8 | 17 years ago |
|
|
183dc670a3 | 17 years ago |
|
|
25947bcfdb | 17 years ago |
|
|
1ddfc571ae | 17 years ago |
|
|
21cd59a630 | 17 years ago |
|
|
6cbe47d481 | 17 years ago |
|
|
029655bb22 | 17 years ago |
|
|
27db9d4448 | 17 years ago |
|
|
176408afa8 | 17 years ago |
|
|
64674c395b | 17 years ago |
|
|
b9dee2c6f1 | 17 years ago |
|
|
a73ff905b0 | 17 years ago |
|
|
e3f0445df1 | 17 years ago |
|
|
ab06f7444b | 17 years ago |
|
|
a2a3590979 | 17 years ago |
|
|
e8aafb8e91 | 17 years ago |
|
|
18b1312449 | 17 years ago |
|
|
80ee95473b | 17 years ago |
|
|
454a04acdf | 17 years ago |
|
|
891831fe62 | 17 years ago |
|
|
cdb8e27453 | 17 years ago |
|
|
5c4913e983 | 17 years ago |
|
|
fa5ae54bbb | 17 years ago |
|
|
7de534192c | 17 years ago |
|
|
54dc0d542c | 17 years ago |
|
|
913333f518 | 17 years ago |
|
|
d702f39274 | 17 years ago |
|
|
0d8671a5ad | 17 years ago |
|
|
38e9b67026 | 17 years ago |
|
|
a3bbdb1b7b | 17 years ago |
|
|
d53ceee682 | 17 years ago |
|
|
78f56672b5 | 17 years ago |
|
|
c2fff604a7 | 17 years ago |
|
|
6644a6aa2e | 17 years ago |
|
|
3da2453997 | 17 years ago |
|
|
2ce37bc69e | 17 years ago |
|
|
f27ccc5c60 | 17 years ago |
|
|
2dbfda72f0 | 17 years ago |
|
|
7df39f3fc7 | 17 years ago |
|
|
0b45199cec | 17 years ago |
|
|
3632d7132f | 17 years ago |
|
|
565697087b | 17 years ago |
|
|
ea0008cba2 | 17 years ago |
|
|
af508c2e82 | 17 years ago |
|
|
f0d1d5206f | 17 years ago |
|
|
1c80c05587 | 17 years ago |
|
|
1e350be229 | 17 years ago |
|
|
1a26389e2b | 17 years ago |
|
|
bf9da23f07 | 17 years ago |
|
|
2373940215 | 17 years ago |
|
|
90687482ad | 17 years ago |
|
|
5ab627c06c | 17 years ago |
|
|
76d7e80fc4 | 17 years ago |
|
|
af8049bce8 | 17 years ago |
|
|
2bb51b3246 | 17 years ago |
|
|
b16d8282be | 17 years ago |
|
|
fef4614772 | 17 years ago |
|
|
be39dddcc5 | 17 years ago |
|
|
6d209b9b29 | 17 years ago |
|
|
57a0788bd8 | 17 years ago |
|
|
3ad906eede | 17 years ago |
|
|
0be9fb8797 | 17 years ago |
|
|
62a491e36d | 17 years ago |
|
|
0b5dcf229f | 17 years ago |
|
|
fda92f46aa | 17 years ago |
|
|
a62ea4062f | 17 years ago |
|
|
7dc28d130f | 17 years ago |
|
|
fbce733532 | 17 years ago |
|
|
e7572804fa | 17 years ago |
|
|
ed1bef1241 | 17 years ago |
|
|
2b047e460b | 17 years ago |
|
|
5f74dc5e78 | 17 years ago |
|
|
ea8a4ca46a | 18 years ago |
|
|
4883a06221 | 18 years ago |
|
|
4dea5324c0 | 18 years ago |
|
|
53cac17692 | 18 years ago |
|
|
83abfc05eb | 18 years ago |
|
|
862b0d541d | 18 years ago |
|
|
c1c6fdc5d8 | 18 years ago |
|
|
9a4d07d9de | 18 years ago |
|
|
30410108eb | 18 years ago |
|
|
753e0e048e | 18 years ago |
|
|
d15d4ba45a | 18 years ago |
|
|
815f9c054d | 18 years ago |
|
|
addc52c948 | 18 years ago |
|
|
26f41c9055 | 18 years ago |
|
|
73ec124ae9 | 18 years ago |
|
|
ec11a3470c | 18 years ago |
|
|
4b3b597da3 | 18 years ago |
|
|
288cf78b18 | 18 years ago |
|
|
6411aa921b | 18 years ago |
|
|
db5db8806f | 18 years ago |
|
|
258c338030 | 18 years ago |
|
|
85da537856 | 18 years ago |
|
|
2b4157eccd | 18 years ago |
|
|
0f26de991f | 18 years ago |
|
|
840f937a98 | 18 years ago |
|
|
6975a7e31a | 18 years ago |
|
|
47f63dce55 | 18 years ago |
|
|
02a8ca95cf | 18 years ago |
|
|
2ce50a9cad | 18 years ago |
|
|
bfa5869da1 | 18 years ago |
|
|
087a55f8d3 | 18 years ago |
|
|
6d7285fd6e | 18 years ago |
|
|
69c7b4b0ba | 18 years ago |
|
|
97699e5b1b | 18 years ago |
|
|
2dc7f42fd7 | 18 years ago |
|
|
9f3a5cb754 | 18 years ago |
|
|
b48fa3f101 | 18 years ago |
|
|
051a404b66 | 18 years ago |
|
|
d8d733c34f | 18 years ago |
|
|
bb01e5a16f | 18 years ago |
|
|
06f7eed103 | 18 years ago |
|
|
0ffa6d1393 | 18 years ago |
|
|
15ce143620 | 18 years ago |
|
|
63d7190231 | 18 years ago |
|
|
b279cef670 | 18 years ago |
|
|
6254ef9dc7 | 18 years ago |
|
|
4a2902efe4 | 18 years ago |
|
|
6fad4c49f1 | 18 years ago |
|
|
78f0f8595f | 18 years ago |
|
|
7ecadcee39 | 18 years ago |
|
|
c86ed46a1b | 18 years ago |
|
|
9086f98068 | 18 years ago |
|
|
9aa4a9043d | 18 years ago |
|
|
d5893f55be | 18 years ago |
|
|
f529d41ca1 | 18 years ago |
|
|
45768ee04b | 18 years ago |
|
|
a6d23fb61c | 18 years ago |
|
|
bf76cefe47 | 18 years ago |
|
|
9bb0f20515 | 18 years ago |
|
|
2431ae7df7 | 18 years ago |
|
|
829b6b57e7 | 18 years ago |
|
|
7b4c512e62 | 18 years ago |
|
|
7f7c3140a9 | 18 years ago |
|
|
277155cf77 | 18 years ago |
|
|
0c38ec7cd6 | 18 years ago |
|
|
deef4c9bfd | 18 years ago |
|
|
b86c818599 | 18 years ago |
|
|
c2a916bf30 | 18 years ago |
|
|
2bd46d1ce6 | 18 years ago |
|
|
6e0ce46365 | 18 years ago |
|
|
c853d5e9bb | 18 years ago |
|
|
31da0b7525 | 18 years ago |
|
|
12ea925076 | 18 years ago |
|
|
79ecbeca7e | 18 years ago |
|
|
cf98ea2a9c | 18 years ago |
@ -1,55 +0,0 @@
|
||||
d31b5ad96b0ba7b5b0a30928fcf000428339a577 0.1
|
||||
0a6472e2203994bc5738d40a340d26f7ec9d6062 0.2
|
||||
7e66082e5092fb0bccd18a3695a0bec52c80fdb2 0.3
|
||||
eb3165734f00fe7f7da8aeebaed00e60a57caac9 0.4
|
||||
22213b9a2114167ee8ba019a012e27da0422a61a 0.5
|
||||
c11f86db4550cac5d0a648a3fe4d6d3b9a4fcf7e 0.6
|
||||
3fb41412e2492f66476d92ce8f007a8b48fb1d2a 0.7
|
||||
cd15de32e173f8ce97bfe1c9b6607937b59056b4 0.8
|
||||
fae61afa861755636c4a1070694209ace8efbb6c 0.9
|
||||
bbc98e77ae89a7c9232a5be0835f60ea00d8036e 1.0
|
||||
44a55e6e46bf6c231780b09d919977d6f01083de 1.1
|
||||
e3179ce2b90451d2807cd53b589d768412b8666b 1.2
|
||||
f5f5cbf016a94b48a8fe9c47f0736e96d166d5d4 1.3
|
||||
3cff9403766bf83a9fc2a0aef230115d68de2a8e 1.4
|
||||
728c9089b079721b43c3347124639a29baa22a97 1.5
|
||||
ad3fa2d185426c51fd5deceae809770363f8d33c 1.6
|
||||
4dbdb61c8b8ce21dee5c7050a6b103855964ed20 1.7
|
||||
d5ad819f2a66a40fa75dd2e44429f3bfc884d07b 1.7.1
|
||||
c71952fa3c7ca848ec38a6923b5c6d0e18fff431 1.8
|
||||
a5567a0d30112822db2627a04a2e7aa3b6c38148 1.9
|
||||
12deea36603da407e3f32640048846a3bd74a9ec 2.0
|
||||
a2c465098a3b972bbed00feda9804b6aae1e9531 2.1
|
||||
7e92f58754ae6edb3225f26d754bd89c1ff458cf 2.2
|
||||
719b37b37b0df829d7cf017ac70e353088fe5849 2.3
|
||||
32b246925086910d63147483160281a91a47479f 2.4
|
||||
dcbbfabc8ecc5f33a6cc950584de87da1a368045 2.5
|
||||
c7f84f23ec5aef29988dcdc4ec22a7352ee8f58e 2.5.1
|
||||
5308dd22b6ee8e3218c81d9e7e4125f235bb5778 2.6
|
||||
21951c0dfbae5af68ed77821a4d87253ee91803f 2.7
|
||||
107719a9ce3bd0c79f9f1f626596eb338a276561 2.8
|
||||
3a5910fac3ccb522a98aeeba7af7008530b25092 2.9
|
||||
76b58d21ea98257c05565a3b9c850b9b26a32968 3.0
|
||||
e1c8bef05e6e48df4f26471ea0712aa43ab9d949 3.1
|
||||
4ce65f61f01b055fa6c2901c6d2527ef741aa4bf 3.2
|
||||
f2cabc83a18f9b5b548159329ddd4dee904fa31f 3.2.1
|
||||
d3876aa792923f9a95f7ad0c7f0134533404df35 3.2.2
|
||||
0f91934037b04221ff5d1ba3a6c39c1ff26e3661 3.3
|
||||
9ede7b2d2450537e750d5505789fbe63960e97e6 3.4
|
||||
63ad05e7f9e1f4f1881fb02f529cb6c6ae81e693 3.5
|
||||
75b1b25fe0d7e29400baf30568153f668324928b 3.6
|
||||
20ec6976cee1fcfee0c2f354ae382ee3f9f68efa 3.6.1
|
||||
baee494346e520f8dee2cee9491b8350064770d2 3.7
|
||||
2ea201354cf016407ea93e1e390d1422940d29b0 3.8
|
||||
55478328b2422c700c5404a774c85e77322f41a3 3.9
|
||||
018c3846842291cb6c009dc087e7fe2f0ef53bea 4.0
|
||||
00f4180df72b49aadb2933804fde4bfb33e5666d 4.1
|
||||
c13cb8c6b7a56af74cc88346e71d2490470b546f 4.2
|
||||
e0ec0d5d8b1ef3ee04a83c7c0fee5853aa2ac6a6 4.3
|
||||
408014d2126153d2b0fce26a13ba707db222b7b9 4.4
|
||||
7c117df5d202530e85066d8b1ab02cef605c79ad 4.4.1
|
||||
2acc60d6dfe28c101a8cd44a8aa710a38ae3607c 4.5
|
||||
bcd7e18e196a00cc2e97ff3a4a58f3cdaba13856 4.6
|
||||
d6d3085307d8d98b8b012b669e858fd787befeb1 4.7
|
||||
607015ddb091d49cbd3457af41713691aa69f4d6 4.8
|
||||
22c669b2dd3673785c3476b9976da21e8783f745 4.9
|
||||
@ -0,0 +1,436 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xft/Xft.h>
|
||||
|
||||
#include "drw.h"
|
||||
#include "util.h"
|
||||
|
||||
#define UTF_INVALID 0xFFFD
|
||||
#define UTF_SIZ 4
|
||||
|
||||
static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0};
|
||||
static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
|
||||
static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000};
|
||||
static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
|
||||
|
||||
static long
|
||||
utf8decodebyte(const char c, size_t *i)
|
||||
{
|
||||
for (*i = 0; *i < (UTF_SIZ + 1); ++(*i))
|
||||
if (((unsigned char)c & utfmask[*i]) == utfbyte[*i])
|
||||
return (unsigned char)c & ~utfmask[*i];
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t
|
||||
utf8validate(long *u, size_t i)
|
||||
{
|
||||
if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
|
||||
*u = UTF_INVALID;
|
||||
for (i = 1; *u > utfmax[i]; ++i)
|
||||
;
|
||||
return i;
|
||||
}
|
||||
|
||||
static size_t
|
||||
utf8decode(const char *c, long *u, size_t clen)
|
||||
{
|
||||
size_t i, j, len, type;
|
||||
long udecoded;
|
||||
|
||||
*u = UTF_INVALID;
|
||||
if (!clen)
|
||||
return 0;
|
||||
udecoded = utf8decodebyte(c[0], &len);
|
||||
if (!BETWEEN(len, 1, UTF_SIZ))
|
||||
return 1;
|
||||
for (i = 1, j = 1; i < clen && j < len; ++i, ++j) {
|
||||
udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type);
|
||||
if (type)
|
||||
return j;
|
||||
}
|
||||
if (j < len)
|
||||
return 0;
|
||||
*u = udecoded;
|
||||
utf8validate(u, len);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
Drw *
|
||||
drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
|
||||
{
|
||||
Drw *drw = ecalloc(1, sizeof(Drw));
|
||||
|
||||
drw->dpy = dpy;
|
||||
drw->screen = screen;
|
||||
drw->root = root;
|
||||
drw->w = w;
|
||||
drw->h = h;
|
||||
drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
|
||||
drw->gc = XCreateGC(dpy, root, 0, NULL);
|
||||
XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
|
||||
|
||||
return drw;
|
||||
}
|
||||
|
||||
void
|
||||
drw_resize(Drw *drw, unsigned int w, unsigned int h)
|
||||
{
|
||||
if (!drw)
|
||||
return;
|
||||
|
||||
drw->w = w;
|
||||
drw->h = h;
|
||||
if (drw->drawable)
|
||||
XFreePixmap(drw->dpy, drw->drawable);
|
||||
drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
|
||||
}
|
||||
|
||||
void
|
||||
drw_free(Drw *drw)
|
||||
{
|
||||
XFreePixmap(drw->dpy, drw->drawable);
|
||||
XFreeGC(drw->dpy, drw->gc);
|
||||
drw_fontset_free(drw->fonts);
|
||||
free(drw);
|
||||
}
|
||||
|
||||
/* This function is an implementation detail. Library users should use
|
||||
* drw_fontset_create instead.
|
||||
*/
|
||||
static Fnt *
|
||||
xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
|
||||
{
|
||||
Fnt *font;
|
||||
XftFont *xfont = NULL;
|
||||
FcPattern *pattern = NULL;
|
||||
|
||||
if (fontname) {
|
||||
/* Using the pattern found at font->xfont->pattern does not yield the
|
||||
* same substitution results as using the pattern returned by
|
||||
* FcNameParse; using the latter results in the desired fallback
|
||||
* behaviour whereas the former just results in missing-character
|
||||
* rectangles being drawn, at least with some fonts. */
|
||||
if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) {
|
||||
fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname);
|
||||
return NULL;
|
||||
}
|
||||
if (!(pattern = FcNameParse((FcChar8 *) fontname))) {
|
||||
fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname);
|
||||
XftFontClose(drw->dpy, xfont);
|
||||
return NULL;
|
||||
}
|
||||
} else if (fontpattern) {
|
||||
if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) {
|
||||
fprintf(stderr, "error, cannot load font from pattern.\n");
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
die("no font specified.");
|
||||
}
|
||||
|
||||
/* Do not allow using color fonts. This is a workaround for a BadLength
|
||||
* error from Xft with color glyphs. Modelled on the Xterm workaround. See
|
||||
* https://bugzilla.redhat.com/show_bug.cgi?id=1498269
|
||||
* https://lists.suckless.org/dev/1701/30932.html
|
||||
* https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349
|
||||
* and lots more all over the internet.
|
||||
*/
|
||||
FcBool iscol;
|
||||
if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) {
|
||||
XftFontClose(drw->dpy, xfont);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
font = ecalloc(1, sizeof(Fnt));
|
||||
font->xfont = xfont;
|
||||
font->pattern = pattern;
|
||||
font->h = xfont->ascent + xfont->descent;
|
||||
font->dpy = drw->dpy;
|
||||
|
||||
return font;
|
||||
}
|
||||
|
||||
static void
|
||||
xfont_free(Fnt *font)
|
||||
{
|
||||
if (!font)
|
||||
return;
|
||||
if (font->pattern)
|
||||
FcPatternDestroy(font->pattern);
|
||||
XftFontClose(font->dpy, font->xfont);
|
||||
free(font);
|
||||
}
|
||||
|
||||
Fnt*
|
||||
drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount)
|
||||
{
|
||||
Fnt *cur, *ret = NULL;
|
||||
size_t i;
|
||||
|
||||
if (!drw || !fonts)
|
||||
return NULL;
|
||||
|
||||
for (i = 1; i <= fontcount; i++) {
|
||||
if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) {
|
||||
cur->next = ret;
|
||||
ret = cur;
|
||||
}
|
||||
}
|
||||
return (drw->fonts = ret);
|
||||
}
|
||||
|
||||
void
|
||||
drw_fontset_free(Fnt *font)
|
||||
{
|
||||
if (font) {
|
||||
drw_fontset_free(font->next);
|
||||
xfont_free(font);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
|
||||
{
|
||||
if (!drw || !dest || !clrname)
|
||||
return;
|
||||
|
||||
if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
|
||||
DefaultColormap(drw->dpy, drw->screen),
|
||||
clrname, dest))
|
||||
die("error, cannot allocate color '%s'", clrname);
|
||||
}
|
||||
|
||||
/* Wrapper to create color schemes. The caller has to call free(3) on the
|
||||
* returned color scheme when done using it. */
|
||||
Clr *
|
||||
drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
|
||||
{
|
||||
size_t i;
|
||||
Clr *ret;
|
||||
|
||||
/* need at least two colors for a scheme */
|
||||
if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor))))
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < clrcount; i++)
|
||||
drw_clr_create(drw, &ret[i], clrnames[i]);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
drw_setfontset(Drw *drw, Fnt *set)
|
||||
{
|
||||
if (drw)
|
||||
drw->fonts = set;
|
||||
}
|
||||
|
||||
void
|
||||
drw_setscheme(Drw *drw, Clr *scm)
|
||||
{
|
||||
if (drw)
|
||||
drw->scheme = scm;
|
||||
}
|
||||
|
||||
void
|
||||
drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert)
|
||||
{
|
||||
if (!drw || !drw->scheme)
|
||||
return;
|
||||
XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel);
|
||||
if (filled)
|
||||
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
|
||||
else
|
||||
XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
|
||||
}
|
||||
|
||||
int
|
||||
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
|
||||
{
|
||||
char buf[1024];
|
||||
int ty;
|
||||
unsigned int ew;
|
||||
XftDraw *d = NULL;
|
||||
Fnt *usedfont, *curfont, *nextfont;
|
||||
size_t i, len;
|
||||
int utf8strlen, utf8charlen, render = x || y || w || h;
|
||||
long utf8codepoint = 0;
|
||||
const char *utf8str;
|
||||
FcCharSet *fccharset;
|
||||
FcPattern *fcpattern;
|
||||
FcPattern *match;
|
||||
XftResult result;
|
||||
int charexists = 0;
|
||||
|
||||
if (!drw || (render && !drw->scheme) || !text || !drw->fonts)
|
||||
return 0;
|
||||
|
||||
if (!render) {
|
||||
w = ~w;
|
||||
} else {
|
||||
XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
|
||||
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
|
||||
d = XftDrawCreate(drw->dpy, drw->drawable,
|
||||
DefaultVisual(drw->dpy, drw->screen),
|
||||
DefaultColormap(drw->dpy, drw->screen));
|
||||
x += lpad;
|
||||
w -= lpad;
|
||||
}
|
||||
|
||||
usedfont = drw->fonts;
|
||||
while (1) {
|
||||
utf8strlen = 0;
|
||||
utf8str = text;
|
||||
nextfont = NULL;
|
||||
while (*text) {
|
||||
utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ);
|
||||
for (curfont = drw->fonts; curfont; curfont = curfont->next) {
|
||||
charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint);
|
||||
if (charexists) {
|
||||
if (curfont == usedfont) {
|
||||
utf8strlen += utf8charlen;
|
||||
text += utf8charlen;
|
||||
} else {
|
||||
nextfont = curfont;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!charexists || nextfont)
|
||||
break;
|
||||
else
|
||||
charexists = 0;
|
||||
}
|
||||
|
||||
if (utf8strlen) {
|
||||
drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL);
|
||||
/* shorten text if necessary */
|
||||
for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--)
|
||||
drw_font_getexts(usedfont, utf8str, len, &ew, NULL);
|
||||
|
||||
if (len) {
|
||||
memcpy(buf, utf8str, len);
|
||||
buf[len] = '\0';
|
||||
if (len < utf8strlen)
|
||||
for (i = len; i && i > len - 3; buf[--i] = '.')
|
||||
; /* NOP */
|
||||
|
||||
if (render) {
|
||||
ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent;
|
||||
XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg],
|
||||
usedfont->xfont, x, ty, (XftChar8 *)buf, len);
|
||||
}
|
||||
x += ew;
|
||||
w -= ew;
|
||||
}
|
||||
}
|
||||
|
||||
if (!*text) {
|
||||
break;
|
||||
} else if (nextfont) {
|
||||
charexists = 0;
|
||||
usedfont = nextfont;
|
||||
} else {
|
||||
/* Regardless of whether or not a fallback font is found, the
|
||||
* character must be drawn. */
|
||||
charexists = 1;
|
||||
|
||||
fccharset = FcCharSetCreate();
|
||||
FcCharSetAddChar(fccharset, utf8codepoint);
|
||||
|
||||
if (!drw->fonts->pattern) {
|
||||
/* Refer to the comment in xfont_create for more information. */
|
||||
die("the first font in the cache must be loaded from a font string.");
|
||||
}
|
||||
|
||||
fcpattern = FcPatternDuplicate(drw->fonts->pattern);
|
||||
FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
|
||||
FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
|
||||
FcPatternAddBool(fcpattern, FC_COLOR, FcFalse);
|
||||
|
||||
FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
|
||||
FcDefaultSubstitute(fcpattern);
|
||||
match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result);
|
||||
|
||||
FcCharSetDestroy(fccharset);
|
||||
FcPatternDestroy(fcpattern);
|
||||
|
||||
if (match) {
|
||||
usedfont = xfont_create(drw, NULL, match);
|
||||
if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) {
|
||||
for (curfont = drw->fonts; curfont->next; curfont = curfont->next)
|
||||
; /* NOP */
|
||||
curfont->next = usedfont;
|
||||
} else {
|
||||
xfont_free(usedfont);
|
||||
usedfont = drw->fonts;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (d)
|
||||
XftDrawDestroy(d);
|
||||
|
||||
return x + (render ? w : 0);
|
||||
}
|
||||
|
||||
void
|
||||
drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
|
||||
{
|
||||
if (!drw)
|
||||
return;
|
||||
|
||||
XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y);
|
||||
XSync(drw->dpy, False);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
drw_fontset_getwidth(Drw *drw, const char *text)
|
||||
{
|
||||
if (!drw || !drw->fonts || !text)
|
||||
return 0;
|
||||
return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
|
||||
}
|
||||
|
||||
void
|
||||
drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h)
|
||||
{
|
||||
XGlyphInfo ext;
|
||||
|
||||
if (!font || !text)
|
||||
return;
|
||||
|
||||
XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext);
|
||||
if (w)
|
||||
*w = ext.xOff;
|
||||
if (h)
|
||||
*h = font->h;
|
||||
}
|
||||
|
||||
Cur *
|
||||
drw_cur_create(Drw *drw, int shape)
|
||||
{
|
||||
Cur *cur;
|
||||
|
||||
if (!drw || !(cur = ecalloc(1, sizeof(Cur))))
|
||||
return NULL;
|
||||
|
||||
cur->cursor = XCreateFontCursor(drw->dpy, shape);
|
||||
|
||||
return cur;
|
||||
}
|
||||
|
||||
void
|
||||
drw_cur_free(Drw *drw, Cur *cursor)
|
||||
{
|
||||
if (!cursor)
|
||||
return;
|
||||
|
||||
XFreeCursor(drw->dpy, cursor->cursor);
|
||||
free(cursor);
|
||||
}
|
||||
@ -0,0 +1,57 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
typedef struct {
|
||||
Cursor cursor;
|
||||
} Cur;
|
||||
|
||||
typedef struct Fnt {
|
||||
Display *dpy;
|
||||
unsigned int h;
|
||||
XftFont *xfont;
|
||||
FcPattern *pattern;
|
||||
struct Fnt *next;
|
||||
} Fnt;
|
||||
|
||||
enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */
|
||||
typedef XftColor Clr;
|
||||
|
||||
typedef struct {
|
||||
unsigned int w, h;
|
||||
Display *dpy;
|
||||
int screen;
|
||||
Window root;
|
||||
Drawable drawable;
|
||||
GC gc;
|
||||
Clr *scheme;
|
||||
Fnt *fonts;
|
||||
} Drw;
|
||||
|
||||
/* Drawable abstraction */
|
||||
Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h);
|
||||
void drw_resize(Drw *drw, unsigned int w, unsigned int h);
|
||||
void drw_free(Drw *drw);
|
||||
|
||||
/* Fnt abstraction */
|
||||
Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount);
|
||||
void drw_fontset_free(Fnt* set);
|
||||
unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
|
||||
void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
|
||||
|
||||
/* Colorscheme abstraction */
|
||||
void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
|
||||
Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
|
||||
|
||||
/* Cursor abstraction */
|
||||
Cur *drw_cur_create(Drw *drw, int shape);
|
||||
void drw_cur_free(Drw *drw, Cur *cursor);
|
||||
|
||||
/* Drawing context manipulation */
|
||||
void drw_setfontset(Drw *drw, Fnt *set);
|
||||
void drw_setscheme(Drw *drw, Clr *scm);
|
||||
|
||||
/* Drawing functions */
|
||||
void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert);
|
||||
int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert);
|
||||
|
||||
/* Map functions */
|
||||
void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h);
|
||||
@ -0,0 +1,42 @@
|
||||
/* cc transient.c -o transient -lX11 */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
|
||||
int main(void) {
|
||||
Display *d;
|
||||
Window r, f, t = None;
|
||||
XSizeHints h;
|
||||
XEvent e;
|
||||
|
||||
d = XOpenDisplay(NULL);
|
||||
if (!d)
|
||||
exit(1);
|
||||
r = DefaultRootWindow(d);
|
||||
|
||||
f = XCreateSimpleWindow(d, r, 100, 100, 400, 400, 0, 0, 0);
|
||||
h.min_width = h.max_width = h.min_height = h.max_height = 400;
|
||||
h.flags = PMinSize | PMaxSize;
|
||||
XSetWMNormalHints(d, f, &h);
|
||||
XStoreName(d, f, "floating");
|
||||
XMapWindow(d, f);
|
||||
|
||||
XSelectInput(d, f, ExposureMask);
|
||||
while (1) {
|
||||
XNextEvent(d, &e);
|
||||
|
||||
if (t == None) {
|
||||
sleep(5);
|
||||
t = XCreateSimpleWindow(d, r, 50, 50, 100, 100, 0, 0, 0);
|
||||
XSetTransientForHint(d, t, f);
|
||||
XStoreName(d, t, "transient");
|
||||
XMapWindow(d, t);
|
||||
XSelectInput(d, t, ExposureMask);
|
||||
}
|
||||
}
|
||||
|
||||
XCloseDisplay(d);
|
||||
exit(0);
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "util.h"
|
||||
|
||||
void *
|
||||
ecalloc(size_t nmemb, size_t size)
|
||||
{
|
||||
void *p;
|
||||
|
||||
if (!(p = calloc(nmemb, size)))
|
||||
die("calloc:");
|
||||
return p;
|
||||
}
|
||||
|
||||
void
|
||||
die(const char *fmt, ...) {
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (fmt[0] && fmt[strlen(fmt)-1] == ':') {
|
||||
fputc(' ', stderr);
|
||||
perror(NULL);
|
||||
} else {
|
||||
fputc('\n', stderr);
|
||||
}
|
||||
|
||||
exit(1);
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
#define MAX(A, B) ((A) > (B) ? (A) : (B))
|
||||
#define MIN(A, B) ((A) < (B) ? (A) : (B))
|
||||
#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B))
|
||||
|
||||
void die(const char *fmt, ...);
|
||||
void *ecalloc(size_t nmemb, size_t size);
|
||||
Loading…
Reference in New Issue