Compare commits
1504 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3c7f3e8740 | |||
| 3a9899529a | |||
| 5a015888d4 | |||
| be378eaacb | |||
| 631f5a1043 | |||
| 353e9adec1 | |||
| e572da4927 | |||
| d22afa36c3 | |||
| a7296f15ac | |||
| b20caee548 | |||
| 519832edd7 | |||
| a2cea1e5bc | |||
| b3c198f0d2 | |||
| b45a696b5d | |||
| a2b3fe6411 | |||
| 13d4f37726 | |||
| 71f34f4e31 | |||
| 018f147de6 | |||
| da012cbf8b | |||
| 3907a103fc | |||
| efb566bcc7 | |||
| 53e8df3542 | |||
| a00d262773 | |||
| b64db54793 | |||
| 97c0e3d4a9 | |||
| ba31bbace8 | |||
| 606dfd29d3 | |||
| 9411d0781b | |||
| 7aea200860 | |||
| 5d8ac95d07 | |||
| cd0ebb41aa | |||
| eb028b0dad | |||
| 61803f7516 | |||
| 50bfed79be | |||
| 1c77ae818e | |||
| 66ede6037d | |||
| 01452b7309 | |||
| b5f2470b79 | |||
| 49403e9fee | |||
| 66d512f26f | |||
| 2ba0ebf3e8 | |||
| bbcd27d3c2 | |||
| 837a3528cd | |||
| f39662588f | |||
| 4b12f52029 | |||
| f2920ddefb | |||
| ce010653d5 | |||
| ce764c862f | |||
| 60d821ae3e | |||
| 8f7f8fc0b5 | |||
| ec45041a66 | |||
| 67a666b282 | |||
| d9404fc566 | |||
| bcd899c641 | |||
| ec61ac29ea | |||
| 180e663a43 | |||
| ae1711a685 | |||
| 9c3b62574d | |||
| a3637c12d6 | |||
| cae192682b | |||
| 6c68bacaef | |||
| ee7a2b564b | |||
| fb25d90b48 | |||
| 9075a521f0 | |||
| 00a0e595ff | |||
| 694ff32b01 | |||
| a74635ff56 | |||
| 8c6f3d66b5 | |||
| a49cb06d77 | |||
| f96f478470 | |||
| 1d2f713673 | |||
| 57d24d0fbf | |||
| 584e55a89c | |||
| 4560a83441 | |||
| f4658728e8 | |||
| 54825dc66f | |||
| d4056ac10a | |||
| 8f409a8fe2 | |||
| d369d988b0 | |||
| 2a74736761 | |||
| 6bd0bf6e69 | |||
| 53cee177e8 | |||
| a8afc62db7 | |||
| 14328eb601 | |||
| 2184755fdf | |||
| 3a3cd1f856 | |||
| 24a3a41cd6 | |||
| 197f6b05ae | |||
| c2e887a86e | |||
| 12b16577ef | |||
| 409165dec6 | |||
| 4870d59a43 | |||
| 70c3bb3288 | |||
| 36156997ee | |||
| 2c2728448c | |||
| d1781a7c47 | |||
| dc1459438c | |||
| 00e6da9d64 | |||
| 68b3d75705 | |||
| 3e538b732a | |||
| 833341dea7 | |||
| bc3efe2f4c | |||
| 10e4c59f2e | |||
| d9016b7979 | |||
| d975610ecd | |||
| 5d1251f6d8 | |||
| bdf802e64a | |||
| f2b888f9ae | |||
| 9583007769 | |||
| eb81c33308 | |||
| 8d734f5cc4 | |||
| 3375ff6152 | |||
| 80fc58f83e | |||
| 17c0124747 | |||
| c220d4dd17 | |||
| 15146725e3 | |||
| ddfab824c3 | |||
| 8b5a00ca27 | |||
| 04a7f14c0e | |||
| 18f14b828c | |||
| 0a92e12a62 | |||
| 5b71281ec4 | |||
| 08fdc4f1fc | |||
| c726bef740 | |||
| 94e0ac3f54 | |||
| 284f7fc4f7 | |||
| e629460942 | |||
| 904e531113 | |||
| ca2f2adc90 | |||
| 78a3e329f5 | |||
| 5938e0f821 | |||
| 4a6ae3b46c | |||
| 2327d661b9 | |||
| 9790e37154 | |||
| f97d751343 | |||
| 81c1f6bd8e | |||
| e3a5a4239b | |||
| fcec85881f | |||
| cfefb8b2e0 | |||
| e81a2a5011 | |||
| d62b488459 | |||
| 932bd92b95 | |||
| 9fd1f95ab8 | |||
| cf414cb9cb | |||
| f676d32f96 | |||
| 939c9afeb4 | |||
| 7d88c48c39 | |||
| 26337a6bd4 | |||
| 1263a5bfc0 | |||
| fe21ca5b95 | |||
| 0fe9dad515 | |||
| 75b33c906d | |||
| 835fa77964 | |||
| 3e13186560 | |||
| 01f191289d | |||
| 6586791655 | |||
| b4f6774ca8 | |||
| 75d346fe69 | |||
| 27780c7327 | |||
| 100a8882f1 | |||
| 983bd1a57b | |||
| 810f7949f4 | |||
| 28c502bd85 | |||
| b8c313965f | |||
| 8a2dcbbcff | |||
| 263b9fa611 | |||
| 793e15f80c | |||
| 23d1394fb2 | |||
| f97bb23c9d | |||
| d557739a28 | |||
| 8d06243b57 | |||
| 9a4b73b942 | |||
| d73e0dd13c | |||
| 2f3818fe4b | |||
| d3d773079c | |||
| 0b2acec50c | |||
| 3501e4f44d | |||
| 384c540197 | |||
| 1b78ffc018 | |||
| 79f4f0adbf | |||
| 98d71308a8 | |||
| 4f0fa66575 | |||
| ecac3a0f16 | |||
| d1898b9a0b | |||
| 868c7b170e | |||
| b1c5c53687 | |||
| 6704886c6e | |||
| 7e45283ba2 | |||
| ff67d876b2 | |||
| 4975a0a8d8 | |||
| e34a4338a1 | |||
| 0b4986b47a | |||
| 937eab5f27 | |||
| 70378bfac8 | |||
| 29d87f692a | |||
| b1b2798be1 | |||
| 2b74ad8b5f | |||
| 3098fa6855 | |||
| 53883a7f1f | |||
| 2c048376d4 | |||
| b583240d58 | |||
| 844be11d43 | |||
| 53b739139b | |||
| d09d1d72e6 | |||
| 01d927aceb | |||
| 59abfcbd6d | |||
| 4c2ec15f70 | |||
| 2b6dfbf4eb | |||
| eb8372eb91 | |||
| c6b2967da0 | |||
| 042f51e58f | |||
| c72cf46db7 | |||
| 2a7aac76d9 | |||
| a569495f5d | |||
| 59e56600bc | |||
| 915dec7ba5 | |||
| 909bd3dd2d | |||
| d50fad615f | |||
| b036bedbc3 | |||
| 55c05d1a6e | |||
| 344c0f6427 | |||
| 8ab1a7268b | |||
| e5f31dbe8e | |||
| 783c5c12e9 | |||
| c972485555 | |||
| c507382d19 | |||
| fbbcbc8753 | |||
| a5fa595627 | |||
| 502045f1fa | |||
| e9280777fd | |||
| c36f402b88 | |||
| 3a68dd50ce | |||
| eb06c0da08 | |||
| 6528567746 | |||
| 09229812f4 | |||
| aaa37a3e0d | |||
| c5531b1bd8 | |||
| 021115b463 | |||
| 698d9c208f | |||
| 01a6b432f3 | |||
| a5f44b3ed6 | |||
| a3ba99c682 | |||
| 7c709fddba | |||
| 8f313b4603 | |||
| 41c0a5ee3b | |||
| 346f7aadd6 | |||
| be611c1920 | |||
| e33a866a63 | |||
| c846eeed9d | |||
| d052eac019 | |||
| 9dbd134601 | |||
| 6451e1cfe2 | |||
| 9f3f715527 | |||
| 0d8e5b139b | |||
| 5d5dda548a | |||
| 1d32e5267c | |||
| a300a25419 | |||
| 4eaf03b922 | |||
| 4401ea388c | |||
| dfe6ad3a32 | |||
| e3ef870b29 | |||
| 7deb5bfdf2 | |||
| 0e46a4402a | |||
| 33a15e69bb | |||
| ebe11fdb1e | |||
| f9a7c46868 | |||
| c80c23e8e8 | |||
| 5e6c81a98e | |||
| 214cc83d4a | |||
| 8e643fbf87 | |||
| 6008d9e12b | |||
| 81da453ec4 | |||
| f34835463d | |||
| eb3419f3fc | |||
| 5886a07300 | |||
| 69e7c27fd0 | |||
| 165cf6809f | |||
| 9b2b8b6796 | |||
| 3ed6d1dec1 | |||
| 9ad1d1c25d | |||
| 667e614bf3 | |||
| d49da1fdd0 | |||
| 85b0733169 | |||
| 7f2bba7c4a | |||
| 664ec62396 | |||
| b4a9e45214 | |||
| 2eab7044ba | |||
| 8d449f91c6 | |||
| be8a836528 | |||
| 423782fd2b | |||
| dc1dc8dffa | |||
| 16a77e2975 | |||
| df69a70dd7 | |||
| 0638c86211 | |||
| 8c0de22c14 | |||
| f83568c6c9 | |||
| 10d472728c | |||
| 2c3cb3f5ce | |||
| fbfe3fd5ed | |||
| b280a26317 | |||
| 640db8af7d | |||
| 98d9357208 | |||
| f3b6c7c09b | |||
| 3a622f111a | |||
| e0b1ed87e8 | |||
| 63578affa4 | |||
| 74b188fa46 | |||
| fadaf852b7 | |||
| ac6124951a | |||
| 89e42af149 | |||
| cf5987b2b4 | |||
| 069d8d376c | |||
| fe3d8ea2be | |||
| 3ac03b43e1 | |||
| eaf1a532f4 | |||
| f2b0116c1e | |||
| 155b5fa831 | |||
| 130c77a305 | |||
| 2e168d152f | |||
| e0890541ea | |||
| 1447b62999 | |||
| 518ae8044d | |||
| 314a90995a | |||
| 8f29e32577 | |||
| b6e25a353d | |||
| 635ed02198 | |||
| cd81a54062 | |||
| 1035d787ab | |||
| 29567df407 | |||
| 79cb4668f1 | |||
| 9bdc19e2fd | |||
| 25cd6106f5 | |||
| 13fbe59164 | |||
| c261c3367a | |||
| 8b92ab25c7 | |||
| 0aa1031270 | |||
| dec8bdb39d | |||
| f318aeb67c | |||
| 8b791e77d6 | |||
| 260b72fec1 | |||
| 7d0beafce0 | |||
| 3c2f8b65ce | |||
| 5f73e8b3bf | |||
| 74afeeb85f | |||
| f8920e5fef | |||
| dd76313084 | |||
| 627ff6f26e | |||
| 705db0b9cf | |||
| 47a958d81d | |||
| 906fc9cc1d | |||
| 44d9525476 | |||
| 8b2a549fab | |||
| 7312e34f46 | |||
| 696be858f6 | |||
| e1f4fd0c7b | |||
| f51320d1bc | |||
| a0764190f2 | |||
| 33c5b35444 | |||
| 04e10f81b5 | |||
| 7f2545a9ef | |||
| a2a16f3f23 | |||
| ab2a947992 | |||
| 7d0a73a6b0 | |||
| e3c3a68566 | |||
| 4fc026b13c | |||
| c0fed4d2c3 | |||
| b656e14453 | |||
| fbab3964e6 | |||
| d9b270b477 | |||
| 7f53a19647 | |||
| 9f1e90d007 | |||
| 9a439e1941 | |||
| 4e4c69993c | |||
| 0d085d500f | |||
| f734c0475b | |||
| a30951dc91 | |||
| c4b37950a9 | |||
| 7cf832a2f4 | |||
| 1f07e7978d | |||
| 5adab2739b | |||
| 2be76760de | |||
| 28c125a3ec | |||
| bdf8a37a8f | |||
| 838711e2ac | |||
| c085691c54 | |||
| 47506d70ed | |||
| efc7cc4980 | |||
| f2016a8aa5 | |||
| d6bbc375c4 | |||
| 885996c5cf | |||
| 4e4604e00a | |||
| b057d4fcb7 | |||
| cdf27296e4 | |||
| 889f111300 | |||
| 520b4f92ab | |||
| feb1d4ebcc | |||
| c11a7589e2 | |||
| c332b7cb40 | |||
| 418dcedc4e | |||
| a21eb9d59e | |||
| 25ed8fe044 | |||
| b079c79390 | |||
| d7a89ef122 | |||
| b95035e7a2 | |||
| e28d29f276 | |||
| c29d78ac0d | |||
| ad9106b815 | |||
| f3ea24f9f9 | |||
| 96fdece478 | |||
| c30a5782df | |||
| c924fcb91f | |||
| 46e7b6d6df | |||
| bb8ecf2f84 | |||
| 7123a6d647 | |||
| eb4ef8b3d7 | |||
| 0d346610a2 | |||
| fe0c1acd79 | |||
| b3552d8c2c | |||
| 206a15191f | |||
| 22de3980d1 | |||
| af35beefc2 | |||
| 532258bea8 | |||
| 5b257293eb | |||
| 8e6d23ddd6 | |||
| 6d5d61c842 | |||
| 9d2e2a1739 | |||
| 19e2642ec1 | |||
| f9df522b41 | |||
| b3e5c4a4aa | |||
| 06ed6c81a7 | |||
| d1e4dbb603 | |||
| abe8079296 | |||
| 033cb2790c | |||
| 188edce258 | |||
| 34858b36c1 | |||
| 044ef3447c | |||
| 2660439160 | |||
| 9502120ee3 | |||
| 7f1a3320dd | |||
| 8a4fd7f182 | |||
| b0a4d15d64 | |||
| 3f6f96cfb4 | |||
| 99a1c98ae0 | |||
| fd718dfd5c | |||
| 31cb2f1999 | |||
| a6a8e32be7 | |||
| 594bb8a76b | |||
| 228bbc1e8e | |||
| b14c2878b3 | |||
| 57f10040e1 | |||
| 0fb67c78a9 | |||
| ff0f7f49da | |||
| 9682e37547 | |||
| 7197d9480b | |||
| 3315c9c7f4 | |||
| f57eff4195 | |||
| f0c8e48403 | |||
| de87bed375 | |||
| 5cdfaab2db | |||
| acb0b029b9 | |||
| 4c74cbbbe9 | |||
| ad64e068db | |||
| 6bed3f3f09 | |||
| d02e55da06 | |||
| d662a8f2b9 | |||
| 13a93102a5 | |||
| 0d6a1e6610 | |||
| 05cd9eebb8 | |||
| d93d8ab1cc | |||
| 540fa0e669 | |||
| 17a10cf6bb | |||
| 11d0f9db03 | |||
| f024ceecdd | |||
| 08c07a0785 | |||
| b843f91b3c | |||
| 4b2c5b3321 | |||
| 2b43f2682a | |||
| 7da0124286 | |||
| feaeef6482 | |||
| 15bcfeec1d | |||
| 5fb002ab4c | |||
| f56ddbb1e0 | |||
| 6bd2a7c962 | |||
| 9d591ae806 | |||
| 7d30e3913c | |||
| 19d7dd7aa3 | |||
| 45444253fd | |||
| 308ade6a7e | |||
| 66d54ccd54 | |||
| ccf8d91f01 | |||
| 7c940a0480 | |||
| 277a2edb57 | |||
| bd742689e9 | |||
| 9ca0c3c41d | |||
| ce8650b4de | |||
| 4bce9d440e | |||
| adc691f516 | |||
| fc67a801e3 | |||
| 6a3657ca87 | |||
| 0537c5f273 | |||
| cc4a5f30b6 | |||
| b0d7c3e9b1 | |||
| 3bf7c44fc9 | |||
| 4ff4e63a11 | |||
| 72a35ba58b | |||
| b6a31979f2 | |||
| 7c710e22cc | |||
| ab58e7a225 | |||
| c9fb97cd7c | |||
| 789f3e1584 | |||
| 0fc8229be1 | |||
| a1e555267e | |||
| 0ac88c0cb5 | |||
| d43a6da62b | |||
| 940455f786 | |||
| 0f74456f30 | |||
| 7840fa6d90 | |||
| 95ccc99fee | |||
| 7b0a156bba | |||
| 0d8ae7bb37 | |||
| 9491cff1df | |||
| 51dc5d6e37 | |||
| f4c739ab92 | |||
| 0dd8ae3d77 | |||
| 7d2878d81c | |||
| bd70a05861 | |||
| 0605c7b2bc | |||
| 8e83a55143 | |||
| 4ab4eb8ef2 | |||
| d1e6150874 | |||
| 4121c99f36 | |||
| 827040f487 | |||
| 9032489786 | |||
| 8ea7bd4913 | |||
| 97b021efaf | |||
| b3f9a77ba7 | |||
| 63fdc1f876 | |||
| 17cf354c58 | |||
| c6fd8bcb99 | |||
| 1684465e04 | |||
| fe2df96953 | |||
| ee9d0cfd99 | |||
| 7b7e18e752 | |||
| 928be4151b | |||
| 37dd648686 | |||
| 93a590774e | |||
| 22b99b6d3e | |||
| 101d626d4f | |||
| 3633c19208 | |||
| e302f328f7 | |||
| f74ba95e95 | |||
| c38982d286 | |||
| fe9bac096b | |||
| 5b809c4fc6 | |||
| 4729e51e14 | |||
| 960cf7a34b | |||
| 852ab19760 | |||
| 2e45d9fc6b | |||
| 74b71b92b6 | |||
| bbc14ba74f | |||
| 45c7829cd8 | |||
| f2aa3afbbb | |||
| 909b01241b | |||
| abb58c58a0 | |||
| 700e10d32c | |||
| 4ac48d0e4a | |||
| 345b2cb835 | |||
| b962309498 | |||
| e99cb9bfb8 | |||
| 9e12e18f90 | |||
| 66fc9b38df | |||
| 5dbe429e6b | |||
| b2481ea6c1 | |||
| 86a294ce4b | |||
| a8d1eadfbf | |||
| b07d3c5403 | |||
| 892db55ae1 | |||
| 93615fef65 | |||
| 87452706ef | |||
| 3569615b21 | |||
| 86f7d09d31 | |||
| d5d1254393 | |||
| 4df90cfb9e | |||
| ec6862d31a | |||
| 6f23010382 | |||
| c672f105d3 | |||
| e60d501e4a | |||
| 0d7175058b | |||
| 3b0bd9d1d1 | |||
| bd28ac6e1f | |||
| 0c2d00c792 | |||
| 140ba653b9 | |||
| f64f008f77 | |||
| a6315bef05 | |||
| f810d7c82a | |||
| cf61dedc79 | |||
| 2ab9587f5f | |||
| 4950b52359 | |||
| 03af444735 | |||
| 7f6221b409 | |||
| 57aebdd300 | |||
| 25821ba338 | |||
| 7dda5461ad | |||
| ee0238bad8 | |||
| 451940e6a7 | |||
| 6163cc8a5a | |||
| ef859d77e9 | |||
| 0fd752657a | |||
| f1451a1de3 | |||
| fa96f25683 | |||
| 9e447383df | |||
| 5e762be32b | |||
| 75de81a3ab | |||
| d26b64a5bb | |||
| cb8d40eaf2 | |||
| ded0936bc4 | |||
| 16830a410c | |||
| 9f79dda463 | |||
| 15dc7c74d7 | |||
| f9abef9e05 | |||
| ba84499f00 | |||
| 79ce24222a | |||
| 6cb9264864 | |||
| 247a070405 | |||
| e05bb75b8a | |||
| 6a415cf232 | |||
| e8034189df | |||
| 107f329b4f | |||
| 999a13358e | |||
| 2077f51084 | |||
| 1e77a3df20 | |||
| 141a291523 | |||
| cb03d5a9d3 | |||
| b618d1e56a | |||
| 23ae638512 | |||
| eda749d7cb | |||
| 08d0186e53 | |||
| 443981ba31 | |||
| f3ed7c5e19 | |||
| dd2378b591 | |||
| b885779365 | |||
| 32b95f0d9a | |||
| 2b8eec8666 | |||
| 3f24627f54 | |||
| 0c4bca312e | |||
| e36afc675e | |||
| d754014321 | |||
| 9f73242cc5 | |||
| fae9649773 | |||
| 4b43f4cbec | |||
| b61befa210 | |||
| 5e2bc337bc | |||
| af1608cbfa | |||
| 9aa80976ff | |||
| c9cfe9e90f | |||
| 482e337762 | |||
| a0821f5a01 | |||
| 5ebdf3ed39 | |||
| 86096db02d | |||
| a93e01b896 | |||
| 0585e72c35 | |||
| c82fbefcfc | |||
| 23542a1db1 | |||
| 1bf50d60d8 | |||
| 8596b0309e | |||
| 7f6e871b26 | |||
| 8912d4d55a | |||
| 7ac849ab12 | |||
| 4cab699b04 | |||
| 03aa05e4d2 | |||
| 428a3cf0ce | |||
| 1c8b165a64 | |||
| 1869071ef7 | |||
| 33ca5ee39f | |||
| e46d5a86d3 | |||
| 2729bcac3b | |||
| d60ce41fa9 | |||
| 958db945f3 | |||
| 057f906ca4 | |||
| 8df7a45e29 | |||
| e4af1570cb | |||
| 049ebf9027 | |||
| f2f0c7df92 | |||
| bee4118513 | |||
| a1096f7ecb | |||
| dac0a6ec20 | |||
| 4327fd4c58 | |||
| 3243f57fd5 | |||
| 383c488268 | |||
| 53392d6e5d | |||
| bf48025d12 | |||
| 5e624605cf | |||
| 026490acc6 | |||
| 709ce3adb8 | |||
| a8d23489c4 | |||
| 296df113e3 | |||
| 292de83c35 | |||
| 7fe66c07e4 | |||
| 9aa8f30e2b | |||
| e3ebb30518 | |||
| 51122ab3ba | |||
| 5d96eab7b4 | |||
| 97c4e79e96 | |||
| f89bac7781 | |||
| 1d8a7f8fd3 | |||
| ef9f7ab27a | |||
| a676138745 | |||
| 7442ea7a16 | |||
| 0089cad740 | |||
| cf1fa718a8 | |||
| d6ba6ac41e | |||
| bbdd5feaa4 | |||
| 678527254b | |||
| a43943ec3d | |||
| ab3a61794b | |||
| 46bf7781aa | |||
| 99c547b625 | |||
| 6976e97de3 | |||
| f8e3e70273 | |||
| 23c9f7a957 | |||
| 2ca763cc77 | |||
| 2adc811351 | |||
| be18be4a86 | |||
| 8d7abb1b8a | |||
| 1cc5988c40 | |||
| da426ae03b | |||
| 3cebd6d923 | |||
| f1019c8ca4 | |||
| edfb7b6b24 | |||
| 157a928f5a | |||
| 5f5a2a3ef2 | |||
| 8534cf3756 | |||
| 39b90092ff | |||
| d3142ebe6d | |||
| d914c6be2e | |||
| 05c3e968df | |||
| 7756cce123 | |||
| 8287d717f8 | |||
| db9e60b4b5 | |||
| 28a79bfccb | |||
| 321490e528 | |||
| 6f752357d7 | |||
| e1f71baed6 | |||
| df377cd5bb | |||
| 691a0acdab | |||
| 5e2eda6af3 | |||
| 17cdc2b585 | |||
| c08266f81b | |||
| f90a4db569 | |||
| 22ec7a6d75 | |||
| 1b16a84810 | |||
| d778276f5d | |||
| e3030a168f | |||
| dfd07a4f4f | |||
| f9fc65d7de | |||
| 46cf7db242 | |||
| 2b94cffe7e | |||
| 2e74ad6fbe | |||
| df7dc1583d | |||
| 88e80b4fae | |||
| aea90f4b65 | |||
| 80db076f38 | |||
| 27bba8250a | |||
| 3fb0fa6892 | |||
| c3195cfcbe | |||
| 51661a872c | |||
| 64706ea103 | |||
| ec69d557dc | |||
| addd37fb1f | |||
| 9dc947ecb6 | |||
| 7d74d3da3a | |||
| aa0c56876c | |||
| 37c7b0c6d1 | |||
| 0d07d238bc | |||
| fa4e74ffef | |||
| c22d76e5be | |||
| 18850ebd83 | |||
| 17abef95eb | |||
| d135151477 | |||
| 07fd9b3074 | |||
| 0523ae705a | |||
| 9db2502cd0 | |||
| a174119877 | |||
| 569dd19932 | |||
| 530e2a1feb | |||
| de732ba692 | |||
| c6649e84a6 | |||
| e3517aceab | |||
| 6d7abd1718 | |||
| e9e493707b | |||
| c25adf8b57 | |||
| d2be10cd4e | |||
| 006ecf9a56 | |||
| a53cc52241 | |||
| 961d283325 | |||
| 4e46529eb6 | |||
| 81001e04e9 | |||
| 2fd174ab9c | |||
| 6ff5e221ea | |||
| 232077b919 | |||
| fecddb5203 | |||
| d0132c0f7b | |||
| 37d32b32f8 | |||
| 51213b499f | |||
| dcb98ce0fb | |||
| 428e90a844 | |||
| 017535cf7b | |||
| 409389a994 | |||
| ba34d92cd3 | |||
| b412ee258d | |||
| f1ffe2a641 | |||
| a13ca95894 | |||
| 0989a80a57 | |||
| d72c15e9d3 | |||
| 7084cf9526 | |||
| 67cc0ef75c | |||
| 75714cc358 | |||
| 75e454f3fd | |||
| efa4c2ce77 | |||
| f4ceb342b7 | |||
| d4ca58574a | |||
| e796011deb | |||
| 97afb4e01a | |||
| 8fcbf43410 | |||
| 15a834b883 | |||
| 3d8396e586 | |||
| 3257fd364a | |||
| d690af99fc | |||
| 1c28495162 | |||
| ddf74e5f78 | |||
| 7dfc27f3c9 | |||
| fc3f59a053 | |||
| 62c4b1f30b | |||
| 0609288250 | |||
| 8e26582bc5 | |||
| 07f1f9c1d8 | |||
| a4a3b4e9d1 | |||
| 576822b1ff | |||
| ab26e3d4fa | |||
| 4926735ae1 | |||
| efce0f2309 | |||
| 2804cc2d1e | |||
| 38b5cab006 | |||
| 96c10be293 | |||
| 20358a2f58 | |||
| ec82d5674f | |||
| 4a22e76bdb | |||
| 527be95618 | |||
| 41985c0a5f | |||
| 522e45ce92 | |||
| 48fb0f3b1e | |||
| 798093c58f | |||
| e795dad616 | |||
| c3587ff46f | |||
| dc9fa9ccf2 | |||
| 97c259d928 | |||
| afffdd5bbf | |||
| 199e7a1d46 | |||
| a1aa315187 | |||
| 8c56fddc55 | |||
| 277d76df3e | |||
| 1ac33d30bd | |||
| 658cb438f8 | |||
| 2b71625ffe | |||
| 2b13fc9a24 | |||
| 9e18964e7f | |||
| 43dfe559a6 | |||
| aab7ba264c | |||
| b7162b5fad | |||
| ce4a081155 | |||
| 5df2a048e1 | |||
| 1b6a7fafa8 | |||
| 2ab725e5e1 | |||
| 88a310a86e | |||
| 86319be256 | |||
| 9d68ef6421 | |||
| 2bb1c5d39b | |||
| 3aa15c979d | |||
| c062ba3426 | |||
| 343560225c | |||
| e0dd77f0c3 | |||
| 92ff07f723 | |||
| a23dca080a | |||
| 6844f88567 | |||
| e6060ea277 | |||
| 549de7fa54 | |||
| ecf9faa21d | |||
| a87ebd41e7 | |||
| 183dd40f39 | |||
| c722c5c46f | |||
| 865200db5e | |||
| c3e15de759 | |||
| 44bfdbdc83 | |||
| 5f10c1875c | |||
| a7ae7a8cda | |||
| 706f142a98 | |||
| 08df3b2dff | |||
| 14672ff145 | |||
| 7fcd84d08e | |||
| 12f8686326 | |||
| aa445adfff | |||
| 603aa5db5f | |||
| c34289036f | |||
| 5b6bec775b | |||
| 3b0fe3043f | |||
| c99165891f | |||
| 4938b18f9d | |||
| 8895b4e8a3 | |||
| a7321c9beb | |||
| c23b533704 | |||
| de34c75788 | |||
| 06341efe0d | |||
| c810005f86 | |||
| cdedf283ac | |||
| acfd92e2e6 | |||
| 51b81dba87 | |||
| 7f6dfcf52f | |||
| 92582d8434 | |||
| e2bff474db | |||
| 4f702e12b7 | |||
| 083400d1c2 | |||
| 7491337bfd | |||
| d6b833fbb2 | |||
| 2113a2b634 | |||
| 5df632264f | |||
| 42c350243a | |||
| 522ca3b04a | |||
| 2d53ec5d34 | |||
| 13d2f70c3a | |||
| a87d19998e | |||
| 6ddf241293 | |||
| e43ec6c4ea | |||
| 5f3db95cbd | |||
| d874829b06 | |||
| 6cfbccd955 | |||
| 0d821c3630 | |||
| b61e3b580d | |||
| 5c301353ec | |||
| 0363421862 | |||
| 6f18b9b691 | |||
| 35e40be550 | |||
| c1528f532e | |||
| 245960d35b | |||
| 8847034217 | |||
| 91acfbbd38 | |||
| 4505a2bf2d | |||
| a314380b08 | |||
| 0c07a015c6 | |||
| a0c7697280 | |||
| 04023da723 | |||
| 13ea045055 | |||
| f03351d112 | |||
| 48d9f10f5b | |||
| 2b53df98cd | |||
| 99a7a13218 | |||
| 2d2d4ac002 | |||
| d12e8023e3 | |||
| 17181cee8f | |||
| a74ee911b3 | |||
| b0b37172ce | |||
| cccf048e3f | |||
| 82e890746b | |||
| 188d65d700 | |||
| 4569f93e70 | |||
| bcd1d8461f | |||
| 183a9139f9 | |||
| 80a1e6ecf3 | |||
| aa1f8cfb8f | |||
| 8060691f3d | |||
| bf26de495a | |||
| 73b3f7e298 | |||
| 22191649aa | |||
| 0557907310 | |||
| 0f283c484d | |||
| e33ca9d316 | |||
| f93f4c72f7 | |||
| f0b9bc10c2 | |||
| f583879aee | |||
| 7ea6c6c84b | |||
| 2532a0ff59 | |||
| c3f354826d | |||
| 6d1e421ad7 | |||
| 29b0055e39 | |||
| 2cb20fe342 | |||
| fc97fa4415 | |||
| 876a50f759 | |||
| eb0d2868f5 | |||
| e215d5bc64 | |||
| 3f0d687656 | |||
| d59eb8e731 | |||
| 04e9eed88d | |||
| 5072e95f16 | |||
| a2b8366477 | |||
| e9a6bee046 | |||
| 080a8d7ee5 | |||
| f94fd3118b | |||
| 8ddb13d6e2 | |||
| c6cf8be8d4 | |||
| e92270a9ab | |||
| 65d6636a41 | |||
| 4701badb2a | |||
| 3565215c81 | |||
| 3957fea5e4 | |||
| 10f1ae152d | |||
| eb29b6bffe | |||
| d157eb0b6e | |||
| 0045eb4598 | |||
| b61c66c385 | |||
| 56d6c4eb30 | |||
| a6030d708d | |||
| 683c3c4f36 | |||
| bd084f9181 | |||
| fef133bf0a | |||
| 15c226e6cf | |||
| 84f111d641 | |||
| 18c1e7ac60 | |||
| ee6dbdced6 | |||
| cb443d797d | |||
| 5a6497ec70 | |||
| 893ca8bcbd | |||
| f91e4c8b69 | |||
| f7c777d07d | |||
| 12a8e8616c | |||
| 2fbf7e8504 | |||
| 6864e6d5bf | |||
| 09b4e0e21b | |||
| f381005184 | |||
| 42a2de4bf0 | |||
| 1fd1e34844 | |||
| 64dbbd7d09 | |||
| c137e577dc | |||
| f592a9202f | |||
| cdc24d2e57 | |||
| b8bf3f6520 | |||
| 82cec83d87 | |||
| 1e14667006 | |||
| 6539d14852 | |||
| 400df0f980 | |||
| 4cafb3f966 | |||
| d8892c4eb4 | |||
| 1ebd25e76e | |||
| ca89aa8377 | |||
| ad6272bfe5 | |||
| b401c37c39 | |||
| 552dd318cd | |||
| a97880132a | |||
| 89058c63c8 | |||
| 747e417809 | |||
| fd26e1618c | |||
| 86ea760011 | |||
| 824237deb3 | |||
| ca8c70cc95 | |||
| 46fcc695a5 | |||
| 0e866a0266 | |||
| 63c36f5907 | |||
| 5299500d78 | |||
| 3b3d1aa9cc | |||
| 62d2346471 | |||
| 1e15764bb9 | |||
| a6bfd35f1a | |||
| 3296efe46b | |||
| 51ddfbc340 | |||
| 42142d819a | |||
| bbf9d523a6 | |||
| 721877e10a | |||
| a9e95a128f | |||
| 2b920eaa87 | |||
| a3ec759e62 | |||
| 3661442acd | |||
| f232d329c5 | |||
| ac5cf3bd80 | |||
| ac13ac7a2c | |||
| 0bccb35cb0 | |||
| 18d9484ab1 | |||
| fe7c06bc84 | |||
| b6fb3bbf1d | |||
| 927d7a3aeb | |||
| 979973745b | |||
| afab863f11 | |||
| 168162c174 | |||
| 2b122087c4 | |||
| 043d97cfdf | |||
| 794818953d | |||
| 783570fe9f | |||
| b1e2a4243e | |||
| b347308137 | |||
| b3c8a79946 | |||
| 9822c56f1a | |||
| cdd7ff5c6d | |||
| 5aba2f25cc | |||
| 96398daa78 | |||
| 61ceb66415 | |||
| b4f173cdb3 | |||
| 03e4592082 | |||
| cf2dbe50a1 | |||
| e5bb5b75fe | |||
| cffce47eb1 | |||
| ca0adba6cf | |||
| 8502b90c25 | |||
| cef43e7f06 | |||
| 18aaf3cc93 | |||
| f13740cb7f | |||
| bddac79b40 | |||
| e52baf555f | |||
| 475dec3014 | |||
| f2ed649694 | |||
| e82506e0c4 | |||
| 3071daa6f3 | |||
| 5d71286000 | |||
| 339d7be9c1 | |||
| 7f85494b1d | |||
| a405794a03 | |||
| 4e8e096fdb | |||
| eb821c1f36 | |||
| bf07b832f0 | |||
| 5934614edb | |||
| 96b5c1d3d3 | |||
| cb2972b145 | |||
| cd5a1980c9 | |||
| 0e35107e17 | |||
| 10b026dfe0 | |||
| 743c3c54a7 | |||
| 489c86dad8 | |||
| a9824fde91 | |||
| 6c62bbe6fb | |||
| 8a3aa660cb | |||
| 14cc7789d9 | |||
| 728d9a0993 | |||
| aa8d543ed8 | |||
| b335981621 | |||
| 9d5ca1252a | |||
| d5dbbd566f | |||
| 5362d54ab6 | |||
| 1f162aa2a0 | |||
| 4a19f193ce | |||
| cfc40ee966 | |||
| 6baba5a7b2 | |||
| ba082081b3 | |||
| e314c68a56 | |||
| 889fcb3939 | |||
| 632abd2225 | |||
| e3465da979 | |||
| f4523b2dba | |||
| 0d58b32914 | |||
| aea2d34080 | |||
| d5dbde0a24 | |||
| f888008dc1 | |||
| 87da02ac15 | |||
| ed61fc67ef | |||
| 5ac6af7b81 | |||
| 9db8cc6707 | |||
| 021a5881c2 | |||
| d6ba3ae332 | |||
| 3e49b45418 | |||
| 23e22650f9 | |||
| 85267a921e | |||
| 2c7089d47f | |||
| edc6cfe210 | |||
| d6145f383d | |||
| 03b6e2df17 | |||
| 5309138980 | |||
| a5e927ea4f | |||
| ec83f4ae72 | |||
| 71efd95136 | |||
| 0c21eba1f8 | |||
| 2ae4e15f87 | |||
| d69905feae | |||
| f795d56b2a | |||
| 4608ffcab4 | |||
| 9824df5f2a | |||
| 27a5ba4681 | |||
| 73936dca73 | |||
| 213274e96c | |||
| 7518361266 | |||
| f7aaece2f7 | |||
| fbce06cb26 | |||
| ccc0bf57a1 | |||
| ee29deee47 | |||
| 17e54104a9 | |||
| 479e369d29 | |||
| 3042fb7299 | |||
| 36fa455aad | |||
| 1c64e90537 | |||
| 09643aef82 | |||
| 03d9fb4115 | |||
| 81bea04db0 | |||
| 9211e338e7 | |||
| 23464ac55f | |||
| af78e4ea29 | |||
| e3d9216b10 | |||
| 9532a2e3da | |||
| 9237a08b53 | |||
| e02a8a7fdb | |||
| e70f50d837 | |||
| 2dfa58aae2 | |||
| dbc0cae68c | |||
| 7631722e99 | |||
| c04f68f25c | |||
| e4902efefc | |||
| 1267bcd255 | |||
| 0659ccc3f0 | |||
| bd2ae03ab4 | |||
| 244696ae24 | |||
| 1438046dd4 | |||
| 5c62ba0835 | |||
| 20fadfef7f | |||
| eed9541f9f | |||
| 1594afa389 | |||
| 9d74d93ed7 | |||
| e4e2f47f8e | |||
| be53bec9b7 | |||
| bb32c546d4 | |||
| ecb4ceec7b | |||
| c080bd4c4d | |||
| 39780f49bf | |||
| 73349c3c89 | |||
| 42a70ff7d0 | |||
| fa8262cbe9 | |||
| 7552328cdd | |||
| 60f4587d95 | |||
| 572c074c42 | |||
| 3cfbd6a93b | |||
| d0911b6a45 | |||
| 06b85442f8 | |||
| 762592daff | |||
| 338122793c | |||
| ef521624a0 | |||
| 341ab781b2 | |||
| 2fed657940 | |||
| 7bf78b3317 | |||
| 2d1fb0562d | |||
| 3d77bff0c9 | |||
| 4198203a7f | |||
| 21487641c1 | |||
| c987872be8 | |||
| 07e367e1a0 | |||
| db2e45c56e | |||
| 67bbdbfc70 | |||
| 83df3cba66 | |||
| f4e2b4bcbd | |||
| 6c64c22f83 | |||
| 702aa944dd | |||
| df45edd816 | |||
| 3f3143514e | |||
| 3e89910749 | |||
| 721a642a2f | |||
| d16ccc9dc5 | |||
| 77e7796b3f | |||
| 983c949e8c | |||
| e3f4f60e2d | |||
| 33aa904cb7 | |||
| 0248be5543 | |||
| f7ca8212aa | |||
| 5eb59a1a43 | |||
| 7dd1e9bfbe | |||
| 067fd25a34 | |||
| 7cb26ba104 | |||
| a4212cc865 | |||
| 0445f7d6e8 | |||
| efe99b3f62 | |||
| 7f2c98f17a | |||
| 8f1d215851 | |||
| 013b58f6f6 | |||
| 9d3b3476c2 | |||
| 715874a98f | |||
| d2109dd2cb | |||
| ddaf11ed6a | |||
| 2b5f68003d | |||
| 1a759cc4e7 | |||
| 9e83562bf4 | |||
| c03c19d26f | |||
| ad9ebdf8e6 | |||
| 9c1701c62a | |||
| edf6c42e9d | |||
| f0f2a71a87 | |||
| cf270bd9ce | |||
| 49223a4688 | |||
| 074bb1e66e | |||
| 7e2e510d8a | |||
| 1ed34c6fa0 | |||
| 78a0fa55b5 | |||
| d37c040b36 | |||
| e56bbf557d | |||
| 5abecec478 | |||
| ccb41f778e | |||
| 059a4cf0d8 | |||
| 7a535a4554 | |||
| f89167ef94 | |||
| a77777f509 | |||
| 4a327ba584 | |||
| a41e9bf67e | |||
| 6716973ce0 | |||
| 7cc81393d6 | |||
| 3e413a036f | |||
| 63a8fe7ee8 | |||
| 146409844d | |||
| ba0da9f59e | |||
| 81aef519d4 | |||
| bcd84518d1 | |||
| f205952ff2 | |||
| 1d7622e0b5 | |||
| 4d9112283d | |||
| dc49c788a8 | |||
| 36741ab780 | |||
| 53dffc5e88 | |||
| 607c7e7777 | |||
| 6f09e1699f | |||
| 8c35de48f3 | |||
| b83d943841 | |||
| b11b5caeb3 | |||
| 36924da59a | |||
| f0a2c47613 | |||
| 5a4449f1a2 | |||
| de3d7a7774 | |||
| b06dbd1c00 | |||
| 1fa5e424e9 | |||
| d81c7abf1a | |||
| 932215c91d | |||
| 7aa1141ba5 | |||
| 3699439506 | |||
| 76b1288f77 | |||
| 8fd9ae4e59 | |||
| 53abd2fe38 | |||
| da8a4ba8ab | |||
| 9c3990c0c1 | |||
| 1eeb46d5fc | |||
| 02c01e258c | |||
| b2f912868d | |||
| ecf0eba0a5 | |||
| 8e5fec2fa8 | |||
| 89c35e8512 | |||
| 3fa88fad79 | |||
| 5f037462ed | |||
| 93c01e5f1e | |||
| 52953626a7 | |||
| f77fdc799d | |||
| 7bf1f9bd71 | |||
| 363ffc1c04 | |||
| 4001899bdf | |||
| fabdd89c4a | |||
| 70f1675085 | |||
| 07e1e2d9d6 | |||
| ebff6c6370 | |||
| 233eb6d916 | |||
| d568cab2fc | |||
| 8447b95c50 | |||
| e959d1e1b0 | |||
| ead5dbe368 | |||
| f091f2b344 | |||
| 267a51e800 | |||
| 939f6095ba | |||
| a333615e53 | |||
| e1b33fbc40 | |||
| 99c5d994b5 | |||
| 0971485367 | |||
| 3cfa963f69 | |||
| 7096a4231f | |||
| 07f0c182e6 | |||
| 535b223333 | |||
| ffa8c2be79 | |||
| 2873e64ca2 | |||
| 8bd28bce69 | |||
| b97ce43fca | |||
| d34c4cc2f2 | |||
| 1ca1f0fa7d | |||
| 8c3c8f888d | |||
| a75d7f0381 | |||
| 7684466acf | |||
| 0067245739 | |||
| 4a5d8aa217 | |||
| 2d786aa02c | |||
| b0933b96ef | |||
| 20fb73b626 | |||
| ae7bd7112b | |||
| 2365363dcc | |||
| e0e4a7bec6 | |||
| ebd0c3696a | |||
| e0a0d9c039 | |||
| dae9f2ab2b | |||
| 7168a00ee4 | |||
| 1e2d0ced20 | |||
| d6ac883efa | |||
| a386d70ae4 | |||
| bc8bf672b4 | |||
| e38998214f | |||
| 472a2fe802 | |||
| 2d6d89b1cf | |||
| 66be2ac6ca | |||
| 3137c9f3f7 | |||
| b9ebb02e72 | |||
| 1e02c475d6 | |||
| 4d2cda0692 | |||
| cbd2b8f428 | |||
| 93605db690 | |||
| 2567096de0 | |||
| 6ed25d012f | |||
| c2afef2bde | |||
| 0991e7d8a4 | |||
| cf52f2a743 | |||
| 37dddda1a0 | |||
| 3f2f3ebd51 | |||
| 7ba78540ac | |||
| 19afb49fce | |||
| 46ab553fa5 | |||
| 68cc42047e | |||
| e25cf27ba5 | |||
| 3895e6d958 | |||
| 24cf3984c8 | |||
| 6237675744 | |||
| 30dae049ff | |||
| 1dc30caee9 | |||
| b2d340cbfb | |||
| 7d52787e54 | |||
| ae3f16ccbd | |||
| 057222757b | |||
| 119f109904 | |||
| 23a77b1ba4 | |||
| c076daa91f | |||
| b7ef5325ac | |||
| 8b535c58fa | |||
| 6bc8daaeda | |||
| 7a2562e5bb | |||
| 9e0c731b32 | |||
| 2e0e4006a1 | |||
| 187139473d | |||
| dbb0a5ad28 | |||
| 24aaed44b9 | |||
| 32b8d83c04 | |||
| bf55c325ce | |||
| 3af288c74e | |||
| e306d9ba35 | |||
| b23a877d7e | |||
| 08fda055fc | |||
| 84055ed74e | |||
| 2db30690ce | |||
| 304bcfd343 | |||
| 8a1cf2bb3a | |||
| c857c24a64 | |||
| bbdcb047d0 | |||
| 78f2e70956 | |||
| 75a75626ce | |||
| cec9688d58 | |||
| 81492b7d3a | |||
| 9166acbbb9 | |||
| 36de2b6ca6 | |||
| 21f909dd4b | |||
| f2a92c9122 | |||
| 7ee2e3d8bc | |||
| f89aeb6ad4 | |||
| 0397006894 | |||
| d6863074b2 | |||
| 9c185a30e0 | |||
| a8f492a027 | |||
| 0a92b1dc68 | |||
| e6d661f8ee | |||
| f48dfb5d81 | |||
| cd041e8366 | |||
| 6787ea883e | |||
| 78937d716f | |||
| 9713abc002 | |||
| b44b45cca0 | |||
| 9e2cf0ed73 | |||
| b01d7ea5b9 | |||
| ae89b65a98 | |||
| 9b9c3d788d | |||
| ccc6c6daa5 | |||
| 9ce6636c6a | |||
| 6287d306c2 | |||
| 6cfa053328 | |||
| 9514b6eecd | |||
| c8d4818d22 | |||
| 4142ada729 | |||
| d7ffdbd78d | |||
| e8d87d37bb | |||
| 343ffc23eb | |||
| 95e0086eed | |||
| c010ecfe38 | |||
| 302e9371c8 | |||
| 7060c0e6d7 | |||
| 20a4c7f9f4 | |||
| e59e4afd3e | |||
| f74dd3ca1e | |||
| 511cfc524f | |||
| 4cf6173d25 | |||
| 17996757fd | |||
| 6bc1049858 | |||
| ff44f626ba | |||
| 552343fa37 | |||
| 4dc7fd8cd1 | |||
| 285c96fd2e | |||
| e6af33367e | |||
| 7092fe2242 | |||
| a32ff46579 | |||
| 7f20cf59d1 | |||
| a8a1b08127 | |||
| 1a1e777b87 | |||
| 9e76e64064 | |||
| 975ae17ef9 | |||
| ed9dcef66f | |||
| b1e537e54e | |||
| e5886862c3 | |||
| d85b668d4f | |||
| 4e0ffc1e28 | |||
| b363d8bfb5 |
@@ -0,0 +1,105 @@
|
||||
---
|
||||
description: For tasks requiring sending Telegram server API requests or working with generated API types.
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Telegram Desktop API Usage
|
||||
|
||||
## API Schema
|
||||
|
||||
The API definitions are described using [TL Language]\(https:/core.telegram.org/mtproto/TL) in two main schema files:
|
||||
|
||||
1. **`Telegram/SourceFiles/mtproto/scheme/mtproto.tl`**
|
||||
* Defines the core MTProto protocol types and methods used for basic communication, encryption, authorization, service messages, etc.
|
||||
* Some fundamental types and methods from this schema (like basic types, RPC calls, containers) are often implemented directly in the C++ MTProto core (`SourceFiles/mtproto/`) and may be skipped during the C++ code generation phase.
|
||||
* Other parts of `mtproto.tl` might still be processed by the code generator.
|
||||
|
||||
2. **`Telegram/SourceFiles/mtproto/scheme/api.tl`**
|
||||
* Defines the higher-level Telegram API layer, including all the methods and types related to chat functionality, user profiles, messages, channels, stickers, etc.
|
||||
* This is the primary schema used when making functional API requests within the application.
|
||||
|
||||
Both files use the same TL syntax to describe API methods (functions) and types (constructors).
|
||||
|
||||
## Code Generation
|
||||
|
||||
A custom code generation tool processes `api.tl` (and parts of `mtproto.tl`) to create corresponding C++ classes and types. These generated headers are typically included via the Precompiled Header (PCH) for the main `Telegram` project.
|
||||
|
||||
Generated types often follow the pattern `MTP[Type]` (e.g., `MTPUser`, `MTPMessage`) and methods correspond to functions within the `MTP` namespace or related classes (e.g., `MTPmessages_SendMessage`).
|
||||
|
||||
## Making API Requests
|
||||
|
||||
API requests are made using a standard pattern involving the `api()` object (providing access to the `MTP::Instance`), the generated `MTP...` request object, callback handlers for success (`.done()`) and failure (`.fail()`), and the `.send()` method.
|
||||
|
||||
Here's the general structure:
|
||||
|
||||
```cpp
|
||||
// Include necessary headers if not already in PCH
|
||||
|
||||
// Obtain the API instance (usually via api() or MTP::Instance::Get())
|
||||
api().request(MTPnamespace_MethodName(
|
||||
// Constructor arguments based on the api.tl definition for the method
|
||||
MTP_flags(flags_value), // Use MTP_flags if the method has flags
|
||||
MTP_inputPeer(peer), // Use MTP_... types for parameters
|
||||
MTP_string(messageText),
|
||||
MTP_long(randomId),
|
||||
// ... other arguments matching the TL definition
|
||||
MTP_vector<MTPMessageEntity>() // Example for a vector argument
|
||||
)).done([=]\(const MTPResponseType &result) {
|
||||
// Handle the successful response (result).
|
||||
// 'result' will be of the C++ type corresponding to the TL type
|
||||
// specified after the '=' in the api.tl method definition.
|
||||
// How to access data depends on whether the TL type has one or multiple constructors:
|
||||
|
||||
// 1. Multiple Constructors (e.g., User = User | UserEmpty):
|
||||
// Use .match() with lambdas for each constructor:
|
||||
result.match([&]\(const MTPDuser &data) {
|
||||
/* use data.vfirst_name().v, etc. */
|
||||
}, [&]\(const MTPDuserEmpty &data) {
|
||||
/* handle empty user */
|
||||
});
|
||||
|
||||
// Alternatively, check the type explicitly and use the constructor getter:
|
||||
if (result.type() == mtpc_user) {
|
||||
const auto &data = result.c_user(); // Asserts if type is not mtpc_user!
|
||||
// use data.vfirst_name().v
|
||||
} else if (result.type() == mtpc_userEmpty) {
|
||||
const auto &data = result.c_userEmpty();
|
||||
// handle empty user
|
||||
}
|
||||
|
||||
// 2. Single Constructor (e.g., Messages = messages { msgs: vector<Message> }):
|
||||
// Use .match() with a single lambda:
|
||||
result.match([&]\(const MTPDmessages &data) { /* use data.vmessages().v */ });
|
||||
|
||||
// Or check the type explicitly and use the constructor getter:
|
||||
if (result.type() == mtpc_messages) {
|
||||
const auto &data = result.c_messages(); // Asserts if type is not mtpc_messages!
|
||||
// use data.vmessages().v
|
||||
}
|
||||
|
||||
// Or use the shortcut .data() for single-constructor types:
|
||||
const auto &data = result.data(); // Only works for single-constructor types!
|
||||
// use data.vmessages().v
|
||||
|
||||
}).fail([=]\(const MTP::Error &error) {
|
||||
// Handle the API error (error).
|
||||
// 'error' is an MTP::Error object containing the error code (error.type())
|
||||
// and description (error.description()). Check for specific error strings.
|
||||
if (error.type() == u"FLOOD_WAIT_X"_q) {
|
||||
// Handle flood wait
|
||||
} else {
|
||||
Ui::show(Box<InformBox>(Lang::Hard::ServerError())); // Example generic error handling
|
||||
}
|
||||
}).handleFloodErrors().send(); // handleFloodErrors() is common, then send()
|
||||
```
|
||||
|
||||
**Key Points:**
|
||||
|
||||
* Always refer to `Telegram/SourceFiles/mtproto/scheme/api.tl` for the correct method names, parameters (names and types), and response types.
|
||||
* Use the generated `MTP...` types/classes for request parameters (e.g., `MTP_int`, `MTP_string`, `MTP_bool`, `MTP_vector`, `MTPInputUser`, etc.) and response handling.
|
||||
* The `.done()` lambda receives the specific C++ `MTP...` type corresponding to the TL return type.
|
||||
* For types with **multiple constructors** (e.g., `User = User | UserEmpty`), use `result.match([&]\(const MTPDuser &d){ ... }, [&]\(const MTPDuserEmpty &d){ ... })` to handle each case, or check `result.type() == mtpc_user` / `mtpc_userEmpty` and call the specific `result.c_user()` / `result.c_userEmpty()` getter (which asserts on type mismatch).
|
||||
* For types with a **single constructor** (e.g., `Messages = messages{...}`), you can use `result.match([&]\(const MTPDmessages &d){ ... })` with one lambda, or check `type()` and call `c_messages()`, or use the shortcut `result.data()` to access the fields directly.
|
||||
* The `.fail()` lambda receives an `MTP::Error` object. Check `error.type()` against known error strings (often defined as constants or using `u"..."_q` literals).
|
||||
* Directly construct the `MTPnamespace_MethodName(...)` object inside `request()`.
|
||||
* Include `.handleFloodErrors()` before `.send()` for standard flood wait handling.
|
||||
@@ -0,0 +1,164 @@
|
||||
---
|
||||
description: For tasks requiring changing or adding user facing phrases and text parts.
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Telegram Desktop Localization
|
||||
|
||||
## Coding Style Note
|
||||
|
||||
**Use `auto`:** In the actual codebase, variable types are almost always deduced using `auto` (or `const auto`, `const auto &`) rather than being written out explicitly. Examples in this guide may use explicit types for clarity, but prefer `auto` in practice.
|
||||
|
||||
```cpp
|
||||
// Prefer this:
|
||||
auto currentTitle = tr::lng_settings_title(tr::now);
|
||||
auto nameProducer = GetNameProducer(); // Returns rpl::producer<...>
|
||||
|
||||
// Instead of this:
|
||||
QString currentTitle = tr::lng_settings_title(tr::now);
|
||||
rpl::producer<QString> nameProducer = GetNameProducer();
|
||||
```
|
||||
|
||||
## String Resource File
|
||||
|
||||
Base user-facing English strings are defined in the `lang.strings` file:
|
||||
|
||||
`Telegram/Resources/langs/lang.strings`
|
||||
|
||||
This file uses a key-value format with named placeholders:
|
||||
|
||||
```
|
||||
"lng_settings_title" = "Settings";
|
||||
"lng_confirm_delete_item" = "Are you sure you want to delete {item_name}?";
|
||||
"lng_files_selected" = "{count} files selected"; // Simple count example (see Pluralization)
|
||||
```
|
||||
|
||||
Placeholders are enclosed in curly braces, e.g., `{name}`, `{user}`. A special placeholder `{count}` is used for pluralization rules.
|
||||
|
||||
### Pluralization
|
||||
|
||||
For keys that depend on a number (using the `{count}` placeholder), English typically requires two forms: singular and plural. These are defined in `lang.strings` using `#one` and `#other` suffixes:
|
||||
|
||||
```
|
||||
"lng_files_selected#one" = "{count} file selected";
|
||||
"lng_files_selected#other" = "{count} files selected";
|
||||
```
|
||||
|
||||
While only `#one` and `#other` are defined in the base `lang.strings`, the code generation process creates C++ accessors for all six CLDR plural categories (`#zero`, `#one`, `#two`, `#few`, `#many`, `#other`) to support languages with more complex pluralization rules.
|
||||
|
||||
## Translation Process
|
||||
|
||||
While `lang.strings` provides the base English text and the keys, the actual translations are managed via Telegram's translations platform (translations.telegram.org) and loaded dynamically at runtime from the API. The keys from `lang.strings` (including the `#one`/`#other` variants) are used on the platform.
|
||||
|
||||
## Code Generation
|
||||
|
||||
A code generation tool processes `lang.strings` to create C++ structures and accessors within the `tr` namespace. These allow type-safe access to strings and handling of placeholders and pluralization. Generated keys typically follow the pattern `tr::lng_key_name`.
|
||||
|
||||
## String Usage in Code
|
||||
|
||||
Strings are accessed in C++ code using the generated objects within the `tr::` namespace. There are two main ways to use them: reactively (returning an `rpl::producer`) or immediately (returning the current value).
|
||||
|
||||
### 1. Reactive Usage (rpl::producer)
|
||||
|
||||
Calling a generated string function directly returns a reactive producer, typically `rpl::producer<QString>`. This producer automatically updates its value whenever the application language changes.
|
||||
|
||||
```cpp
|
||||
// Key: "settings_title" = "Settings";
|
||||
auto titleProducer = tr::lng_settings_title(); // Type: rpl::producer<QString>
|
||||
|
||||
// Key: "confirm_delete_item" = "Are you sure you want to delete {item_name}?";
|
||||
auto itemNameProducer = /* ... */; // Type: rpl::producer<QString>
|
||||
auto confirmationProducer = tr::lng_confirm_delete_item( // Type: rpl::producer<QString>
|
||||
tr::now, // NOTE: tr::now is NOT passed here for reactive result
|
||||
lt_item_name,
|
||||
std::move(itemNameProducer)); // Placeholder producers should be moved
|
||||
```
|
||||
|
||||
### 2. Immediate Usage (Current Value)
|
||||
|
||||
Passing `tr::now` as the first argument retrieves the string's current value in the active language (typically as a `QString`).
|
||||
|
||||
```cpp
|
||||
// Key: "settings_title" = "Settings";
|
||||
auto currentTitle = tr::lng_settings_title(tr::now); // Type: QString
|
||||
|
||||
// Key: "confirm_delete_item" = "Are you sure you want to delete {item_name}?";
|
||||
const auto currentItemName = QString("My Document"); // Type: QString
|
||||
auto currentConfirmation = tr::lng_confirm_delete_item( // Type: QString
|
||||
tr::now, // Pass tr::now for immediate value
|
||||
lt_item_name, currentItemName); // Placeholder value is a direct QString (or convertible)
|
||||
```
|
||||
|
||||
### 3. Placeholders (`{tag}`)
|
||||
|
||||
Placeholders like `{item_name}` are replaced by providing arguments after `tr::now` (for immediate) or as the initial arguments (for reactive). A corresponding `lt_tag_name` constant is passed before the value.
|
||||
|
||||
* **Immediate:** Pass the direct value (e.g., `QString`, `int`).
|
||||
* **Reactive:** Pass an `rpl::producer` of the corresponding type (e.g., `rpl::producer<QString>`). Remember to `std::move` the producer or use `rpl::duplicate` if you need to reuse the original producer afterwards.
|
||||
|
||||
### 4. Pluralization (`{count}`)
|
||||
|
||||
Keys using `{count}` require a numeric value for the `lt_count` placeholder. The correct plural form (`#zero`, `#one`, ..., `#other`) is automatically selected based on this value and the current language rules.
|
||||
|
||||
* **Immediate (`tr::now`):** Pass a `float64` or `int` (which is auto-converted to `float64`).
|
||||
```cpp
|
||||
int count = 1;
|
||||
auto filesText = tr::lng_files_selected(tr::now, lt_count, count); // Type: QString
|
||||
count = 5;
|
||||
filesText = tr::lng_files_selected(tr::now, lt_count, count); // Uses "files_selected#other"
|
||||
```
|
||||
|
||||
* **Reactive:** Pass an `rpl::producer<float64>`. Use the `tr::to_count()` helper to convert an `rpl::producer<int>` or wrap a single value.
|
||||
```cpp
|
||||
// From an existing int producer:
|
||||
auto countProducer = /* ... */; // Type: rpl::producer<int>
|
||||
auto filesTextProducer = tr::lng_files_selected( // Type: rpl::producer<QString>
|
||||
lt_count,
|
||||
countProducer | tr::to_count()); // Use tr::to_count() for conversion
|
||||
|
||||
// From a single int value wrapped reactively:
|
||||
int currentCount = 5;
|
||||
auto filesTextProducerSingle = tr::lng_files_selected( // Type: rpl::producer<QString>
|
||||
lt_count,
|
||||
rpl::single(currentCount) | tr::to_count());
|
||||
// Alternative for single values (less common): rpl::single(currentCount * 1.)
|
||||
```
|
||||
|
||||
### 5. Custom Projectors
|
||||
|
||||
An optional final argument can be a projector function (like `Ui::Text::Upper` or `Ui::Text::WithEntities`) to transform the output.
|
||||
|
||||
* If the projector returns `OutputType`, the string function returns `OutputType` (immediate) or `rpl::producer<OutputType>` (reactive).
|
||||
* Placeholder values must match the projector's *input* requirements. For `Ui::Text::WithEntities`, placeholders expect `TextWithEntities` (immediate) or `rpl::producer<TextWithEntities>` (reactive).
|
||||
|
||||
```cpp
|
||||
// Immediate with Ui::Text::WithEntities projector
|
||||
// Key: "user_posted_photo" = "{user} posted a photo";
|
||||
const auto userName = TextWithEntities{ /* ... */ }; // Type: TextWithEntities
|
||||
auto message = tr::lng_user_posted_photo( // Type: TextWithEntities
|
||||
tr::now,
|
||||
lt_user,
|
||||
userName, // Must be TextWithEntities
|
||||
Ui::Text::WithEntities); // Projector
|
||||
|
||||
// Reactive with Ui::Text::WithEntities projector
|
||||
auto userNameProducer = /* ... */; // Type: rpl::producer<TextWithEntities>
|
||||
auto messageProducer = tr::lng_user_posted_photo( // Type: rpl::producer<TextWithEntities>
|
||||
lt_user,
|
||||
std::move(userNameProducer), // Move placeholder producers
|
||||
Ui::Text::WithEntities); // Projector
|
||||
```
|
||||
|
||||
## Key Summary
|
||||
|
||||
* Keys are defined in `Resources/langs/lang.strings` using `{tag}` placeholders.
|
||||
* Plural keys use `{count}` and have `#one`/`#other` variants in `lang.strings`.
|
||||
* Access keys via `tr::lng_key_name(...)` in C++.
|
||||
* Call with `tr::now` as the first argument for the immediate `QString` (or projected type).
|
||||
* Call without `tr::now` for the reactive `rpl::producer<QString>` (or projected type).
|
||||
* Provide placeholder values (`lt_tag_name, value`) matching the usage (direct value for immediate, `rpl::producer` for reactive). Producers should typically be moved via `std::move`.
|
||||
* For `{count}`:
|
||||
* Immediate: Pass `int` or `float64`.
|
||||
* Reactive: Pass `rpl::producer<float64>`, typically by converting an `int` producer using `| tr::to_count()`.
|
||||
* Optional projector function as the last argument modifies the output type and required placeholder types.
|
||||
* Actual translations are loaded at runtime from the API.
|
||||
@@ -0,0 +1,216 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: true
|
||||
---
|
||||
# RPL (Reactive Programming Library) Guide
|
||||
|
||||
## Coding Style Note
|
||||
|
||||
**Use `auto`:** In the actual codebase, variable types are almost always deduced using `auto` (or `const auto`, `const auto &`) rather than being written out explicitly. Examples in this guide may use explicit types for clarity, but prefer `auto` in practice.
|
||||
|
||||
```cpp
|
||||
// Prefer this:
|
||||
auto intProducer = rpl::single(123);
|
||||
const auto &lifetime = existingLifetime;
|
||||
|
||||
// Instead of this:
|
||||
rpl::producer<int> intProducer = rpl::single(123);
|
||||
const rpl::lifetime &lifetime = existingLifetime;
|
||||
|
||||
// Sometimes needed if deduction is ambiguous or needs help:
|
||||
auto user = std::make_shared<UserData>();
|
||||
auto data = QByteArray::fromHex("...");
|
||||
```
|
||||
|
||||
## Introduction
|
||||
|
||||
RPL is the reactive programming library used in this project, residing in the `rpl::` namespace. It allows handling asynchronous streams of data over time.
|
||||
|
||||
The core concept is the `rpl::producer`, which represents a stream of values that can be generated over a certain lifetime.
|
||||
|
||||
## Producers: `rpl::producer<Type, Error = no_error>`
|
||||
|
||||
The fundamental building block is `rpl::producer<Type, Error>`. It produces values of `Type` and can optionally signal an error of type `Error`. By default, `Error` is `rpl::no_error`, indicating that the producer does not explicitly handle error signaling through this mechanism.
|
||||
|
||||
```cpp
|
||||
// A producer that emits integers.
|
||||
auto intProducer = /* ... */; // Type: rpl::producer<int>
|
||||
|
||||
// A producer that emits strings and can potentially emit a CustomError.
|
||||
auto stringProducerWithError = /* ... */; // Type: rpl::producer<QString, CustomError>
|
||||
```
|
||||
|
||||
Producers are typically lazy; they don't start emitting values until someone subscribes to them.
|
||||
|
||||
## Lifetime Management: `rpl::lifetime`
|
||||
|
||||
Reactive pipelines have a limited duration, managed by `rpl::lifetime`. An `rpl::lifetime` object essentially holds a collection of cleanup callbacks. When the lifetime ends (either explicitly destroyed or goes out of scope), these callbacks are executed, tearing down the associated pipeline and freeing resources.
|
||||
|
||||
```cpp
|
||||
rpl::lifetime myLifetime;
|
||||
// ... later ...
|
||||
// myLifetime is destroyed, cleanup happens.
|
||||
|
||||
// Or, pass a lifetime instance to manage a pipeline's duration.
|
||||
rpl::lifetime &parentLifetime = /* ... get lifetime from context ... */;
|
||||
```
|
||||
|
||||
## Starting a Pipeline: `rpl::start_...`
|
||||
|
||||
To consume values from a producer, you start a pipeline using one of the `rpl::start_...` methods. These methods subscribe to the producer and execute callbacks for the events they handle.
|
||||
|
||||
The most common method is `rpl::start_with_next`:
|
||||
|
||||
```cpp
|
||||
auto counter = /* ... */; // Type: rpl::producer<int>
|
||||
rpl::lifetime lifetime;
|
||||
|
||||
// Counter is consumed here, use std::move if it's an l-value.
|
||||
std::move(
|
||||
counter
|
||||
) | rpl::start_with_next([=]\(int nextValue) {
|
||||
// Process the next integer value emitted by the producer.
|
||||
qDebug() << "Received: " << nextValue;
|
||||
}, lifetime); // Pass the lifetime to manage the subscription.
|
||||
// Note: `counter` is now in a moved-from state and likely invalid.
|
||||
|
||||
// If you need to start the same producer multiple times, duplicate it:
|
||||
// rpl::duplicate(counter) | rpl::start_with_next(...);
|
||||
|
||||
// If you DON'T pass a lifetime to a start_... method:
|
||||
auto counter2 = /* ... */; // Type: rpl::producer<int>
|
||||
rpl::lifetime subscriptionLifetime = std::move(
|
||||
counter2
|
||||
) | rpl::start_with_next([=]\(int nextValue) { /* ... */ });
|
||||
// The returned lifetime MUST be stored. If it's discarded immediately,
|
||||
// the subscription stops instantly.
|
||||
// `counter2` is also moved-from here.
|
||||
```
|
||||
|
||||
Other variants allow handling errors (`_error`) and completion (`_done`):
|
||||
|
||||
```cpp
|
||||
auto dataStream = /* ... */; // Type: rpl::producer<QString, Error>
|
||||
rpl::lifetime lifetime;
|
||||
|
||||
// Assuming dataStream might be used again, we duplicate it for the first start.
|
||||
// If it's the only use, std::move(dataStream) would be preferred.
|
||||
rpl::duplicate(
|
||||
dataStream
|
||||
) | rpl::start_with_error([=]\(Error &&error) {
|
||||
// Handle the error signaled by the producer.
|
||||
qDebug() << "Error: " << error.text();
|
||||
}, lifetime);
|
||||
|
||||
// Using dataStream again, perhaps duplicated again or moved if last use.
|
||||
rpl::duplicate(
|
||||
dataStream
|
||||
) | rpl::start_with_done([=] {
|
||||
// Execute when the producer signals it's finished emitting values.
|
||||
qDebug() << "Stream finished.";
|
||||
}, lifetime);
|
||||
|
||||
// Last use of dataStream, so we move it.
|
||||
std::move(
|
||||
dataStream
|
||||
) | rpl::start_with_next_error_done(
|
||||
[=]\(QString &&value) { /* handle next value */ },
|
||||
[=]\(Error &&error) { /* handle error */ },
|
||||
[=] { /* handle done */ },
|
||||
lifetime);
|
||||
```
|
||||
|
||||
## Transforming Producers
|
||||
|
||||
RPL provides functions to create new producers by transforming existing ones:
|
||||
|
||||
* `rpl::map`: Transforms each value emitted by a producer.
|
||||
```cpp
|
||||
auto ints = /* ... */; // Type: rpl::producer<int>
|
||||
// The pipe operator often handles the move implicitly for chained transformations.
|
||||
auto strings = std::move(
|
||||
ints // Explicit move is safer
|
||||
) | rpl::map([](int value) {
|
||||
return QString::number(value * 2);
|
||||
}); // Emits strings like "0", "2", "4", ...
|
||||
```
|
||||
|
||||
* `rpl::filter`: Emits only the values from a producer that satisfy a condition.
|
||||
```cpp
|
||||
auto ints = /* ... */; // Type: rpl::producer<int>
|
||||
auto evenInts = std::move(
|
||||
ints // Explicit move is safer
|
||||
) | rpl::filter([](int value) {
|
||||
return (value % 2 == 0);
|
||||
}); // Emits only even numbers.
|
||||
```
|
||||
|
||||
## Combining Producers
|
||||
|
||||
You can combine multiple producers into one:
|
||||
|
||||
* `rpl::combine`: Combines the latest values from multiple producers whenever *any* of them emits a new value. Requires all producers to have emitted at least one value initially.
|
||||
While it produces a `std::tuple`, subsequent operators like `map`, `filter`, and `start_with_next` can automatically unpack this tuple into separate lambda arguments.
|
||||
```cpp
|
||||
auto countProducer = rpl::single(1); // Type: rpl::producer<int>
|
||||
auto textProducer = rpl::single(u"hello"_q); // Type: rpl::producer<QString>
|
||||
rpl::lifetime lifetime;
|
||||
|
||||
// rpl::combine takes producers by const-ref internally and duplicates,
|
||||
// so move/duplicate is usually not strictly needed here unless you
|
||||
// want to signal intent or manage the lifetime of p1/p2 explicitly.
|
||||
auto combined = rpl::combine(
|
||||
countProducer, // or rpl::duplicate(countProducer)
|
||||
textProducer // or rpl::duplicate(textProducer)
|
||||
);
|
||||
|
||||
// Starting the combined producer consumes it.
|
||||
// The lambda receives unpacked arguments, not the tuple itself.
|
||||
std::move(
|
||||
combined
|
||||
) | rpl::start_with_next([=]\(int count, const QString &text) {
|
||||
// No need for std::get<0>(latest), etc.
|
||||
qDebug() << "Combined: Count=" << count << ", Text=" << text;
|
||||
}, lifetime);
|
||||
|
||||
// This also works with map, filter, etc.
|
||||
std::move(
|
||||
combined
|
||||
) | rpl::filter([=]\(int count, const QString &text) {
|
||||
return count > 0 && !text.isEmpty();
|
||||
}) | rpl::map([=]\(int count, const QString &text) {
|
||||
return text.repeated(count);
|
||||
}) | rpl::start_with_next([=]\(const QString &result) {
|
||||
qDebug() << "Mapped & Filtered: " << result;
|
||||
}, lifetime);
|
||||
```
|
||||
|
||||
* `rpl::merge`: Merges the output of multiple producers of the *same type* into a single producer. It emits a value whenever *any* of the source producers emits a value.
|
||||
```cpp
|
||||
auto sourceA = /* ... */; // Type: rpl::producer<QString>
|
||||
auto sourceB = /* ... */; // Type: rpl::producer<QString>
|
||||
|
||||
// rpl::merge also duplicates internally.
|
||||
auto merged = rpl::merge(sourceA, sourceB);
|
||||
|
||||
// Starting the merged producer consumes it.
|
||||
std::move(
|
||||
merged
|
||||
) | rpl::start_with_next([=]\(QString &&value) {
|
||||
// Receives values from either sourceA or sourceB as they arrive.
|
||||
qDebug() << "Merged value: " << value;
|
||||
}, lifetime);
|
||||
```
|
||||
|
||||
## Key Concepts Summary
|
||||
|
||||
* Use `rpl::producer<Type, Error>` to represent streams of values.
|
||||
* Manage subscription duration using `rpl::lifetime`.
|
||||
* Pass `rpl::lifetime` to `rpl::start_...` methods.
|
||||
* If `rpl::lifetime` is not passed, **store the returned lifetime** to keep the subscription active.
|
||||
* Use operators like `| rpl::map`, `| rpl::filter` to transform streams.
|
||||
* Use `rpl::combine` or `rpl::merge` to combine streams.
|
||||
* When starting a chain (`std::move(producer) | rpl::map(...)`), explicitly move the initial producer.
|
||||
* These functions typically duplicate their input producers internally.
|
||||
* Starting a pipeline consumes the producer; use `
|
||||
@@ -0,0 +1,154 @@
|
||||
---
|
||||
description: For tasks requiring working with user facing UI components.
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Telegram Desktop UI Styling
|
||||
|
||||
## Style Definition Files
|
||||
|
||||
UI element styles (colors, fonts, paddings, margins, icons, etc.) are defined in `.style` files using a custom syntax. These files are located alongside the C++ source files they correspond to within specific UI component directories (e.g., `Telegram/SourceFiles/ui/chat/chat.style`).
|
||||
|
||||
Definitions from other `.style` files can be included using the `using` directive at the top of the file:
|
||||
```style
|
||||
using "ui/basic.style";
|
||||
using "ui/widgets/widgets.style";
|
||||
```
|
||||
|
||||
The central definition of named colors happens in `Telegram/SourceFiles/ui/colors.palette`. This file allows for theme generation and loading colors from various sources.
|
||||
|
||||
### Syntax Overview
|
||||
|
||||
1. **Built-in Types:** The syntax recognizes several base types inferred from the value assigned:
|
||||
* `int`: Integer numbers (e.g., `lineHeight: 20;`)
|
||||
* `bool`: Boolean values (e.g., `useShadow: true;`)
|
||||
* `pixels`: Pixel values, ending with `px` (e.g., `borderWidth: 1px;`). Generated as `int` in C++.
|
||||
* `color`: Named colors defined in `colors.palette` (e.g., `background: windowBg;`)
|
||||
* `icon`: Defined inline using a specific syntax (see below). Generates `style::icon`.
|
||||
* `margins`: Four pixel values for margins or padding. Requires `margins(top, right, bottom, left)` syntax (e.g., `margin: margins(10px, 5px, 10px, 5px);` or `padding: margins(8px, 8px, 8px, 8px);`). Generates `style::margins` (an alias for `QMargins`).
|
||||
* `size`: Two pixel values for width and height (e.g., `iconSize: size(16px, 16px);`). Generates `style::size`.
|
||||
* `point`: Two pixel values for x and y coordinates (e.g., `textPos: point(5px, 2px);`). Generates `style::point`.
|
||||
* `align`: Alignment keywords (e.g., `textAlign: align(center);` or `iconAlign: align(left);`). Generates `style::align`.
|
||||
* `font`: Font definitions (e.g., `font: font(14px semibold);`). Generates `style::font`.
|
||||
* `double`: Floating point numbers (e.g., `disabledOpacity: 0.5;`)
|
||||
|
||||
*Note on Borders:* Borders are typically defined using multiple fields like `border: pixels;` (for width) and `borderFg: color;` (for color), rather than a single CSS-like property.
|
||||
|
||||
2. **Structure Definition:** You can define complex data structures directly within the `.style` file:
|
||||
```style
|
||||
MyButtonStyle { // Defines a structure named 'MyButtonStyle'
|
||||
textPadding: margins; // Field 'textPadding' expects margins type
|
||||
icon: icon; // Field 'icon' of type icon
|
||||
height: pixels; // Field 'height' of type pixels
|
||||
}
|
||||
```
|
||||
This generates a `struct MyButtonStyle { ... };` inside the `namespace style`. Fields will have corresponding C++ types (`style::margins`, `style::icon`, `int`).
|
||||
|
||||
3. **Variable Definition & Inheritance:** Variables are defined using `name: value;` or `groupName { ... }`. They can be of built-in types or custom structures. Structures can be initialized inline or inherit from existing variables.
|
||||
|
||||
**Icon Definition Syntax:** Icons are defined inline using the `icon{...}` syntax. The generator probes for `.svg` files or `.png` files (including `@2x`, `@3x` variants) based on the provided path stem.
|
||||
```style
|
||||
// Single-part icon definition:
|
||||
myIconSearch: icon{{ "gui/icons/search", iconColor }};
|
||||
// Multi-part icon definition (layers drawn bottom-up):
|
||||
myComplexIcon: icon{
|
||||
{ "gui/icons/background", iconBgColor },
|
||||
{ "gui/icons/foreground", iconFgColor }
|
||||
};
|
||||
// Icon with path modifiers (PNG only for flips, SVG only for size):
|
||||
myFlippedIcon: icon{{ "gui/icons/arrow-flip_horizontal", arrowColor }};
|
||||
myResizedIcon: icon{{ "gui/icons/logo-128x128", logoColor }}; // Forces 128x128 for SVG
|
||||
```
|
||||
|
||||
**Other Variable Examples:**
|
||||
```style
|
||||
// Simple variables
|
||||
buttonHeight: 30px;
|
||||
activeButtonColor: buttonBgActive; // Named color from colors.palette
|
||||
|
||||
// Variable of a custom structure type, initialized inline
|
||||
defaultButton: MyButtonStyle {
|
||||
textPadding: margins(10px, 15px, 10px, 15px); // Use margins(...) syntax
|
||||
icon: myIconSearch; // Assign the previously defined icon variable
|
||||
height: buttonHeight; // Reference another variable
|
||||
}
|
||||
|
||||
// Another variable inheriting from 'defaultButton' and overriding/adding fields
|
||||
primaryButton: MyButtonStyle(defaultButton) {
|
||||
icon: myComplexIcon; // Override icon with the multi-part one
|
||||
backgroundColor: activeButtonColor; // Add a field not in MyButtonStyle definition
|
||||
}
|
||||
|
||||
// Style group (often used for specific UI elements)
|
||||
chatInput { // Example using separate border properties and explicit padding
|
||||
border: 1px; // Border width
|
||||
borderFg: defaultInputFieldBorder; // Border color (named color)
|
||||
padding: margins(5px, 10px, 5px, 10px); // Use margins(...) syntax for padding field
|
||||
backgroundColor: defaultChatBg; // Background color
|
||||
}
|
||||
```
|
||||
|
||||
## Code Generation
|
||||
|
||||
A code generation tool processes these `.style` files and `colors.palette` to create C++ objects.
|
||||
- The `using` directives resolve dependencies between `.style` files.
|
||||
- Custom structure definitions (like `MyButtonStyle`) generate corresponding `struct MyButtonStyle { ... };` within the `namespace style`.
|
||||
- Style variables/groups (like `defaultButton`, `primaryButton`, `chatInput`) are generated as objects/structs within the `st` namespace (e.g., `st::defaultButton`, `st::primaryButton`, `st::chatInput`). These generated structs contain members corresponding to the fields defined in the `.style` file.
|
||||
- Color objects are generated into the `st` namespace as well, based on their names in `colors.palette` (e.g., `st::windowBg`, `st::buttonBgActive`).
|
||||
- The generated header files for styles are placed in the `Telegram/SourceFiles/styles/` directory with a `style_` prefix (e.g., `styles/style_widgets.h` for `ui/widgets/widgets.style`). You include them like `#include "styles/style_widgets.h"`.
|
||||
|
||||
Generated C++ types correspond to the `.style` types: `style::color`, `style::font`, `style::margins` (used for both `margin:` and `padding:` fields), `style::icon`, `style::size`, `style::point`, `style::align`, and `int` or `bool` for simple types.
|
||||
|
||||
## Style Usage in Code
|
||||
|
||||
Styles are applied in C++ code by referencing the generated `st::...` objects and their members.
|
||||
|
||||
```cpp
|
||||
// Example: Including the generated style header
|
||||
#include "styles/style_widgets.h" // For styles defined in ui/widgets/widgets.style
|
||||
|
||||
// ... inside some UI class code ...
|
||||
|
||||
// Accessing members of a generated style struct
|
||||
int height = st::primaryButton.height; // Accessing the 'height' field (pixels -> int)
|
||||
const style::icon &icon = st::primaryButton.icon; // Accessing the 'icon' field (st::myComplexIcon)
|
||||
style::margins padding = st::primaryButton.textPadding; // Accessing 'textPadding'
|
||||
style::color bgColor = st::primaryButton.backgroundColor; // Accessing the color (st::activeButtonColor)
|
||||
|
||||
// Applying styles (conceptual examples)
|
||||
myButton->setIcon(st::primaryButton.icon);
|
||||
myButton->setHeight(st::primaryButton.height);
|
||||
myButton->setPadding(st::primaryButton.textPadding);
|
||||
myButton->setBackgroundColor(st::primaryButton.backgroundColor);
|
||||
|
||||
// Using styles directly in painting
|
||||
void MyWidget::paintEvent(QPaintEvent *e) {
|
||||
Painter p(this);
|
||||
p.fillRect(rect(), st::chatInput.backgroundColor); // Use color from chatInput style
|
||||
|
||||
// Border painting requires width and color
|
||||
int borderWidth = st::chatInput.border; // Access border width (pixels -> int)
|
||||
style::color borderColor = st::chatInput.borderFg; // Access border color
|
||||
if (borderWidth > 0) {
|
||||
p.setPen(QPen(borderColor, borderWidth));
|
||||
// Adjust rect for pen width if needed before drawing
|
||||
p.drawRect(rect().adjusted(borderWidth / 2, borderWidth / 2, -borderWidth / 2, -borderWidth / 2));
|
||||
}
|
||||
|
||||
// Access padding (style::margins)
|
||||
style::margins inputPadding = st::chatInput.padding;
|
||||
// ... use inputPadding.top(), inputPadding.left() etc. for content layout ...
|
||||
}
|
||||
```
|
||||
|
||||
**Key Points:**
|
||||
|
||||
* Styles are defined in `.style` files next to their corresponding C++ source files.
|
||||
* `using "path/to/other.style";` includes definitions from other style files.
|
||||
* Named colors are defined centrally in `ui/colors.palette`.
|
||||
* `.style` syntax supports built-in types (like `pixels`, `color`, `margins`, `point`, `size`, `align`, `font`, `double`), custom structure definitions (`Name { field: type; ... }`), variable definitions (`name: value;`), and inheritance (`child: Name(parent) { ... }`).
|
||||
* Values must match the expected type (e.g., fields declared as `margins` type, like `margin:` or `padding:`, require `margins(...)` syntax). Borders are typically set via separate `border: pixels;` and `borderFg: color;` fields.
|
||||
* Icons are defined inline using `name: icon{{ "path_stem", color }};` or `name: icon{ { "path1", c1 }, ... };` syntax, with optional path modifiers.
|
||||
* Code generation creates `struct` definitions in the `style` namespace for custom types and objects/structs in the `st` namespace for defined variables/groups.
|
||||
* Generated headers are in `styles/` with a `style_` prefix and must be included.
|
||||
* Access style properties via the generated `st::` objects (e.g., `st::primaryButton.height`, `st::chatInput.backgroundColor`).
|
||||
@@ -0,0 +1,2 @@
|
||||
# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv)
|
||||
Telegram/ThirdParty/
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"name": "CentOS",
|
||||
"image": "tdesktop:centos_env",
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"settings": {
|
||||
"C_Cpp.intelliSenseEngine": "disabled",
|
||||
"cmake.generator": "Ninja Multi-Config",
|
||||
"cmake.buildDirectory": "${workspaceFolder}/out",
|
||||
"cmake.copyCompileCommands": "${workspaceFolder}/compile_commands.json"
|
||||
},
|
||||
"extensions": [
|
||||
"ms-vscode.cpptools-extension-pack",
|
||||
"llvm-vs-code-extensions.vscode-clangd",
|
||||
"TheQtCompany.qt",
|
||||
"ms-python.python",
|
||||
"ms-azuretools.vscode-docker",
|
||||
"eamodio.gitlens"
|
||||
]
|
||||
}
|
||||
},
|
||||
"capAdd": [
|
||||
"SYS_PTRACE"
|
||||
],
|
||||
"securityOpt": [
|
||||
"seccomp=unconfined"
|
||||
],
|
||||
"workspaceMount": "source=${localWorkspaceFolder},target=/usr/src/tdesktop,type=bind,consistency=cached",
|
||||
"workspaceFolder": "/usr/src/tdesktop"
|
||||
}
|
||||
@@ -5,7 +5,7 @@ body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for reporting issues of Telegram Desktop!
|
||||
Thanks for reporting issues of AyuGram Desktop!
|
||||
|
||||
To make it easier for us to help you please enter detailed information below.
|
||||
- type: textarea
|
||||
@@ -39,12 +39,9 @@ body:
|
||||
required: true
|
||||
- type: input
|
||||
attributes:
|
||||
label: Version of Telegram Desktop
|
||||
label: Version of AyuGram Desktop
|
||||
description: >
|
||||
Please note we don't support versions from Linux distro repositories.
|
||||
If you need support for these versions, **please contact your distro maintainer**
|
||||
or your distro bugtracker.
|
||||
**Don't use 'latest'**, specify actual version, **that's a reason to close your issue**.
|
||||
**Don't use 'latest'**, specify actual version.
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
@@ -52,11 +49,7 @@ body:
|
||||
label: Installation source
|
||||
multiple: false
|
||||
options:
|
||||
- Static binary from official website
|
||||
- Microsoft Store
|
||||
- Mac App Store
|
||||
- Flatpak
|
||||
- Snap
|
||||
- Binary from GitHub / official Telegram source
|
||||
- Other (unofficial) source
|
||||
validations:
|
||||
required: true
|
||||
@@ -65,9 +58,7 @@ body:
|
||||
label: Crash ID
|
||||
description: >
|
||||
If you're reporting a crash, please enter the crash ID from the crash reporter
|
||||
opening on the next launch after crash. **You have to enable beta versions
|
||||
installation in Settings -> Advanced for the reporter to appear.**
|
||||
You don't have to wait for a beta version to arrive.
|
||||
opening on the next launch after crash.
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Logs
|
||||
|
||||
@@ -1,124 +0,0 @@
|
||||
name: Linux.
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- 'docs/**'
|
||||
- '**.md'
|
||||
- 'changelog.txt'
|
||||
- 'LEGAL'
|
||||
- 'LICENSE'
|
||||
- '.github/**'
|
||||
- '!.github/workflows/linux.yml'
|
||||
- 'snap/**'
|
||||
- 'Telegram/build/**'
|
||||
- 'Telegram/Resources/uwp/**'
|
||||
- 'Telegram/Resources/winrc/**'
|
||||
- 'Telegram/SourceFiles/platform/win/**'
|
||||
- 'Telegram/SourceFiles/platform/mac/**'
|
||||
- 'Telegram/Telegram/**'
|
||||
- 'Telegram/configure.bat'
|
||||
- 'Telegram/Telegram.plist'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- 'docs/**'
|
||||
- '**.md'
|
||||
- 'changelog.txt'
|
||||
- 'LEGAL'
|
||||
- 'LICENSE'
|
||||
- '.github/**'
|
||||
- '!.github/workflows/linux.yml'
|
||||
- 'snap/**'
|
||||
- 'Telegram/build/**'
|
||||
- 'Telegram/Resources/uwp/**'
|
||||
- 'Telegram/Resources/winrc/**'
|
||||
- 'Telegram/SourceFiles/platform/win/**'
|
||||
- 'Telegram/SourceFiles/platform/mac/**'
|
||||
- 'Telegram/Telegram/**'
|
||||
- 'Telegram/configure.bat'
|
||||
- 'Telegram/Telegram.plist'
|
||||
|
||||
jobs:
|
||||
|
||||
linux:
|
||||
name: Rocky Linux 8
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
defines:
|
||||
- ""
|
||||
- "DESKTOP_APP_DISABLE_X11_INTEGRATION"
|
||||
|
||||
env:
|
||||
UPLOAD_ARTIFACT: "true"
|
||||
|
||||
steps:
|
||||
- name: Get repository name.
|
||||
run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
|
||||
|
||||
- name: Clone.
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
path: ${{ env.REPO_NAME }}
|
||||
|
||||
- name: First set up.
|
||||
run: |
|
||||
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $ --password-stdin
|
||||
docker pull ghcr.io/$GITHUB_REPOSITORY/centos_env
|
||||
docker tag ghcr.io/$GITHUB_REPOSITORY/centos_env tdesktop:centos_env
|
||||
|
||||
- name: Telegram Desktop build.
|
||||
run: |
|
||||
cd $REPO_NAME
|
||||
|
||||
DEFINE=""
|
||||
if [ -n "${{ matrix.defines }}" ]; then
|
||||
DEFINE="-D ${{ matrix.defines }}=ON"
|
||||
echo Define from matrix: $DEFINE
|
||||
echo "ARTIFACT_NAME=Telegram_${{ matrix.defines }}" >> $GITHUB_ENV
|
||||
else
|
||||
echo "ARTIFACT_NAME=Telegram" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
docker run --rm \
|
||||
-v $PWD:/usr/src/tdesktop \
|
||||
-e CONFIG=Debug \
|
||||
tdesktop:centos_env \
|
||||
/usr/src/tdesktop/Telegram/build/docker/centos_env/build.sh \
|
||||
-D CMAKE_C_FLAGS_DEBUG="" \
|
||||
-D CMAKE_CXX_FLAGS_DEBUG="" \
|
||||
-D CMAKE_C_FLAGS="-Werror" \
|
||||
-D CMAKE_CXX_FLAGS="-Werror" \
|
||||
-D CMAKE_EXE_LINKER_FLAGS="-s" \
|
||||
-D TDESKTOP_API_TEST=ON \
|
||||
-D DESKTOP_APP_DISABLE_AUTOUPDATE=OFF \
|
||||
-D DESKTOP_APP_DISABLE_CRASH_REPORTS=OFF \
|
||||
$DEFINE
|
||||
|
||||
- name: Check.
|
||||
run: |
|
||||
filePath="$REPO_NAME/out/Debug/Telegram"
|
||||
if test -f "$filePath"; then
|
||||
echo "Build successfully done! :)"
|
||||
|
||||
size=$(stat -c %s "$filePath")
|
||||
echo "File size of ${filePath}: ${size} Bytes."
|
||||
else
|
||||
echo "Build error, output file does not exist."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Move artifact.
|
||||
if: env.UPLOAD_ARTIFACT == 'true'
|
||||
run: |
|
||||
cd $REPO_NAME/out/Debug
|
||||
sudo mkdir artifact
|
||||
sudo mv {Telegram,Updater} artifact/
|
||||
- uses: actions/upload-artifact@v4
|
||||
if: env.UPLOAD_ARTIFACT == 'true'
|
||||
name: Upload artifact.
|
||||
with:
|
||||
name: ${{ env.ARTIFACT_NAME }}
|
||||
path: ${{ env.REPO_NAME }}/out/Debug/artifact/
|
||||
@@ -1,201 +0,0 @@
|
||||
name: Windows.
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- 'docs/**'
|
||||
- '**.md'
|
||||
- 'changelog.txt'
|
||||
- 'LEGAL'
|
||||
- 'LICENSE'
|
||||
- '.github/**'
|
||||
- '!.github/workflows/win.yml'
|
||||
- 'lib/xdg/**'
|
||||
- 'snap/**'
|
||||
- 'Telegram/build/docker/**'
|
||||
- 'Telegram/Resources/uwp/**'
|
||||
- 'Telegram/SourceFiles/platform/linux/**'
|
||||
- 'Telegram/SourceFiles/platform/mac/**'
|
||||
- 'Telegram/Telegram/**'
|
||||
- 'Telegram/configure.sh'
|
||||
- 'Telegram/Telegram.plist'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- 'docs/**'
|
||||
- '**.md'
|
||||
- 'changelog.txt'
|
||||
- 'LEGAL'
|
||||
- 'LICENSE'
|
||||
- '.github/**'
|
||||
- '!.github/workflows/win.yml'
|
||||
- 'lib/xdg/**'
|
||||
- 'snap/**'
|
||||
- 'Telegram/build/docker/**'
|
||||
- 'Telegram/Resources/uwp/**'
|
||||
- 'Telegram/SourceFiles/platform/linux/**'
|
||||
- 'Telegram/SourceFiles/platform/mac/**'
|
||||
- 'Telegram/Telegram/**'
|
||||
- 'Telegram/configure.sh'
|
||||
- 'Telegram/Telegram.plist'
|
||||
|
||||
jobs:
|
||||
|
||||
windows:
|
||||
name: Windows
|
||||
runs-on: windows-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [Win32, x64]
|
||||
generator: ["", "Ninja Multi-Config"]
|
||||
|
||||
env:
|
||||
UPLOAD_ARTIFACT: "true"
|
||||
ONLY_CACHE: "false"
|
||||
PREPARE_PATH: "Telegram/build/prepare/prepare.py"
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: cmd
|
||||
|
||||
steps:
|
||||
- name: Prepare directories.
|
||||
run: |
|
||||
mkdir %userprofile%\TBuild\Libraries
|
||||
mklink /d %GITHUB_WORKSPACE%\TBuild %userprofile%\TBuild
|
||||
echo TBUILD=%GITHUB_WORKSPACE%\TBuild>>%GITHUB_ENV%
|
||||
|
||||
- name: Get repository name.
|
||||
shell: bash
|
||||
run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
|
||||
|
||||
- uses: ilammy/msvc-dev-cmd@v1.13.0
|
||||
name: Native Tools Command Prompt.
|
||||
with:
|
||||
arch: ${{ matrix.arch }}
|
||||
|
||||
- name: Clone.
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
path: ${{ env.TBUILD }}\${{ env.REPO_NAME }}
|
||||
|
||||
- name: Set up environment paths.
|
||||
shell: bash
|
||||
run: |
|
||||
echo "CACHE_KEY=$(sha256sum $TBUILD/$REPO_NAME/$PREPARE_PATH | awk '{ print $1 }')" >> $GITHUB_ENV
|
||||
|
||||
echo "Configurate git for cherry-picks."
|
||||
git config --global user.email "you@example.com"
|
||||
git config --global user.name "Sample"
|
||||
|
||||
- name: NuGet sources.
|
||||
run: |
|
||||
nuget sources Disable -Name "Microsoft Visual Studio Offline Packages"
|
||||
nuget sources Add -Source https://api.nuget.org/v3/index.json & exit 0
|
||||
|
||||
- name: ThirdParty cache.
|
||||
id: cache-third-party
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.TBUILD }}\ThirdParty
|
||||
key: ${{ runner.OS }}-${{ matrix.arch }}-third-party-${{ env.CACHE_KEY }}
|
||||
restore-keys: ${{ runner.OS }}-${{ matrix.arch }}-third-party-
|
||||
|
||||
- name: Libraries cache.
|
||||
id: cache-libs
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.TBUILD }}\Libraries
|
||||
key: ${{ runner.OS }}-${{ matrix.arch }}-libs-${{ env.CACHE_KEY }}
|
||||
restore-keys: ${{ runner.OS }}-${{ matrix.arch }}-libs-
|
||||
|
||||
- name: Libraries.
|
||||
env:
|
||||
GYP_MSVS_OVERRIDE_PATH: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\'
|
||||
GYP_MSVS_VERSION: 2022
|
||||
run: |
|
||||
cd %TBUILD%
|
||||
%REPO_NAME%\Telegram\build\prepare\win.bat skip-release silent
|
||||
|
||||
- name: Read configuration matrix.
|
||||
shell: bash
|
||||
run: |
|
||||
ARTIFACT_NAME="Telegram"
|
||||
|
||||
ARCH=""
|
||||
if [ -n "${{ matrix.arch }}" ]; then
|
||||
case "${{ matrix.arch }}" in
|
||||
Win32) ARCH="x86";;
|
||||
*) ARCH="${{ matrix.arch }}";;
|
||||
esac
|
||||
echo "Architecture from matrix: $ARCH"
|
||||
ARTIFACT_NAME="${ARTIFACT_NAME}_${{ matrix.arch }}"
|
||||
fi
|
||||
|
||||
GENERATOR=""
|
||||
if [ -n "${{ matrix.generator }}" ]; then
|
||||
GENERATOR="-G \"${{ matrix.generator }}\""
|
||||
echo "Generator from matrix: $GENERATOR"
|
||||
ARTIFACT_NAME="${ARTIFACT_NAME}_${{ matrix.generator }}"
|
||||
fi
|
||||
echo "TDESKTOP_BUILD_GENERATOR=$GENERATOR" >> $GITHUB_ENV
|
||||
|
||||
[ -n "$GENERATOR" ] && ARCH=""
|
||||
echo "TDESKTOP_BUILD_ARCH=$ARCH" >> $GITHUB_ENV
|
||||
|
||||
DEFINE=""
|
||||
if [ -n "${{ matrix.defines }}" ]; then
|
||||
DEFINE="-D ${{ matrix.defines }}=ON"
|
||||
echo "Define from matrix: $DEFINE"
|
||||
ARTIFACT_NAME="${ARTIFACT_NAME}_${{ matrix.defines }}"
|
||||
fi
|
||||
echo "TDESKTOP_BUILD_DEFINE=$DEFINE" >> $GITHUB_ENV
|
||||
|
||||
echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> $GITHUB_ENV
|
||||
|
||||
API="-D TDESKTOP_API_TEST=ON"
|
||||
if [ $GITHUB_REF == 'refs/heads/nightly' ]; then
|
||||
echo "Use the open credentials."
|
||||
API="-D TDESKTOP_API_ID=611335 -D TDESKTOP_API_HASH=d524b414d21f4d37f08684c1df41ac9c"
|
||||
fi
|
||||
echo "TDESKTOP_BUILD_API=$API" >> $GITHUB_ENV
|
||||
|
||||
- name: Free up some disk space.
|
||||
run: |
|
||||
cd %TBUILD%
|
||||
del /S Libraries\*.pdb
|
||||
del /S Libraries\*.pch
|
||||
del /S Libraries\*.obj
|
||||
|
||||
- name: Telegram Desktop build.
|
||||
if: env.ONLY_CACHE == 'false'
|
||||
run: |
|
||||
cd %TBUILD%\%REPO_NAME%\Telegram
|
||||
|
||||
call configure.bat ^
|
||||
%TDESKTOP_BUILD_GENERATOR% ^
|
||||
%TDESKTOP_BUILD_ARCH% ^
|
||||
%TDESKTOP_BUILD_API% ^
|
||||
-D CMAKE_C_FLAGS="/WX" ^
|
||||
-D CMAKE_CXX_FLAGS="/WX" ^
|
||||
-D DESKTOP_APP_DISABLE_AUTOUPDATE=OFF ^
|
||||
-D DESKTOP_APP_DISABLE_CRASH_REPORTS=OFF ^
|
||||
-D DESKTOP_APP_NO_PDB=ON ^
|
||||
%TDESKTOP_BUILD_DEFINE%
|
||||
|
||||
cmake --build ..\out --config Debug --parallel
|
||||
|
||||
- name: Move artifact.
|
||||
if: (env.UPLOAD_ARTIFACT == 'true') || (github.ref == 'refs/heads/nightly')
|
||||
run: |
|
||||
set OUT=%TBUILD%\%REPO_NAME%\out\Debug
|
||||
mkdir artifact
|
||||
move %OUT%\Telegram.exe artifact/
|
||||
move %OUT%\Updater.exe artifact/
|
||||
- uses: actions/upload-artifact@v4
|
||||
name: Upload artifact.
|
||||
if: (env.UPLOAD_ARTIFACT == 'true') || (github.ref == 'refs/heads/nightly')
|
||||
with:
|
||||
name: ${{ env.ARTIFACT_NAME }}
|
||||
path: artifact\
|
||||
@@ -19,6 +19,8 @@ Release/
|
||||
ipch/
|
||||
.vs/
|
||||
.vscode/
|
||||
.cache/
|
||||
compile_commands.json
|
||||
|
||||
/Telegram/log.txt
|
||||
/Telegram/data
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
url = https://github.com/telegramdesktop/libtgvoip
|
||||
[submodule "Telegram/ThirdParty/GSL"]
|
||||
path = Telegram/ThirdParty/GSL
|
||||
url = https://github.com/desktop-app/GSL.git
|
||||
url = https://github.com/Microsoft/GSL.git
|
||||
[submodule "Telegram/ThirdParty/xxHash"]
|
||||
path = Telegram/ThirdParty/xxHash
|
||||
url = https://github.com/Cyan4973/xxHash.git
|
||||
@@ -24,7 +24,7 @@
|
||||
url = https://github.com/desktop-app/lib_base.git
|
||||
[submodule "Telegram/codegen"]
|
||||
path = Telegram/codegen
|
||||
url = https://github.com/desktop-app/codegen.git
|
||||
url = https://github.com/AyuGram/codegen.git
|
||||
[submodule "Telegram/lib_ui"]
|
||||
path = Telegram/lib_ui
|
||||
url = https://github.com/AyuGram/lib_ui.git
|
||||
|
||||
@@ -4,15 +4,7 @@
|
||||
# For license and copyright information please follow this link:
|
||||
# https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
|
||||
if (APPLE)
|
||||
# target_precompile_headers with COMPILE_LANGUAGE restriction.
|
||||
cmake_minimum_required(VERSION 3.23)
|
||||
else()
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
endif()
|
||||
if (POLICY CMP0149)
|
||||
cmake_policy(SET CMP0149 NEW)
|
||||
endif()
|
||||
cmake_minimum_required(VERSION 3.25...3.31)
|
||||
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
This file is part of Telegram Desktop,
|
||||
the official desktop application for the Telegram messaging service.
|
||||
|
||||
Copyright (c) 2014-2024 The Telegram Desktop Authors.
|
||||
Copyright (c) 2014-2025 The Telegram Desktop Authors.
|
||||
|
||||
Telegram Desktop is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -16,12 +16,15 @@
|
||||
|
||||
И многое другое. Посмотрите нашу [Документацию](https://docs.ayugram.one/desktop/) для более подробной информации.
|
||||
|
||||
## Скриншоты настроек
|
||||
|
||||
<img src='.github/demos/demo1.png' width='268'>
|
||||
<img src='.github/demos/demo3.png' width='268'>
|
||||
<img src='.github/demos/demo2.png' width='268'>
|
||||
<img src='.github/demos/demo4.png' width='268'>
|
||||
<h3>
|
||||
<details>
|
||||
<summary>Скриншоты настроек</summary>
|
||||
<img src='.github/demos/demo1.png' width='268'>
|
||||
<img src='.github/demos/demo2.png' width='268'>
|
||||
<img src='.github/demos/demo3.png' width='268'>
|
||||
<img src='.github/demos/demo4.png' width='268'>
|
||||
</details>
|
||||
</h3>
|
||||
|
||||
## Установка
|
||||
|
||||
@@ -29,8 +32,8 @@
|
||||
|
||||
#### Официальный вариант
|
||||
|
||||
Вы можете скачать готовый бинарный файл со [вкладки Releases](https://github.com/AyuGram/AyuGramDesktop/releases) или из
|
||||
[Телеграм чата](https://t.me/ayugramchat/12788).
|
||||
Вы можете скачать готовый бинарный файл со вкладки [Releases](https://github.com/AyuGram/AyuGramDesktop/releases) или из
|
||||
[Телеграм канала](https://t.me/AyuGramReleases).
|
||||
|
||||
#### Winget
|
||||
|
||||
@@ -50,14 +53,17 @@ scoop install ayugram
|
||||
Следуйте [официальному руководству](https://github.com/AyuGram/AyuGramDesktop/blob/dev/docs/building-win-x64.md), если
|
||||
вы хотите собрать AyuGram сами.
|
||||
|
||||
### macOS
|
||||
|
||||
Вы можете скачать подписанный пакет со вкладки [Releases](https://github.com/AyuGram/AyuGramDesktop/releases).
|
||||
|
||||
### Arch Linux
|
||||
|
||||
Вы можете установить `ayugram-desktop` или `ayugram-desktop-git`
|
||||
из [AUR](https://aur.archlinux.org/packages?O=0&K=ayugram).
|
||||
Вы можете установить `ayugram-desktop` из [AUR](https://aur.archlinux.org/packages?O=0&K=ayugram).
|
||||
|
||||
### NixOS
|
||||
|
||||
Попробуйте [этот репозиторий](https://github.com/kaeeraa/ayugram-desktop).
|
||||
Попробуйте [этот репозиторий](https://github.com/ayugram-port/ayugram-desktop).
|
||||
|
||||
### Любой другой Линукс дистрибутив
|
||||
|
||||
|
||||
@@ -17,12 +17,15 @@
|
||||
|
||||
And many more. Check out our [Documentation](https://docs.ayugram.one/desktop/).
|
||||
|
||||
## Preferences screenshots
|
||||
|
||||
<img src='.github/demos/demo1.png' width='268'>
|
||||
<img src='.github/demos/demo2.png' width='268'>
|
||||
<img src='.github/demos/demo3.png' width='268'>
|
||||
<img src='.github/demos/demo4.png' width='268'>
|
||||
<h3>
|
||||
<details>
|
||||
<summary>Preferences screenshots</summary>
|
||||
<img src='.github/demos/demo1.png' width='268'>
|
||||
<img src='.github/demos/demo2.png' width='268'>
|
||||
<img src='.github/demos/demo3.png' width='268'>
|
||||
<img src='.github/demos/demo4.png' width='268'>
|
||||
</details>
|
||||
</h3>
|
||||
|
||||
## Downloads
|
||||
|
||||
@@ -31,7 +34,7 @@ And many more. Check out our [Documentation](https://docs.ayugram.one/desktop/).
|
||||
#### Official
|
||||
|
||||
You can download prebuilt Windows binary from [Releases tab](https://github.com/AyuGram/AyuGramDesktop/releases) or from
|
||||
the [Telegram topic](https://t.me/ayugramchat/12788).
|
||||
the [Telegram channel](https://t.me/AyuGramReleases).
|
||||
|
||||
#### Winget
|
||||
|
||||
@@ -51,13 +54,17 @@ scoop install ayugram
|
||||
Follow [official guide](https://github.com/AyuGram/AyuGramDesktop/blob/dev/docs/building-win-x64.md) if you want to
|
||||
build by yourself.
|
||||
|
||||
### macOS
|
||||
|
||||
You can download prebuilt macOS package from [Releases tab](https://github.com/AyuGram/AyuGramDesktop/releases).
|
||||
|
||||
### Arch Linux
|
||||
|
||||
You can install `ayugram-desktop` or `ayugram-desktop-git` from [AUR](https://aur.archlinux.org/packages?O=0&K=ayugram).
|
||||
You can install `ayugram-desktop` from [AUR](https://aur.archlinux.org/packages?O=0&K=ayugram).
|
||||
|
||||
### NixOS
|
||||
|
||||
See [this repository](https://github.com/kaeeraa/ayugram-desktop) for installation manual.
|
||||
See [this repository](https://github.com/ayugram-port/ayugram-desktop) for installation manual.
|
||||
|
||||
### Any other Linux distro
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@ get_filename_component(res_loc Resources REALPATH)
|
||||
include(cmake/telegram_options.cmake)
|
||||
include(cmake/lib_ffmpeg.cmake)
|
||||
include(cmake/lib_stripe.cmake)
|
||||
include(cmake/lib_tgvoip.cmake)
|
||||
include(cmake/lib_tgcalls.cmake)
|
||||
include(cmake/lib_prisma.cmake)
|
||||
include(cmake/td_export.cmake)
|
||||
@@ -34,6 +33,7 @@ include(cmake/td_iv.cmake)
|
||||
include(cmake/td_lang.cmake)
|
||||
include(cmake/td_mtproto.cmake)
|
||||
include(cmake/td_scheme.cmake)
|
||||
include(cmake/td_tde2e.cmake)
|
||||
include(cmake/td_ui.cmake)
|
||||
include(cmake/generate_appdata_changelog.cmake)
|
||||
|
||||
@@ -47,17 +47,15 @@ if (WIN32)
|
||||
platform/win/windows_quiethours.idl
|
||||
platform/win/windows_toastactivator.idl
|
||||
)
|
||||
|
||||
nuget_add_winrt(Telegram)
|
||||
endif()
|
||||
|
||||
set_target_properties(Telegram PROPERTIES AUTOMOC ON)
|
||||
|
||||
target_link_libraries(Telegram
|
||||
PRIVATE
|
||||
tdesktop::lib_tgcalls_legacy
|
||||
# tdesktop::lib_tgcalls_legacy
|
||||
tdesktop::lib_tgcalls
|
||||
tdesktop::lib_tgvoip
|
||||
# tdesktop::lib_tgvoip
|
||||
|
||||
# Order in this list defines the order of include paths in command line.
|
||||
# We need to place desktop-app::external_minizip this early to have its
|
||||
@@ -71,6 +69,7 @@ PRIVATE
|
||||
tdesktop::td_lang
|
||||
tdesktop::td_mtproto
|
||||
tdesktop::td_scheme
|
||||
tdesktop::td_tde2e
|
||||
tdesktop::td_ui
|
||||
desktop-app::lib_webrtc
|
||||
desktop-app::lib_base
|
||||
@@ -118,6 +117,8 @@ set(ayugram_files
|
||||
ayu/utils/telegram_helpers.h
|
||||
ayu/utils/windows_utils.cpp
|
||||
ayu/utils/windows_utils.h
|
||||
ayu/utils/rc_manager.cpp
|
||||
ayu/utils/rc_manager.h
|
||||
ayu/utils/taptic_engine/taptic_engine.cpp
|
||||
ayu/utils/taptic_engine/taptic_engine.h
|
||||
ayu/utils/taptic_engine/platform/taptic_engine_dummy.cpp
|
||||
@@ -192,6 +193,8 @@ PRIVATE
|
||||
api/api_bot.h
|
||||
api/api_chat_filters.cpp
|
||||
api/api_chat_filters.h
|
||||
api/api_chat_filters_remove_manager.cpp
|
||||
api/api_chat_filters_remove_manager.h
|
||||
api/api_chat_invite.cpp
|
||||
api/api_chat_invite.h
|
||||
api/api_chat_links.cpp
|
||||
@@ -227,6 +230,8 @@ PRIVATE
|
||||
api/api_peer_colors.h
|
||||
api/api_peer_photo.cpp
|
||||
api/api_peer_photo.h
|
||||
api/api_peer_search.cpp
|
||||
api/api_peer_search.h
|
||||
api/api_polls.cpp
|
||||
api/api_polls.h
|
||||
api/api_premium.cpp
|
||||
@@ -291,8 +296,8 @@ PRIVATE
|
||||
boxes/peers/edit_contact_box.h
|
||||
boxes/peers/edit_forum_topic_box.cpp
|
||||
boxes/peers/edit_forum_topic_box.h
|
||||
boxes/peers/edit_linked_chat_box.cpp
|
||||
boxes/peers/edit_linked_chat_box.h
|
||||
boxes/peers/edit_discussion_link_box.cpp
|
||||
boxes/peers/edit_discussion_link_box.h
|
||||
boxes/peers/edit_members_visible.cpp
|
||||
boxes/peers/edit_members_visible.h
|
||||
boxes/peers/edit_participant_box.cpp
|
||||
@@ -324,6 +329,8 @@ PRIVATE
|
||||
boxes/peers/prepare_short_info_box.h
|
||||
boxes/peers/replace_boost_box.cpp
|
||||
boxes/peers/replace_boost_box.h
|
||||
boxes/peers/verify_peers_box.cpp
|
||||
boxes/peers/verify_peers_box.h
|
||||
boxes/about_box.cpp
|
||||
boxes/about_box.h
|
||||
boxes/about_sponsored_box.cpp
|
||||
@@ -372,6 +379,8 @@ PRIVATE
|
||||
boxes/peer_list_box.h
|
||||
boxes/peer_list_controllers.cpp
|
||||
boxes/peer_list_controllers.h
|
||||
boxes/peer_list_widgets.cpp
|
||||
boxes/peer_list_widgets.h
|
||||
boxes/peer_lists_box.cpp
|
||||
boxes/peer_lists_box.h
|
||||
boxes/passcode_box.cpp
|
||||
@@ -398,8 +407,6 @@ PRIVATE
|
||||
boxes/send_gif_with_caption_box.h
|
||||
boxes/send_files_box.cpp
|
||||
boxes/send_files_box.h
|
||||
boxes/sessions_box.cpp
|
||||
boxes/sessions_box.h
|
||||
boxes/share_box.cpp
|
||||
boxes/share_box.h
|
||||
boxes/star_gift_box.cpp
|
||||
@@ -408,6 +415,8 @@ PRIVATE
|
||||
boxes/sticker_set_box.h
|
||||
boxes/stickers_box.cpp
|
||||
boxes/stickers_box.h
|
||||
boxes/transfer_gift_box.cpp
|
||||
boxes/transfer_gift_box.h
|
||||
boxes/translate_box.cpp
|
||||
boxes/translate_box.h
|
||||
boxes/url_auth_box.cpp
|
||||
@@ -468,6 +477,8 @@ PRIVATE
|
||||
calls/calls_video_bubble.h
|
||||
calls/calls_video_incoming.cpp
|
||||
calls/calls_video_incoming.h
|
||||
calls/calls_window.cpp
|
||||
calls/calls_window.h
|
||||
chat_helpers/compose/compose_features.h
|
||||
chat_helpers/compose/compose_show.cpp
|
||||
chat_helpers/compose/compose_show.h
|
||||
@@ -517,6 +528,8 @@ PRIVATE
|
||||
chat_helpers/ttl_media_layer_widget.h
|
||||
core/application.cpp
|
||||
core/application.h
|
||||
core/bank_card_click_handler.cpp
|
||||
core/bank_card_click_handler.h
|
||||
core/base_integration.cpp
|
||||
core/base_integration.h
|
||||
core/changelogs.cpp
|
||||
@@ -546,6 +559,7 @@ PRIVATE
|
||||
core/sandbox.h
|
||||
core/shortcuts.cpp
|
||||
core/shortcuts.h
|
||||
core/stars_amount.h
|
||||
core/ui_integration.cpp
|
||||
core/ui_integration.h
|
||||
core/update_checker.cpp
|
||||
@@ -569,6 +583,8 @@ PRIVATE
|
||||
data/components/factchecks.h
|
||||
data/components/location_pickers.cpp
|
||||
data/components/location_pickers.h
|
||||
data/components/promo_suggestions.cpp
|
||||
data/components/promo_suggestions.h
|
||||
data/components/recent_peers.cpp
|
||||
data/components/recent_peers.h
|
||||
data/components/scheduled_messages.cpp
|
||||
@@ -703,6 +719,7 @@ PRIVATE
|
||||
data/data_shared_media.h
|
||||
data/data_sparse_ids.cpp
|
||||
data/data_sparse_ids.h
|
||||
data/data_star_gift.h
|
||||
data/data_statistics.h
|
||||
data/data_stories.cpp
|
||||
data/data_stories.h
|
||||
@@ -716,6 +733,8 @@ PRIVATE
|
||||
data/data_thread.h
|
||||
data/data_types.cpp
|
||||
data/data_types.h
|
||||
data/data_unread_value.cpp
|
||||
data/data_unread_value.h
|
||||
data/data_user.cpp
|
||||
data/data_user.h
|
||||
data/data_user_photos.cpp
|
||||
@@ -752,12 +771,16 @@ PRIVATE
|
||||
dialogs/dialogs_main_list.h
|
||||
dialogs/dialogs_pinned_list.cpp
|
||||
dialogs/dialogs_pinned_list.h
|
||||
dialogs/dialogs_quick_action.cpp
|
||||
dialogs/dialogs_quick_action.h
|
||||
dialogs/dialogs_row.cpp
|
||||
dialogs/dialogs_row.h
|
||||
dialogs/dialogs_search_from_controllers.cpp
|
||||
dialogs/dialogs_search_from_controllers.h
|
||||
dialogs/dialogs_search_tags.cpp
|
||||
dialogs/dialogs_search_tags.h
|
||||
dialogs/dialogs_top_bar_suggestion.cpp
|
||||
dialogs/dialogs_top_bar_suggestion.h
|
||||
dialogs/dialogs_widget.cpp
|
||||
dialogs/dialogs_widget.h
|
||||
editor/color_picker.cpp
|
||||
@@ -871,6 +894,8 @@ PRIVATE
|
||||
history/view/media/history_view_story_mention.h
|
||||
history/view/media/history_view_theme_document.cpp
|
||||
history/view/media/history_view_theme_document.h
|
||||
history/view/media/history_view_unique_gift.cpp
|
||||
history/view/media/history_view_unique_gift.h
|
||||
history/view/media/history_view_userpic_suggestion.cpp
|
||||
history/view/media/history_view_userpic_suggestion.h
|
||||
history/view/media/history_view_web_page.cpp
|
||||
@@ -987,12 +1012,20 @@ PRIVATE
|
||||
history/history_unread_things.h
|
||||
history/history_view_highlight_manager.cpp
|
||||
history/history_view_highlight_manager.h
|
||||
history/history_view_swipe_back_session.cpp
|
||||
history/history_view_swipe_back_session.h
|
||||
history/history_widget.cpp
|
||||
history/history_widget.h
|
||||
info/bot/earn/info_bot_earn_list.cpp
|
||||
info/bot/earn/info_bot_earn_list.h
|
||||
info/bot/earn/info_bot_earn_widget.cpp
|
||||
info/bot/earn/info_bot_earn_widget.h
|
||||
info/bot/starref/info_bot_starref_common.cpp
|
||||
info/bot/starref/info_bot_starref_common.h
|
||||
info/bot/starref/info_bot_starref_join_widget.cpp
|
||||
info/bot/starref/info_bot_starref_join_widget.h
|
||||
info/bot/starref/info_bot_starref_setup_widget.cpp
|
||||
info/bot/starref/info_bot_starref_setup_widget.h
|
||||
info/channel_statistics/boosts/create_giveaway_box.cpp
|
||||
info/channel_statistics/boosts/create_giveaway_box.h
|
||||
info/channel_statistics/boosts/giveaway/giveaway_list_controllers.cpp
|
||||
@@ -1015,6 +1048,13 @@ PRIVATE
|
||||
info/downloads/info_downloads_provider.h
|
||||
info/downloads/info_downloads_widget.cpp
|
||||
info/downloads/info_downloads_widget.h
|
||||
info/global_media/info_global_media_widget.cpp
|
||||
info/global_media/info_global_media_widget.h
|
||||
info/global_media/info_global_media_inner_widget.cpp
|
||||
info/global_media/info_global_media_inner_widget.h
|
||||
info/global_media/info_global_media_provider.cpp
|
||||
info/global_media/info_global_media_provider.h
|
||||
info/media/info_media_buttons.cpp
|
||||
info/media/info_media_buttons.h
|
||||
info/media/info_media_common.cpp
|
||||
info/media/info_media_common.h
|
||||
@@ -1062,12 +1102,16 @@ PRIVATE
|
||||
info/profile/info_profile_values.h
|
||||
info/profile/info_profile_widget.cpp
|
||||
info/profile/info_profile_widget.h
|
||||
info/reactions_list/info_reactions_list_widget.cpp
|
||||
info/reactions_list/info_reactions_list_widget.h
|
||||
info/requests_list/info_requests_list_widget.cpp
|
||||
info/requests_list/info_requests_list_widget.h
|
||||
info/saved/info_saved_sublists_widget.cpp
|
||||
info/saved/info_saved_sublists_widget.h
|
||||
info/settings/info_settings_widget.cpp
|
||||
info/settings/info_settings_widget.h
|
||||
info/similar_channels/info_similar_channels_widget.cpp
|
||||
info/similar_channels/info_similar_channels_widget.h
|
||||
info/similar_peers/info_similar_peers_widget.cpp
|
||||
info/similar_peers/info_similar_peers_widget.h
|
||||
info/statistics/info_statistics_common.h
|
||||
info/statistics/info_statistics_inner_widget.cpp
|
||||
info/statistics/info_statistics_inner_widget.h
|
||||
@@ -1075,6 +1119,7 @@ PRIVATE
|
||||
info/statistics/info_statistics_list_controllers.h
|
||||
info/statistics/info_statistics_recent_message.cpp
|
||||
info/statistics/info_statistics_recent_message.h
|
||||
info/statistics/info_statistics_tag.h
|
||||
info/statistics/info_statistics_widget.cpp
|
||||
info/statistics/info_statistics_widget.h
|
||||
info/stories/info_stories_inner_widget.cpp
|
||||
@@ -1111,6 +1156,10 @@ PRIVATE
|
||||
info/info_wrap_widget.h
|
||||
inline_bots/bot_attach_web_view.cpp
|
||||
inline_bots/bot_attach_web_view.h
|
||||
inline_bots/inline_bot_confirm_prepared.cpp
|
||||
inline_bots/inline_bot_confirm_prepared.h
|
||||
inline_bots/inline_bot_downloads.cpp
|
||||
inline_bots/inline_bot_downloads.h
|
||||
inline_bots/inline_bot_layout_internal.cpp
|
||||
inline_bots/inline_bot_layout_internal.h
|
||||
inline_bots/inline_bot_layout_item.cpp
|
||||
@@ -1119,6 +1168,8 @@ PRIVATE
|
||||
inline_bots/inline_bot_result.h
|
||||
inline_bots/inline_bot_send_data.cpp
|
||||
inline_bots/inline_bot_send_data.h
|
||||
inline_bots/inline_bot_storage.cpp
|
||||
inline_bots/inline_bot_storage.h
|
||||
inline_bots/inline_results_inner.cpp
|
||||
inline_bots/inline_results_inner.h
|
||||
inline_bots/inline_results_widget.cpp
|
||||
@@ -1133,8 +1184,6 @@ PRIVATE
|
||||
intro/intro_qr.h
|
||||
intro/intro_signup.cpp
|
||||
intro/intro_signup.h
|
||||
intro/intro_start.cpp
|
||||
intro/intro_start.h
|
||||
intro/intro_step.cpp
|
||||
intro/intro_step.h
|
||||
intro/intro_widget.cpp
|
||||
@@ -1182,6 +1231,8 @@ PRIVATE
|
||||
media/audio/media_audio_loader.h
|
||||
media/audio/media_audio_loaders.cpp
|
||||
media/audio/media_audio_loaders.h
|
||||
media/audio/media_audio_local_cache.cpp
|
||||
media/audio/media_audio_local_cache.h
|
||||
media/audio/media_audio_track.cpp
|
||||
media/audio/media_audio_track.h
|
||||
media/audio/media_child_ffmpeg_loader.cpp
|
||||
@@ -1242,12 +1293,16 @@ PRIVATE
|
||||
media/streaming/media_streaming_player.h
|
||||
media/streaming/media_streaming_reader.cpp
|
||||
media/streaming/media_streaming_reader.h
|
||||
media/streaming/media_streaming_round_preview.cpp
|
||||
media/streaming/media_streaming_round_preview.h
|
||||
media/streaming/media_streaming_utility.cpp
|
||||
media/streaming/media_streaming_utility.h
|
||||
media/streaming/media_streaming_video_track.cpp
|
||||
media/streaming/media_streaming_video_track.h
|
||||
media/view/media_view_group_thumbs.cpp
|
||||
media/view/media_view_group_thumbs.h
|
||||
media/view/media_view_open_common.cpp
|
||||
media/view/media_view_open_common.h
|
||||
media/view/media_view_overlay_opengl.cpp
|
||||
media/view/media_view_overlay_opengl.h
|
||||
media/view/media_view_overlay_raster.cpp
|
||||
@@ -1266,7 +1321,6 @@ PRIVATE
|
||||
media/view/media_view_playback_controls.h
|
||||
media/view/media_view_playback_progress.cpp
|
||||
media/view/media_view_playback_progress.h
|
||||
media/view/media_view_open_common.h
|
||||
media/system_media_controls_manager.h
|
||||
media/system_media_controls_manager.cpp
|
||||
menu/menu_antispam_validator.cpp
|
||||
@@ -1454,8 +1508,6 @@ PRIVATE
|
||||
settings/business/settings_recipients_helper.h
|
||||
settings/business/settings_working_hours.cpp
|
||||
settings/business/settings_working_hours.h
|
||||
settings/cloud_password/settings_cloud_password_common.cpp
|
||||
settings/cloud_password/settings_cloud_password_common.h
|
||||
settings/cloud_password/settings_cloud_password_email.cpp
|
||||
settings/cloud_password/settings_cloud_password_email.h
|
||||
settings/cloud_password/settings_cloud_password_email_confirm.cpp
|
||||
@@ -1464,10 +1516,18 @@ PRIVATE
|
||||
settings/cloud_password/settings_cloud_password_hint.h
|
||||
settings/cloud_password/settings_cloud_password_input.cpp
|
||||
settings/cloud_password/settings_cloud_password_input.h
|
||||
settings/cloud_password/settings_cloud_password_login_email.cpp
|
||||
settings/cloud_password/settings_cloud_password_login_email.h
|
||||
settings/cloud_password/settings_cloud_password_login_email_confirm.cpp
|
||||
settings/cloud_password/settings_cloud_password_login_email_confirm.h
|
||||
settings/cloud_password/settings_cloud_password_manage.cpp
|
||||
settings/cloud_password/settings_cloud_password_manage.h
|
||||
settings/cloud_password/settings_cloud_password_start.cpp
|
||||
settings/cloud_password/settings_cloud_password_start.h
|
||||
settings/cloud_password/settings_cloud_password_step.cpp
|
||||
settings/cloud_password/settings_cloud_password_step.h
|
||||
settings/settings_active_sessions.cpp
|
||||
settings/settings_active_sessions.h
|
||||
settings/settings_advanced.cpp
|
||||
settings/settings_advanced.h
|
||||
settings/settings_blocked_peers.cpp
|
||||
@@ -1514,6 +1574,8 @@ PRIVATE
|
||||
settings/settings_privacy_security.h
|
||||
settings/settings_scale_preview.cpp
|
||||
settings/settings_scale_preview.h
|
||||
settings/settings_shortcuts.cpp
|
||||
settings/settings_shortcuts.h
|
||||
settings/settings_type.h
|
||||
settings/settings_websites.cpp
|
||||
settings/settings_websites.h
|
||||
@@ -1569,6 +1631,8 @@ PRIVATE
|
||||
support/support_preload.h
|
||||
support/support_templates.cpp
|
||||
support/support_templates.h
|
||||
tde2e/tde2e_integration.cpp
|
||||
tde2e/tde2e_integration.h
|
||||
ui/boxes/edit_invite_link_session.cpp
|
||||
ui/boxes/edit_invite_link_session.h
|
||||
ui/boxes/peer_qr_box.cpp
|
||||
@@ -1581,6 +1645,8 @@ PRIVATE
|
||||
ui/chat/choose_send_as.h
|
||||
ui/chat/choose_theme_controller.cpp
|
||||
ui/chat/choose_theme_controller.h
|
||||
ui/chat/sponsored_message_bar.cpp
|
||||
ui/chat/sponsored_message_bar.h
|
||||
ui/controls/emoji_button_factory.cpp
|
||||
ui/controls/emoji_button_factory.h
|
||||
ui/controls/location_picker.cpp
|
||||
@@ -1612,6 +1678,10 @@ PRIVATE
|
||||
ui/widgets/expandable_peer_list.h
|
||||
ui/widgets/label_with_custom_emoji.cpp
|
||||
ui/widgets/label_with_custom_emoji.h
|
||||
ui/widgets/chat_filters_tabs_strip.cpp
|
||||
ui/widgets/chat_filters_tabs_strip.h
|
||||
ui/widgets/peer_bubble.cpp
|
||||
ui/widgets/peer_bubble.h
|
||||
ui/countryinput.cpp
|
||||
ui/countryinput.h
|
||||
ui/dynamic_thumbnails.cpp
|
||||
@@ -1623,8 +1693,6 @@ PRIVATE
|
||||
ui/item_text_options.cpp
|
||||
ui/item_text_options.h
|
||||
ui/resize_area.h
|
||||
ui/search_field_controller.cpp
|
||||
ui/search_field_controller.h
|
||||
ui/unread_badge.cpp
|
||||
ui/unread_badge.h
|
||||
window/main_window.cpp
|
||||
@@ -1761,6 +1829,10 @@ if (WIN32)
|
||||
# COMMENT
|
||||
# $<IF:${release},"Appending compatibility manifest.","Finalizing build.">
|
||||
# )
|
||||
|
||||
if (QT_VERSION LESS 6)
|
||||
target_link_libraries(Telegram PRIVATE desktop-app::win_directx_helper)
|
||||
endif()
|
||||
elseif (APPLE)
|
||||
if (NOT DESKTOP_APP_USE_PACKAGED)
|
||||
target_link_libraries(Telegram PRIVATE desktop-app::external_iconv)
|
||||
@@ -1869,9 +1941,9 @@ if (build_macstore)
|
||||
)
|
||||
else()
|
||||
if (CMAKE_GENERATOR STREQUAL Xcode)
|
||||
set(bundle_identifier "com.tdesktop.Telegram$<$<CONFIG:Debug>:Debug>")
|
||||
set(bundle_identifier "one.ayugram.AyuGramDesktop$<$<CONFIG:Debug>:Debug>")
|
||||
else()
|
||||
set(bundle_identifier "com.tdesktop.Telegram")
|
||||
set(bundle_identifier "one.ayugram.AyuGramDesktop")
|
||||
endif()
|
||||
set(bundle_entitlements "Telegram.entitlements")
|
||||
if (LINUX AND DESKTOP_APP_USE_PACKAGED)
|
||||
@@ -1931,73 +2003,15 @@ endif()
|
||||
|
||||
set_target_properties(Telegram PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${output_folder})
|
||||
|
||||
if (WIN32 AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
|
||||
if (MSVC)
|
||||
target_link_libraries(Telegram
|
||||
PRIVATE
|
||||
delayimp
|
||||
)
|
||||
target_link_options(Telegram
|
||||
PRIVATE
|
||||
/DELAYLOAD:secur32.dll
|
||||
/DELAYLOAD:winmm.dll
|
||||
/DELAYLOAD:ws2_32.dll
|
||||
/DELAYLOAD:user32.dll
|
||||
/DELAYLOAD:gdi32.dll
|
||||
/DELAYLOAD:advapi32.dll
|
||||
/DELAYLOAD:shell32.dll
|
||||
/DELAYLOAD:ole32.dll
|
||||
/DELAYLOAD:oleaut32.dll
|
||||
/DELAYLOAD:shlwapi.dll
|
||||
/DELAYLOAD:iphlpapi.dll
|
||||
/DELAYLOAD:gdiplus.dll
|
||||
/DELAYLOAD:version.dll
|
||||
/DELAYLOAD:dwmapi.dll
|
||||
/DELAYLOAD:uxtheme.dll
|
||||
/DELAYLOAD:crypt32.dll
|
||||
/DELAYLOAD:bcrypt.dll
|
||||
/DELAYLOAD:netapi32.dll
|
||||
/DELAYLOAD:imm32.dll
|
||||
/DELAYLOAD:userenv.dll
|
||||
/DELAYLOAD:wtsapi32.dll
|
||||
/DELAYLOAD:propsys.dll
|
||||
)
|
||||
if (QT_VERSION GREATER 6)
|
||||
if (NOT build_winarm)
|
||||
target_link_options(Telegram PRIVATE
|
||||
/DELAYLOAD:API-MS-Win-EventLog-Legacy-l1-1-0.dll
|
||||
)
|
||||
endif()
|
||||
|
||||
target_link_options(Telegram
|
||||
PRIVATE
|
||||
/DELAYLOAD:API-MS-Win-Core-Console-l1-1-0.dll
|
||||
/DELAYLOAD:API-MS-Win-Core-Fibers-l2-1-0.dll
|
||||
/DELAYLOAD:API-MS-Win-Core-Fibers-l2-1-1.dll
|
||||
/DELAYLOAD:API-MS-Win-Core-File-l1-1-0.dll
|
||||
/DELAYLOAD:API-MS-Win-Core-LibraryLoader-l1-2-0.dll
|
||||
/DELAYLOAD:API-MS-Win-Core-Localization-l1-2-0.dll
|
||||
/DELAYLOAD:API-MS-Win-Core-Memory-l1-1-0.dll
|
||||
/DELAYLOAD:API-MS-Win-Core-Memory-l1-1-1.dll
|
||||
/DELAYLOAD:API-MS-Win-Core-ProcessThreads-l1-1-0.dll
|
||||
/DELAYLOAD:API-MS-Win-Core-Synch-l1-2-0.dll # Synchronization.lib
|
||||
/DELAYLOAD:API-MS-Win-Core-SysInfo-l1-1-0.dll
|
||||
/DELAYLOAD:API-MS-Win-Core-Timezone-l1-1-0.dll
|
||||
/DELAYLOAD:API-MS-Win-Core-WinRT-l1-1-0.dll
|
||||
/DELAYLOAD:API-MS-Win-Core-WinRT-Error-l1-1-0.dll
|
||||
/DELAYLOAD:API-MS-Win-Core-WinRT-String-l1-1-0.dll
|
||||
/DELAYLOAD:API-MS-Win-Security-CryptoAPI-l1-1-0.dll
|
||||
# /DELAYLOAD:API-MS-Win-Shcore-Scaling-l1-1-1.dll # We shadowed GetDpiForMonitor
|
||||
/DELAYLOAD:authz.dll # Authz.lib
|
||||
/DELAYLOAD:comdlg32.dll
|
||||
/DELAYLOAD:dwrite.dll # DWrite.lib
|
||||
/DELAYLOAD:dxgi.dll # DXGI.lib
|
||||
/DELAYLOAD:d3d9.dll # D3D9.lib
|
||||
/DELAYLOAD:d3d11.dll # D3D11.lib
|
||||
/DELAYLOAD:d3d12.dll # D3D12.lib
|
||||
/DELAYLOAD:setupapi.dll # SetupAPI.lib
|
||||
/DELAYLOAD:winhttp.dll
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
target_prepare_qrc(Telegram)
|
||||
@@ -2028,22 +2042,6 @@ if (NOT DESKTOP_APP_DISABLE_AUTOUPDATE AND NOT build_macstore AND NOT build_wins
|
||||
base/platform/win/base_windows_safe_library.h
|
||||
)
|
||||
target_include_directories(Updater PRIVATE ${lib_base_loc})
|
||||
if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
|
||||
target_link_libraries(Updater
|
||||
PRIVATE
|
||||
delayimp
|
||||
)
|
||||
target_link_options(Updater
|
||||
PRIVATE
|
||||
/DELAYLOAD:user32.dll
|
||||
/DELAYLOAD:advapi32.dll
|
||||
/DELAYLOAD:shell32.dll
|
||||
/DELAYLOAD:ole32.dll
|
||||
/DELAYLOAD:shlwapi.dll
|
||||
)
|
||||
else()
|
||||
target_link_options(Updater PRIVATE -municode)
|
||||
endif()
|
||||
elseif (APPLE)
|
||||
add_custom_command(TARGET Updater
|
||||
PRE_LINK
|
||||
@@ -2096,14 +2094,16 @@ if (LINUX AND DESKTOP_APP_USE_PACKAGED)
|
||||
configure_file("../lib/xdg/com.ayugram.desktop.metainfo.xml" "${CMAKE_CURRENT_BINARY_DIR}/com.ayugram.desktop.metainfo.xml" @ONLY)
|
||||
generate_appdata_changelog(Telegram "${CMAKE_SOURCE_DIR}/changelog.txt" "${CMAKE_CURRENT_BINARY_DIR}/com.ayugram.desktop.metainfo.xml")
|
||||
install(TARGETS Telegram RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" BUNDLE DESTINATION "${CMAKE_INSTALL_BINDIR}")
|
||||
install(FILES "Resources/art/icon16.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/16x16/apps" RENAME "ayugram.png")
|
||||
install(FILES "Resources/art/icon32.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/32x32/apps" RENAME "ayugram.png")
|
||||
install(FILES "Resources/art/icon48.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/48x48/apps" RENAME "ayugram.png")
|
||||
install(FILES "Resources/art/icon64.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/64x64/apps" RENAME "ayugram.png")
|
||||
install(FILES "Resources/art/icon128.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps" RENAME "ayugram.png")
|
||||
install(FILES "Resources/art/icon256.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps" RENAME "ayugram.png")
|
||||
install(FILES "Resources/art/icon512.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/512x512/apps" RENAME "ayugram.png")
|
||||
install(FILES "Resources/icons/tray_monochrome.svg" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/symbolic/apps" RENAME "ayugram-symbolic.svg")
|
||||
install(FILES "Resources/art/icon16.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/16x16/apps" RENAME "com.ayugram.desktop.png")
|
||||
install(FILES "Resources/art/icon32.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/32x32/apps" RENAME "com.ayugram.desktop.png")
|
||||
install(FILES "Resources/art/icon48.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/48x48/apps" RENAME "com.ayugram.desktop.png")
|
||||
install(FILES "Resources/art/icon64.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/64x64/apps" RENAME "com.ayugram.desktop.png")
|
||||
install(FILES "Resources/art/icon128.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps" RENAME "com.ayugram.desktop.png")
|
||||
install(FILES "Resources/art/icon256.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps" RENAME "com.ayugram.desktop.png")
|
||||
install(FILES "Resources/art/icon512.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/512x512/apps" RENAME "com.ayugram.desktop.png")
|
||||
install(FILES "Resources/icons/tray_monochrome.svg" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/symbolic/apps" RENAME "com.ayugram.desktop-symbolic.svg")
|
||||
install(FILES "Resources/icons/tray_monochrome_attention.svg" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/symbolic/apps" RENAME "com.ayugram.desktop-attention-symbolic.svg")
|
||||
install(FILES "Resources/icons/tray_monochrome_mute.svg" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/symbolic/apps" RENAME "com.ayugram.desktop-mute-symbolic.svg")
|
||||
install(FILES "../lib/xdg/com.ayugram.desktop.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications")
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/com.ayugram.desktop.service" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/dbus-1/services")
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/com.ayugram.desktop.metainfo.xml" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo")
|
||||
|
||||
|
After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 787 B |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 500 B |
@@ -1,6 +1,7 @@
|
||||
// This is a list of your own shortcuts for Telegram Desktop
|
||||
// You can see full list of commands in the 'shortcuts-default.json' file
|
||||
// Place a null value instead of a command string to switch the shortcut off
|
||||
// You can also edit them in Settings > Chat Settings > Keyboard Shortcuts.
|
||||
|
||||
[
|
||||
// {
|
||||
|
||||
|
After Width: | Height: | Size: 401 B |
|
After Width: | Height: | Size: 712 B |
|
After Width: | Height: | Size: 957 B |
|
After Width: | Height: | Size: 282 B |
|
After Width: | Height: | Size: 415 B |
|
After Width: | Height: | Size: 568 B |
|
After Width: | Height: | Size: 295 B |
|
After Width: | Height: | Size: 475 B |
|
After Width: | Height: | Size: 613 B |
|
Before Width: | Height: | Size: 312 B After Width: | Height: | Size: 312 B |
|
Before Width: | Height: | Size: 517 B After Width: | Height: | Size: 517 B |
|
Before Width: | Height: | Size: 754 B After Width: | Height: | Size: 754 B |
|
After Width: | Height: | Size: 506 B |
|
After Width: | Height: | Size: 882 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 327 B |
|
After Width: | Height: | Size: 462 B |
|
After Width: | Height: | Size: 564 B |
|
After Width: | Height: | Size: 721 B |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 529 B |
|
After Width: | Height: | Size: 956 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 679 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 621 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 663 B |
|
After Width: | Height: | Size: 761 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 311 B |
|
After Width: | Height: | Size: 578 B |
|
After Width: | Height: | Size: 829 B |
|
After Width: | Height: | Size: 655 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 820 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 586 B |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 699 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 718 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 505 B |
|
After Width: | Height: | Size: 763 B |