Compare commits

..
399 Commits
Author SHA1 Message Date
RMBGAME 2bc3cd1f42 Update source file Strings.resx 2023-07-22 15:05:21 +08:00
RMBGAME 372e36a467 New translations Strings.resx (English) 2023-07-22 13:07:21 +08:00
RMBGAME 7d5757f392 New translations Strings.resx (Chinese Traditional) 2023-07-22 13:07:20 +08:00
RMBGAME dac3acf7e2 New translations Strings.resx (Russian) 2023-07-22 13:07:20 +08:00
RMBGAME 552ec1e6cd New translations Strings.resx (Polish) 2023-07-22 13:07:18 +08:00
RMBGAME f26c4dc676 New translations Strings.resx (Korean) 2023-07-22 13:07:17 +08:00
RMBGAME 6e528fc2bc New translations Strings.resx (Japanese) 2023-07-22 13:07:16 +08:00
RMBGAME c76af865fa New translations Strings.resx (Italian) 2023-07-22 13:07:15 +08:00
RMBGAME 9ef44f5770 New translations Strings.resx (Spanish) 2023-07-22 13:07:14 +08:00
RMBGAME 222fdfdc5f Update source file Strings.resx 2023-07-21 16:00:07 +08:00
RMBGAME 7ab3c3ca4c New translations Strings.resx (English) 2023-07-21 14:30:08 +08:00
RMBGAME b60b380fb5 New translations Strings.resx (Chinese Traditional) 2023-07-21 14:30:07 +08:00
RMBGAME 7d153848d6 New translations Strings.resx (Russian) 2023-07-21 14:30:06 +08:00
RMBGAME 9afb711bb6 New translations Strings.resx (Polish) 2023-07-21 14:30:05 +08:00
RMBGAME 01b1bb3d9c New translations Strings.resx (Korean) 2023-07-21 14:30:04 +08:00
RMBGAME 9b8b4fa0a1 New translations Strings.resx (Japanese) 2023-07-21 14:30:02 +08:00
RMBGAME d0197c145a New translations Strings.resx (Italian) 2023-07-21 14:30:01 +08:00
RMBGAME 0a522d9bfa New translations Strings.resx (Spanish) 2023-07-21 14:30:00 +08:00
RMBGAME 86b0662860 Update source file Strings.resx 2023-07-20 22:42:52 +08:00
RMBGAME 66f3c56fbc New translations Strings.resx (English) 2023-07-20 20:15:16 +08:00
RMBGAME 300f317707 New translations Strings.resx (Chinese Traditional) 2023-07-20 20:15:15 +08:00
RMBGAME 40b69c1a5b New translations Strings.resx (Russian) 2023-07-20 20:15:14 +08:00
RMBGAME e726f39d07 New translations Strings.resx (Polish) 2023-07-20 20:15:13 +08:00
RMBGAME 2ad80d29d3 New translations Strings.resx (Korean) 2023-07-20 20:15:12 +08:00
RMBGAME dfa3d38e0e New translations Strings.resx (Japanese) 2023-07-20 20:15:11 +08:00
RMBGAME 170f3c6afb New translations Strings.resx (Italian) 2023-07-20 20:15:10 +08:00
RMBGAME b387261131 New translations Strings.resx (Spanish) 2023-07-20 20:15:09 +08:00
RMBGAME fba0d434ff Update source file Strings.resx 2023-07-20 20:15:03 +08:00
RMBGAME 2f694ba0a5 Update source file Strings.resx 2023-07-20 18:27:24 +08:00
RMBGAME 999a22c9eb New translations Strings.resx (English) 2023-07-20 16:37:41 +08:00
RMBGAME 47072a9a68 New translations Strings.resx (Chinese Traditional) 2023-07-20 16:37:39 +08:00
RMBGAME 61872118d1 New translations Strings.resx (Russian) 2023-07-20 16:37:38 +08:00
RMBGAME 22496f4b84 New translations Strings.resx (Polish) 2023-07-20 16:37:37 +08:00
RMBGAME 4ad283d469 New translations Strings.resx (Korean) 2023-07-20 16:37:36 +08:00
RMBGAME 1e30a84390 New translations Strings.resx (Japanese) 2023-07-20 16:37:35 +08:00
RMBGAME b6ea682bf7 New translations Strings.resx (Italian) 2023-07-20 16:37:34 +08:00
RMBGAME e01e7810e0 New translations Strings.resx (Spanish) 2023-07-20 16:37:33 +08:00
RMBGAME 40396be5d2 Update source file Strings.resx 2023-07-18 06:32:27 +08:00
RMBGAME b8ac484af3 New translations Strings.resx (English) 2023-07-18 04:16:59 +08:00
RMBGAME 20b879184a New translations Strings.resx (Chinese Traditional) 2023-07-18 04:16:57 +08:00
RMBGAME f1615987e5 New translations Strings.resx (Russian) 2023-07-18 04:16:56 +08:00
RMBGAME 30842217fc New translations Strings.resx (Polish) 2023-07-18 04:16:55 +08:00
RMBGAME 6ed452b16e New translations Strings.resx (Korean) 2023-07-18 04:16:54 +08:00
RMBGAME 16e06748e3 New translations Strings.resx (Japanese) 2023-07-18 04:16:53 +08:00
RMBGAME d823c0b7f5 New translations Strings.resx (Italian) 2023-07-18 04:16:52 +08:00
RMBGAME e5812a27db New translations Strings.resx (Spanish) 2023-07-18 04:16:51 +08:00
RMBGAME d4552f9390 Update source file Strings.resx 2023-07-18 04:16:44 +08:00
RMBGAME 49dc3d2c6d New translations Strings.resx (English) 2023-07-18 02:36:10 +08:00
RMBGAME 8b5586af8a New translations Strings.resx (Chinese Traditional) 2023-07-18 02:36:09 +08:00
RMBGAME 5a8ca8b6ab New translations Strings.resx (Russian) 2023-07-18 02:36:08 +08:00
RMBGAME 56a0ca744e New translations Strings.resx (Polish) 2023-07-18 02:36:07 +08:00
RMBGAME 62adb5501b New translations Strings.resx (Korean) 2023-07-18 02:36:05 +08:00
RMBGAME c03f3bd589 New translations Strings.resx (Japanese) 2023-07-18 02:36:03 +08:00
RMBGAME d38754634b New translations Strings.resx (Italian) 2023-07-18 02:36:02 +08:00
RMBGAME ca04226a3d New translations Strings.resx (Spanish) 2023-07-18 02:36:01 +08:00
RMBGAME c480afc668 Update source file Strings.resx 2023-07-17 00:37:32 +08:00
RMBGAME 021c490d26 New translations Strings.resx (English) 2023-07-16 21:20:26 +08:00
RMBGAME 1949f32d23 New translations Strings.resx (Chinese Traditional) 2023-07-16 21:20:25 +08:00
RMBGAME ee47b25884 New translations Strings.resx (Russian) 2023-07-16 21:20:24 +08:00
RMBGAME a85ef3da1d New translations Strings.resx (Polish) 2023-07-16 21:20:23 +08:00
RMBGAME b7dc54bfb3 New translations Strings.resx (Korean) 2023-07-16 21:20:22 +08:00
RMBGAME 8ad06b978d New translations Strings.resx (Japanese) 2023-07-16 21:20:21 +08:00
RMBGAME 31255c5ea2 New translations Strings.resx (Italian) 2023-07-16 21:20:20 +08:00
RMBGAME f874198014 New translations Strings.resx (Spanish) 2023-07-16 21:20:19 +08:00
RMBGAME 122251ebbd Update source file Strings.resx 2023-07-14 11:27:05 +08:00
RMBGAME eb09fe6a36 New translations Strings.resx (English) 2023-07-14 05:43:20 +08:00
RMBGAME 93646c5689 New translations Strings.resx (Chinese Traditional) 2023-07-14 05:43:19 +08:00
RMBGAME 4442eb02f6 New translations Strings.resx (Russian) 2023-07-14 05:43:18 +08:00
RMBGAME 020f00bee4 New translations Strings.resx (Polish) 2023-07-14 05:43:17 +08:00
RMBGAME 42a502c8f7 New translations Strings.resx (Korean) 2023-07-14 05:43:16 +08:00
RMBGAME ec15cca83f New translations Strings.resx (Japanese) 2023-07-14 05:43:15 +08:00
RMBGAME b38f29c84e New translations Strings.resx (Italian) 2023-07-14 05:43:14 +08:00
RMBGAME 2ed7c05179 New translations Strings.resx (Spanish) 2023-07-14 05:43:13 +08:00
RMBGAME fd4e094c7b Update source file Strings.resx 2023-07-12 11:46:49 +08:00
RMBGAME 6222d3f4f7 New translations Strings.resx (English) 2023-07-12 06:55:39 +08:00
RMBGAME 788acce558 New translations Strings.resx (Chinese Traditional) 2023-07-12 06:55:38 +08:00
RMBGAME 8115af0ef1 New translations Strings.resx (Russian) 2023-07-12 06:55:37 +08:00
RMBGAME c2ab63ffc6 New translations Strings.resx (Polish) 2023-07-12 06:55:36 +08:00
RMBGAME edd8cd01a5 New translations Strings.resx (Korean) 2023-07-12 06:55:35 +08:00
RMBGAME 26754953d1 New translations Strings.resx (Japanese) 2023-07-12 06:55:34 +08:00
RMBGAME 7f3678f54f New translations Strings.resx (Italian) 2023-07-12 06:55:33 +08:00
RMBGAME 96250f329e New translations Strings.resx (Spanish) 2023-07-12 06:55:32 +08:00
RMBGAME 08c30f3cb1 Update source file Strings.resx 2023-07-11 04:09:54 +08:00
RMBGAME a2a9b8bfe0 New translations Strings.resx (English) 2023-07-10 22:25:20 +08:00
RMBGAME 604e50593e New translations Strings.resx (Chinese Traditional) 2023-07-10 22:25:19 +08:00
RMBGAME dc161af309 New translations Strings.resx (Russian) 2023-07-10 22:25:18 +08:00
RMBGAME d539ca6afe New translations Strings.resx (Polish) 2023-07-10 22:25:17 +08:00
RMBGAME 2905190ccf New translations Strings.resx (Korean) 2023-07-10 22:25:15 +08:00
RMBGAME bdc262464f New translations Strings.resx (Japanese) 2023-07-10 22:25:14 +08:00
RMBGAME 70b0d8ce98 New translations Strings.resx (Italian) 2023-07-10 22:25:13 +08:00
RMBGAME 7de9bfed77 New translations Strings.resx (Spanish) 2023-07-10 22:25:11 +08:00
RMBGAME 96d5b5e910 Update source file Strings.resx 2023-07-10 22:25:01 +08:00
RMBGAME bd942b61e7 New translations Strings.resx (English) 2023-07-09 07:24:52 +08:00
RMBGAME 8c4b0eb53d New translations Strings.resx (Chinese Traditional) 2023-07-09 07:24:51 +08:00
RMBGAME 3de6201497 New translations Strings.resx (Russian) 2023-07-09 07:24:50 +08:00
RMBGAME 62d7a69689 New translations Strings.resx (Polish) 2023-07-09 07:24:49 +08:00
RMBGAME 9d4de85af0 New translations Strings.resx (Korean) 2023-07-09 07:24:48 +08:00
RMBGAME 47c1b12b87 New translations Strings.resx (Japanese) 2023-07-09 07:24:47 +08:00
RMBGAME 4e0c282491 New translations Strings.resx (Italian) 2023-07-09 07:24:46 +08:00
RMBGAME 47fddb086c New translations Strings.resx (Spanish) 2023-07-09 07:24:45 +08:00
RMBGAME fb828727c7 New translations Strings.resx (English) 2023-07-06 17:55:08 +08:00
RMBGAME 52a92754c0 New translations Strings.resx (Chinese Traditional) 2023-07-06 17:55:06 +08:00
RMBGAME 3c1e45135f New translations Strings.resx (Russian) 2023-07-06 17:55:05 +08:00
RMBGAME 58529a95ff New translations Strings.resx (Polish) 2023-07-06 17:55:04 +08:00
RMBGAME a1a84f6cf2 New translations Strings.resx (Korean) 2023-07-06 17:55:02 +08:00
RMBGAME 8a44faf446 New translations Strings.resx (Japanese) 2023-07-06 17:55:01 +08:00
RMBGAME bb8be872e4 New translations Strings.resx (Italian) 2023-07-06 17:55:00 +08:00
RMBGAME aa92952073 New translations Strings.resx (Spanish) 2023-07-06 17:54:59 +08:00
RMBGAME ab7c58e6a5 Update source file Strings.resx 2023-07-06 17:54:57 +08:00
RMBGAME 8d0e88f4b2 New translations Strings.resx (English) 2023-06-30 19:13:41 +08:00
RMBGAME 3598ac7359 New translations Strings.resx (Chinese Traditional) 2023-06-30 19:13:40 +08:00
RMBGAME 2b1438368c New translations Strings.resx (Russian) 2023-06-30 19:13:39 +08:00
RMBGAME ae6fe447a5 New translations Strings.resx (Polish) 2023-06-30 19:13:37 +08:00
RMBGAME 3a336785eb New translations Strings.resx (Korean) 2023-06-30 19:13:36 +08:00
RMBGAME 590b20964a New translations Strings.resx (Japanese) 2023-06-30 19:13:35 +08:00
RMBGAME 6bdb10c294 New translations Strings.resx (Italian) 2023-06-30 19:13:35 +08:00
RMBGAME bd4d78d882 New translations Strings.resx (Spanish) 2023-06-30 19:13:34 +08:00
RMBGAME a83b924516 Update source file Strings.resx 2023-06-30 19:13:32 +08:00
RMBGAME e33e390900 New translations Strings.resx (English) 2023-06-30 18:17:38 +08:00
RMBGAME e0cd71fdf4 New translations Strings.resx (Chinese Traditional) 2023-06-30 18:17:37 +08:00
RMBGAME 2967358e3e New translations Strings.resx (Russian) 2023-06-30 18:17:36 +08:00
RMBGAME 167a2caaa4 New translations Strings.resx (Polish) 2023-06-30 18:17:34 +08:00
RMBGAME 76182e9dea New translations Strings.resx (Korean) 2023-06-30 18:17:33 +08:00
RMBGAME de66753977 New translations Strings.resx (Japanese) 2023-06-30 18:17:32 +08:00
RMBGAME 75b929613d New translations Strings.resx (Italian) 2023-06-30 18:17:31 +08:00
RMBGAME b4d140e98f New translations Strings.resx (Spanish) 2023-06-30 18:17:30 +08:00
RMBGAME 10885ed1ac Update source file Strings.resx 2023-06-28 20:28:32 +08:00
RMBGAME 98f81cca30 New translations Strings.resx (English) 2023-06-28 00:28:48 +08:00
RMBGAME 414d124648 New translations Strings.resx (Chinese Traditional) 2023-06-28 00:28:46 +08:00
RMBGAME 8c6d447191 New translations Strings.resx (Russian) 2023-06-28 00:28:45 +08:00
RMBGAME 1ad3214988 New translations Strings.resx (Polish) 2023-06-28 00:28:44 +08:00
RMBGAME a7ddb74fcc New translations Strings.resx (Korean) 2023-06-28 00:28:43 +08:00
RMBGAME 4570b8e25d New translations Strings.resx (Japanese) 2023-06-28 00:28:42 +08:00
RMBGAME 307e24e4d2 New translations Strings.resx (Italian) 2023-06-28 00:28:41 +08:00
RMBGAME 0b5e558617 New translations Strings.resx (Spanish) 2023-06-28 00:28:40 +08:00
RMBGAME 0ee1101086 Update source file Strings.resx 2023-06-12 14:31:14 +08:00
RMBGAME f0943579ce New translations Strings.resx (English) 2023-06-12 11:57:15 +08:00
RMBGAME 2b6e12f974 New translations Strings.resx (Chinese Traditional) 2023-06-12 11:57:14 +08:00
RMBGAME 2d29d5c130 New translations Strings.resx (Russian) 2023-06-12 11:57:13 +08:00
RMBGAME 1fb2877710 New translations Strings.resx (Polish) 2023-06-12 11:57:12 +08:00
RMBGAME a17dd6ba66 New translations Strings.resx (Korean) 2023-06-12 11:57:11 +08:00
RMBGAME d3b65c5ddb New translations Strings.resx (Japanese) 2023-06-12 11:57:10 +08:00
RMBGAME 8eab41baf9 New translations Strings.resx (Italian) 2023-06-12 11:57:09 +08:00
RMBGAME 90f44d45e1 New translations Strings.resx (Spanish) 2023-06-12 11:57:08 +08:00
RMBGAME 0f594d545b Update source file Strings.resx 2023-05-23 17:33:44 +08:00
RMBGAME 7117f624db New translations Strings.resx (Polish) 2023-05-23 16:06:55 +08:00
RMBGAME 703874f24c New translations Strings.resx (Italian) 2023-05-23 16:06:54 +08:00
RMBGAME bf4cb78734 New translations Strings.resx (Spanish) 2023-05-23 16:06:53 +08:00
RMBGAME 5024274146 New translations Strings.resx (English) 2023-05-23 16:06:52 +08:00
RMBGAME 0489521dc4 New translations Strings.resx (Chinese Traditional) 2023-05-23 16:06:51 +08:00
RMBGAME 3abb0be33d New translations Strings.resx (Russian) 2023-05-23 16:06:50 +08:00
RMBGAME 6b27c6e361 New translations Strings.resx (Korean) 2023-05-23 16:06:49 +08:00
RMBGAME e7335ee5c9 New translations Strings.resx (Japanese) 2023-05-23 16:06:48 +08:00
RMBGAME 578b761622 New translations Strings.resx (Japanese) 2023-05-15 21:06:09 +08:00
RMBGAME e96a169d6f New translations Strings.resx (Polish) 2023-05-15 19:45:16 +08:00
RMBGAME a5241961d0 New translations Strings.resx (Italian) 2023-05-15 19:45:15 +08:00
RMBGAME 01c37691e6 New translations Strings.resx (Spanish) 2023-05-15 19:45:14 +08:00
RMBGAME 5879ab3d7b New translations Strings.resx (English) 2023-05-15 19:05:14 +08:00
RMBGAME 9fbb4d5dc1 New translations Strings.resx (Chinese Traditional) 2023-05-15 19:05:13 +08:00
RMBGAME d365662f4b New translations Strings.resx (Russian) 2023-05-15 19:05:12 +08:00
RMBGAME e4f3df62f0 New translations Strings.resx (Korean) 2023-05-15 19:05:10 +08:00
RMBGAME fc468a6673 New translations Strings.resx (Japanese) 2023-05-15 19:05:09 +08:00
RMBGAME 663595ceb7 New translations Strings.zh-Hant.resx (Chinese Traditional) 2023-05-15 18:47:23 +08:00
RMBGAME 6202625cf3 New translations Strings.zh-Hant.resx (Chinese Simplified) 2023-05-15 18:47:21 +08:00
RMBGAME 8e6abd090d New translations Strings.zh-Hant.resx (Russian) 2023-05-15 18:47:20 +08:00
RMBGAME 03409b9150 New translations Strings.ru.resx (Chinese Traditional) 2023-05-15 18:47:19 +08:00
RMBGAME 77815aca70 New translations Strings.ru.resx (Chinese Simplified) 2023-05-15 18:47:18 +08:00
RMBGAME 020f272417 New translations Strings.ru.resx (Russian) 2023-05-15 18:47:17 +08:00
RMBGAME df3adbd2ed New translations Strings.resx (Chinese Traditional) 2023-05-15 18:47:16 +08:00
RMBGAME b516f6671c New translations Strings.resx (Chinese Simplified) 2023-05-15 18:47:15 +08:00
RMBGAME 32de0fdbd6 New translations Strings.resx (Russian) 2023-05-15 18:47:14 +08:00
RMBGAME fd4fd6e409 New translations Strings.ko.resx (Chinese Traditional) 2023-05-15 18:47:13 +08:00
RMBGAME d9e539bb29 New translations Strings.ko.resx (Chinese Simplified) 2023-05-15 18:47:12 +08:00
RMBGAME 766ba10796 New translations Strings.ko.resx (Russian) 2023-05-15 18:47:11 +08:00
RMBGAME 0b024d74d5 New translations Strings.ja.resx (Chinese Traditional) 2023-05-15 18:47:10 +08:00
RMBGAME b9d5466c5f New translations Strings.ja.resx (Chinese Simplified) 2023-05-15 18:47:09 +08:00
RMBGAME e85c2cbcdd New translations Strings.ja.resx (Russian) 2023-05-15 18:47:07 +08:00
RMBGAME b249fc7930 New translations Strings.it.resx (Chinese Traditional) 2023-05-15 18:47:06 +08:00
RMBGAME 2558b2c04e New translations Strings.it.resx (Chinese Simplified) 2023-05-15 18:47:05 +08:00
RMBGAME 9db901f2b1 New translations Strings.it.resx (Russian) 2023-05-15 18:47:04 +08:00
RMBGAME 3dae0a837a New translations Strings.es.resx (Chinese Traditional) 2023-05-15 18:47:03 +08:00
RMBGAME 30d5bf51e0 New translations Strings.es.resx (Chinese Simplified) 2023-05-15 18:47:02 +08:00
RMBGAME 5a05e270c3 New translations Strings.es.resx (Russian) 2023-05-15 18:47:00 +08:00
RMBGAME 4d8eae2b13 New translations Strings.en.resx (Chinese Traditional) 2023-05-15 18:46:59 +08:00
RMBGAME 27a2d315eb New translations Strings.en.resx (Chinese Simplified) 2023-05-15 18:46:58 +08:00
RMBGAME a556f2f0d0 New translations Strings.en.resx (Russian) 2023-05-15 18:46:57 +08:00
RMBGAME b7897f14d4 New translations Strings.zh-Hant.resx (English) 2023-05-15 18:46:56 +08:00
RMBGAME f868669fce New translations Strings.zh-Hant.resx (Korean) 2023-05-15 18:46:55 +08:00
RMBGAME e9fdc10086 New translations Strings.zh-Hant.resx (Japanese) 2023-05-15 18:46:54 +08:00
RMBGAME df994a1fa3 New translations Strings.ru.resx (English) 2023-05-15 18:46:53 +08:00
RMBGAME 8ae20c7884 New translations Strings.ru.resx (Korean) 2023-05-15 18:46:51 +08:00
RMBGAME bd0c265ab5 New translations Strings.ru.resx (Japanese) 2023-05-15 18:46:50 +08:00
RMBGAME 8a84139f8a New translations Strings.resx (English) 2023-05-15 18:46:49 +08:00
RMBGAME 1ddcf89ac0 New translations Strings.resx (Korean) 2023-05-15 18:46:48 +08:00
RMBGAME a712be3e63 New translations Strings.resx (Japanese) 2023-05-15 18:46:47 +08:00
RMBGAME 839837b895 New translations Strings.ko.resx (English) 2023-05-15 18:46:46 +08:00
RMBGAME d99eeb6b1b New translations Strings.ko.resx (Korean) 2023-05-15 18:46:45 +08:00
RMBGAME 8f99b38021 New translations Strings.ko.resx (Japanese) 2023-05-15 18:46:44 +08:00
RMBGAME b79f9c97cf New translations Strings.ja.resx (English) 2023-05-15 18:46:42 +08:00
RMBGAME 4b7283604c New translations Strings.ja.resx (Korean) 2023-05-15 18:46:41 +08:00
RMBGAME b144c50765 New translations Strings.ja.resx (Japanese) 2023-05-15 18:46:40 +08:00
RMBGAME ca6ec9feee New translations Strings.it.resx (English) 2023-05-15 18:46:39 +08:00
RMBGAME f5e4a6b339 New translations Strings.it.resx (Korean) 2023-05-15 18:46:38 +08:00
RMBGAME 31337c0b22 New translations Strings.it.resx (Japanese) 2023-05-15 18:46:36 +08:00
RMBGAME 25056c7bf1 New translations Strings.es.resx (English) 2023-05-15 18:46:35 +08:00
RMBGAME 0c6cdd7c68 New translations Strings.es.resx (Korean) 2023-05-15 18:46:34 +08:00
RMBGAME 78a6dde32f New translations Strings.es.resx (Japanese) 2023-05-15 18:46:33 +08:00
RMBGAME f682c1c29d New translations Strings.en.resx (English) 2023-05-15 18:46:32 +08:00
RMBGAME fd186b22c0 New translations Strings.en.resx (Korean) 2023-05-15 18:46:30 +08:00
RMBGAME 567076ca3a New translations Strings.en.resx (Japanese) 2023-05-15 18:46:28 +08:00
RMBGAME e402607580 Update source file Strings.ko.resx 2023-05-15 18:46:25 +08:00
RMBGAME 9397e930df Update source file Strings.ja.resx 2023-05-15 18:46:24 +08:00
RMBGAME fa0d9132c1 Update source file Strings.en.resx 2023-05-15 18:46:23 +08:00
RMBGAME e41dd2ae1d New translations Strings.zh-Hant.resx (English) 2023-05-15 18:38:53 +08:00
RMBGAME 727ba47832 New translations Strings.zh-Hant.resx (Korean) 2023-05-15 18:38:52 +08:00
RMBGAME 884354af45 New translations Strings.zh-Hant.resx (Japanese) 2023-05-15 18:38:51 +08:00
RMBGAME e5a3156903 New translations Strings.ru.resx (English) 2023-05-15 18:38:49 +08:00
RMBGAME 12d3247303 New translations Strings.ru.resx (Korean) 2023-05-15 18:38:48 +08:00
RMBGAME c15f6089f6 New translations Strings.ru.resx (Japanese) 2023-05-15 18:38:47 +08:00
RMBGAME 4afd7b01a3 New translations Strings.resx (English) 2023-05-15 18:38:46 +08:00
RMBGAME c5f07b25e2 New translations Strings.resx (Korean) 2023-05-15 18:38:45 +08:00
RMBGAME aad4338bdc New translations Strings.resx (Japanese) 2023-05-15 18:38:44 +08:00
RMBGAME 495fa56e8a New translations Strings.ko.resx (English) 2023-05-15 18:38:43 +08:00
RMBGAME e4ba79ba86 New translations Strings.ko.resx (Korean) 2023-05-15 18:38:41 +08:00
RMBGAME 2ee53333de New translations Strings.ko.resx (Japanese) 2023-05-15 18:38:40 +08:00
RMBGAME ca6d4a30b9 New translations Strings.ja.resx (English) 2023-05-15 18:38:39 +08:00
RMBGAME 1d024c2039 New translations Strings.ja.resx (Korean) 2023-05-15 18:38:38 +08:00
RMBGAME 82ce45547d New translations Strings.ja.resx (Japanese) 2023-05-15 18:38:37 +08:00
RMBGAME 4cdd0e54eb New translations Strings.it.resx (English) 2023-05-15 18:38:36 +08:00
RMBGAME 7f63e71dc7 New translations Strings.it.resx (Korean) 2023-05-15 18:38:35 +08:00
RMBGAME 831ae9ed83 New translations Strings.it.resx (Japanese) 2023-05-15 18:38:34 +08:00
RMBGAME a2b342dc24 New translations Strings.es.resx (English) 2023-05-15 18:38:33 +08:00
RMBGAME b45b054aa4 New translations Strings.es.resx (Korean) 2023-05-15 18:38:32 +08:00
RMBGAME c05095a53f New translations Strings.es.resx (Japanese) 2023-05-15 18:38:31 +08:00
RMBGAME 4ba06541b3 New translations Strings.en.resx (English) 2023-05-15 18:38:29 +08:00
RMBGAME 001b7eb3df New translations Strings.en.resx (Korean) 2023-05-15 18:38:28 +08:00
RMBGAME 8808d7c489 New translations Strings.en.resx (Japanese) 2023-05-15 18:38:27 +08:00
RMBGAME 76c66e0a2a 🔨 MenuTabItemViewModel 2023-05-15 18:29:08 +08:00
RMBGAME 41c1a970ec 🚧 Plugin UI Load 2023-05-13 21:49:27 +08:00
RMBGAME 9041ecc017 🚧 MenuTabItemViewModel 2023-05-13 20:44:25 +08:00
Aigio Liu c01b7aadc6 🚧 设置配置项 V4 2023-05-12 18:50:36 +08:00
RMBGAME 55f2a75ee0 🚧 MenuViewModel Editing 2023-05-11 19:23:35 +08:00
Aigio Liu 86ce6c619f ⬆️ Update Common 2023-05-11 17:11:03 +08:00
Aigio Liu 3dbcb989fa 🚧 Misc 2023-05-11 16:48:16 +08:00
RMBGAME 42f95c8f1f 🐛 RunTasks 2023-05-10 20:02:31 +08:00
Aigio Liu 98504351cd 🎨 Misc 2023-05-10 19:13:14 +08:00
Aigio Liu 9c109b86bf 🎨 Misc 2023-05-10 19:12:47 +08:00
Aigio Liu dde18917f9 🚧 IPC 2023-05-10 19:10:54 +08:00
Aigio Liu 5d9194dc53 🚧 Startup 2023-05-10 16:01:30 +08:00
RMBGAME 7bcdceb695 vdf submodule 2023-05-09 22:05:28 +08:00
RMBGAME 21e98dbdd2 💄 SplashScreen 2023-05-09 19:19:01 +08:00
Aigio Liu 83bb4b62a2 🚧 IPC 2023-05-08 19:29:27 +08:00
Aigio Liu 4bb2fb3665 🚧 IPC 2023-05-08 17:02:36 +08:00
Aigio Liu 73092de928 🚧 IPC 2023-05-08 14:18:01 +08:00
RMBGAME 2195e3a26d 💄 UserItem 2023-05-07 22:15:38 +08:00
RMBGAME 18fd04fbc6 💄Misc 2023-05-07 03:06:23 +08:00
RMBGAME 16ca96c10c ✨ Snackbar 2023-05-07 02:49:37 +08:00
RMBGAME 9b9ddf82f3 🚧 SnackbarManager 2023-05-06 19:26:32 +08:00
Aigio Liu 1bf7aed58e 🚧 Update AppResources 2023-05-06 18:24:34 +08:00
Aigio Liu 2aa8fe9352 🚧 IPC 2023-05-06 16:47:38 +08:00
Aigio Liu cb6e4f3a4f 🚧 Update Common & fix Converters 2023-05-06 11:59:44 +08:00
RMBGAME 11a15d0371 🚧 Misc 2023-05-05 21:09:15 +08:00
RMBGAME a4f4e39248 🚧 Misc 2023-05-05 18:22:08 +08:00
RMBGAME f28fccccae 🚧 Fix 2023-05-05 18:19:23 +08:00
RMBGAME 6698551c9a 🚧 New Toast Impl 2023-05-05 18:18:05 +08:00
Aigio Liu 9883a420e1 🚑 fix DesignMode 2023-05-05 15:51:59 +08:00
Aigio Liu cd60860975 ⬆️ WTTS SDK 1.23.10505.11504 2023-05-05 15:13:33 +08:00
RMBGAME 1b3e9080d8 👌Misc 2023-05-04 23:11:17 +08:00
RMBGAME 3bea1224aa 🚸 TaskDialog Complete 2023-05-04 22:31:29 +08:00
RMBGAME 5b7790b825 ✨ IWindowManager TaskDialog Impl 2023-05-04 16:44:24 +08:00
RMBGAME cb27211d56 ⬆️ Avalonia 11.0.999-cibuild0034035-beta 2023-05-02 20:58:19 +08:00
RMBGAME 3af7df38fb 👽 Misc 2023-04-27 18:29:24 +08:00
RMBGAME 62745f56df 💄 About 2023-04-27 02:41:20 +08:00
RMBGAME a083b2b8e7 ⬆️ Avalonia 11.0.0-preview7 2023-04-26 05:49:17 +08:00
RMBGAME ba1c56ae9c 💄 ProgressBar 2023-04-26 01:59:11 +08:00
RMBGAME cdc68739ab 🚧 Settings 2023-04-26 01:28:50 +08:00
RMBGAME 78cdf77b56 🚧 Misc 2023-04-24 18:35:31 +08:00
RMBGAME bdcb89a3ed 🚧 Misc 2023-04-24 18:30:58 +08:00
RMBGAME f7ca4b9832 💄 Snackbar 2023-04-24 14:31:02 +08:00
RMBGAME af91991709 💄 设置界面 2023-04-23 20:44:53 +08:00
RMBGAME b0aaeb12f8 💄 Settings_UI 2023-04-21 22:07:10 +08:00
RMBGAME 2976697f5c Merge branch 'v3.x' of https://github.com/BeyondDimension/SteamTools into v3.x 2023-04-20 19:25:11 +08:00
RMBGAME 0bbe11b55f 💄 Icons 2023-04-20 19:25:02 +08:00
Aigio Liu 6cb6122389 📝 Add Job 2023-04-18 13:30:43 +08:00
RMBGAME 7b97821a19 💄 ContentWindow Style 2023-04-17 19:16:12 +08:00
RMBGAME 69f81c72da Merge branch 'v3.x' of https://github.com/BeyondDimension/SteamTools into v3.x 2023-04-13 19:07:11 +08:00
RMBGAME be2ae6e046 💄 UI进度更新 2023-04-13 19:06:54 +08:00
Aigio Liu 73146bfcaa IPC Misc 2023-04-13 18:14:33 +08:00
RMBGAME 330119559d Misc 2023-04-11 19:09:01 +08:00
RMBGAME c58d8b059f 💄 Style 2023-04-07 19:08:17 +08:00
RMBGAME 48e8fcf5ad 💄 ToggleSwitch Style 2023-04-03 18:46:26 +08:00
RMBGAME c09db1761a 🚚 Settings 2023-04-03 18:35:41 +08:00
RMBGAME 278a5e70f3 💄Settings UI 2023-04-02 16:26:32 +08:00
RMBGAME 9351644c7e 💄UI 2023-03-31 19:46:35 +08:00
RMBGAME e26bb62c39 💄 style 2023-03-30 19:22:45 +08:00
RMBGAME 53389cf92c 💄 UI Style 2023-03-29 23:12:15 +08:00
RMBGAME 46eeceb1ab Misc 2023-03-29 16:42:59 +08:00
Aigio Liu 12531816c2 ⬆️ SDK 1.23.10329.11627 2023-03-29 16:42:29 +08:00
Aigio Liu e479218109 🚧 IPC & Client 移除 Avalonia 引用 & 修正 BD.WTTS.Client.Avalonia.App 被 git 忽略 & 服务实现文件夹分类 & Dns 服务移入加速子进程模块 2023-03-29 15:19:01 +08:00
Aigio Liu feec9e8b5c ⬆️ SDK 1.23.10329.11240 (XmlnsDefinition) & IPC Misc 2023-03-29 13:04:26 +08:00
Aigio Liu 5022f7e847 🚧 IPCService 2023-03-28 17:05:37 +08:00
Aigio Liu 93f8f36f43 ⬆️ Common 1.23.10328.11051 2023-03-28 16:28:50 +08:00
RMBGAME f2b9abda0b 💄 UI 2023-03-27 19:52:29 +08:00
RMBGAME 5ac3d76a92 💄UI 2023-03-27 00:57:26 +08:00
RMBGAME 748cf3aa91 💄 UI 2023-03-27 00:56:47 +08:00
RMBGAME 24c4136bd3 settings 2023-03-24 18:11:34 +08:00
Aigio Liu fa8f14712c fix DesignMode 2023-03-24 17:47:09 +08:00
Aigio Liu 52a9d6da9c IPC & update issue templates & CI 2023-03-24 11:41:22 +08:00
RMBGAME 4a4782cc0c Merge branch 'v3.x' of https://github.com/BeyondDimension/SteamTools into v3.x 2023-03-23 18:35:34 +08:00
RMBGAME 8ecd467e4a Misc 2023-03-23 18:16:18 +08:00
Aigio Liu f05184acc9 fix Mac Font Use PingFang 2023-03-23 13:45:55 +08:00
Aigio Liu 826620c130 Misc 2023-03-23 13:10:45 +08:00
RMBGAME 1ed0df7ecb Misc 2023-03-23 12:02:38 +08:00
Aigio Liu d8988ad4ab Misc 2023-03-22 16:05:49 +08:00
Aigio Liu f6056bf4e9 Misc 2023-03-22 13:40:55 +08:00
Aigio Liu eb68cd60ad Update ApplicationId 2023-03-22 11:39:51 +08:00
Aigio Liu 2518129bc8 fix 2023-03-22 11:27:49 +08:00
Aigio Liu 0063caad95 AvaloniaFilePickerPlatformService use StorageProvider 2023-03-22 10:57:17 +08:00
Aigio Liu eec2f16c5c Update ClassicDesktopStyleApplicationLifetime2 2023-03-22 10:15:06 +08:00
Aigio Liu 094e54d311 fix CommandLineHost 2023-03-22 09:55:49 +08:00
Aigio Liu e11deb188e fix 2023-03-22 09:49:43 +08:00
Aigio Liu 1415816527 Misc 2023-03-22 00:15:10 +08:00
Aigio Liu d8c4fec3ad Misc 2023-03-22 00:15:10 +08:00
RMBGAME 2404f73eb3 packages 2023-03-21 17:36:50 +08:00
RMBGAME 285f777969 Merge branch 'v3.x' of https://github.com/BeyondDimension/SteamTools into v3.x 2023-03-21 17:23:21 +08:00
RMBGAME fa9115c359 CI 31947 2023-03-21 17:23:04 +08:00
Aigio Liu e836c54ab9 macOS TFM 2023-03-21 17:19:24 +08:00
RMBGAME d582442f2e Merge branch 'v3.x' of https://github.com/BeyondDimension/SteamTools into v3.x 2023-03-21 14:45:07 +08:00
RMBGAME 8ad4a195c3 pubxml 2023-03-21 14:39:03 +08:00
Aigio Liu c081ab18c0 Misc 2023-03-21 14:36:09 +08:00
RMBGAME 5da595cda2 Misc 2023-03-21 14:32:49 +08:00
RMBGAME 2cf11fe6e7 Misc 2023-03-21 14:32:45 +08:00
RMBGAME 08bb38509b Misc 2023-03-21 02:14:11 +08:00
RMBGAME 7d2884824d CustomWindow 2023-03-21 02:10:35 +08:00
RMBGAME 33b9895810 CustomWindow 2023-03-21 02:09:17 +08:00
Aigio Liu a9caf4ad81 Misc 2023-03-20 20:18:07 +08:00
Aigio Liu f5500a8a70 fix 2023-03-20 18:47:40 +08:00
Aigio Liu 9454483d0d Misc 2023-03-20 18:39:56 +08:00
Aigio Liu 3d52bdc752 fix hostfxr filename 2023-03-20 18:19:33 +08:00
Aigio Liu 66b4ce6c63 Misc 2023-03-20 17:43:50 +08:00
Aigio Liu 90e5c36b92 Misc 2023-03-20 16:41:04 +08:00
Aigio Liu 8e2bfae213 add build sh 2023-03-20 16:40:40 +08:00
Aigio Liu eb53d369ff Async Rename 2023-03-20 14:52:58 +08:00
Aigio Liu c0f2f1f1cf Misc 2023-03-20 11:11:53 +08:00
Aigio Liu 66b3077bae add pubxml 2023-03-20 11:10:55 +08:00
Aigio Liu ef7bfa965f Misc 2023-03-19 19:08:15 +08:00
Aigio Liu 23ac963542 Update Linux Font List 2023-03-18 02:20:46 +08:00
Aigio Liu 309734dfb8 改进字体实现 2023-03-18 02:07:17 +08:00
Aigio Liu 2b0dc3c0ae fix for Linux 2023-03-18 01:22:50 +08:00
RMBGAME 870576ecd6 Style 2023-03-17 23:41:19 +08:00
RMBGAME 21adcba44a control 2023-03-17 23:13:26 +08:00
RMBGAME ee150aa087 Window 2023-03-17 23:11:27 +08:00
Aigio Liu c8562621bf 修复启动后 UI 卡顿 & 改进 GlobalDllImportResolver.MoveFiles 执行时机 2023-03-16 19:27:50 +08:00
Aigio Liu 7a1850cc30 改进 UsePlatformDetect2 2023-03-16 18:40:44 +08:00
Aigio Liu 6e9e99248b Misc 2023-03-16 17:29:33 +08:00
rmbagme 68dbbaa017 Merge branch 'v3.x' of https://github.com/BeyondDimension/SteamTools into v3.x 2023-03-15 18:45:23 +08:00
rmbagme 1bd9ac34e2 MainView 2023-03-15 18:45:00 +08:00
Aigio Liu 11cb0030d1 CertificateUnitTest 2023-03-13 14:38:59 +08:00
Aigio Liu 8f2c293f74 证书生成改用 BCL 库中函数,删除包 BouncyCastle 依赖 & IPC Misc 2023-03-13 12:37:20 +08:00
rmbagme a761e56758 UI 2023-03-10 19:12:58 +08:00
rmbagme 6c8069eac4 avalonia ui 2023-03-10 18:50:43 +08:00
Aigio Liu 721fb03d4e Misc 2023-03-10 00:50:18 +08:00
Aigio Liu 093f788dd0 Misc 2023-03-09 15:46:44 +08:00
Aigio Liu 491d14cc64 Misc 2023-03-09 15:35:58 +08:00
Aigio Liu 4444f8a840 Misc 2023-03-08 02:03:35 +08:00
Aigio Liu 035da83842 Misc 2023-03-06 16:47:08 +08:00
Aigio Liu 19e0f716f5 Misc 2023-03-06 16:45:50 +08:00
Aigio Liu 9e12ba5510 Misc 2023-03-06 12:05:02 +08:00
Aigio Liu e3383c544c Misc 2023-03-06 12:05:02 +08:00
rmbagme 591b4c191e Misc 2023-03-04 14:15:16 +08:00
rmbagme db227cd2d2 avalonia 11.0.999-cibuild0030643-beta 2023-03-02 18:42:08 +08:00
rmbagme afd351982d avalonia 11.0.0-preview5 2023-03-02 17:33:42 +08:00
Aigio Liu 5418f926b8 finish apphost 2023-02-28 14:25:21 +08:00
Aigio Liu 81f1824902 dotnetfx AppHost 2023-02-28 02:07:42 +08:00
Aigio Liu 303a9cefd5 Misc 2023-02-27 22:11:59 +08:00
Aigio Liu 46afcae0e8 Misc 2023-02-27 10:31:30 +08:00
Aigio Liu d5aaa8ebdc Misc 2023-02-24 17:49:17 +08:00
Aigio Liu 17f8c870ad Misc 2023-02-24 13:36:44 +08:00
Aigio Liu 475e33d290 Misc 2023-02-24 12:45:48 +08:00
Aigio Liu 549402c7d8 Misc 2023-02-23 15:44:39 +08:00
Aigio Liu 2e50491da7 Misc 2023-02-22 18:03:11 +08:00
Aigio Liu 0205bfd3c8 Misc 2023-02-22 16:16:11 +08:00
Aigio Liu a329ec7010 Misc 2023-02-21 20:18:54 +08:00
Aigio Liu e754f71a9a Misc 2023-02-21 14:02:45 +08:00
Aigio Liu 1eba2a725d Misc 2023-02-20 18:35:21 +08:00
Aigio Liu b42329cf76 Misc 2023-02-17 22:47:56 +08:00
Aigio Liu 8fc9c530ed Misc 2023-02-17 15:35:20 +08:00
Aigio Liu 3e4c9de1c2 Misc 2023-02-17 15:09:59 +08:00
RMBGAME 9fc6e9f1a8 Update AssemblyInfo.Xaml.cs 2023-02-16 17:16:44 +08:00
RMBGAME 229f59fb72 XmlnsDefinition 2023-02-16 17:15:37 +08:00
Aigio Liu 931d5654d6 Misc 2023-02-15 23:21:35 +08:00
Aigio Liu 0a328229b1 Misc 2023-02-14 20:07:29 +08:00
Aigio Liu 10886a62ac Misc 2023-02-14 00:21:25 +08:00
Aigio Liu aa5963b8e8 Misc 2023-02-11 20:55:16 +08:00
Aigio Liu 326648c1f5 Misc 2023-02-10 21:27:40 +08:00
Aigio Liu 8871efc2b7 Misc 2023-02-10 11:24:25 +08:00
Aigio Liu e5c5b9016d add submodules 2023-02-10 10:32:49 +08:00
Aigio Liu 070e3a5aa1 Update job list 2023-02-09 17:37:50 +08:00
Aigio Liu 2eea9f6419 Initial structure 2023-02-09 11:47:16 +08:00
2757 changed files with 74362 additions and 261991 deletions
-242
View File
@@ -1,242 +0,0 @@
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
# Matches multiple files with brace expansion notation
# Set default charset
[*]
charset = utf-8
# Tab indentation (no size specified)
[Makefile]
indent_style = tab
[*.{js,json,xaml,axaml}]
indent_style = space
indent_size = 2
# c# 文件
[*.cs]
#### Core EditorConfig 选项 ####
# 缩进和间距
indent_size = 4
indent_style = space
tab_width = 4
# 新行首选项
end_of_line = crlf
insert_final_newline = false
#### .NET 编码约定 ####
# 组织 Using
dotnet_separate_import_directive_groups = false
dotnet_sort_system_directives_first = false
file_header_template = unset
# this. 和 Me. 首选项
dotnet_style_qualification_for_event = false:suggestion
dotnet_style_qualification_for_field = false
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
# 语言关键字与 bcl 类型首选项
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
# 括号首选项
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_operators = never_if_unnecessary
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
# 修饰符首选项
dotnet_style_require_accessibility_modifiers = never
# 表达式级首选项
dotnet_style_coalesce_expression = true
dotnet_style_collection_initializer = true
dotnet_style_explicit_tuple_names = true
dotnet_style_null_propagation = true
dotnet_style_object_initializer = true
dotnet_style_operator_placement_when_wrapping = beginning_of_line
dotnet_style_prefer_auto_properties = true
dotnet_style_prefer_compound_assignment = true
dotnet_style_prefer_conditional_expression_over_assignment = true
dotnet_style_prefer_conditional_expression_over_return = true
dotnet_style_prefer_inferred_anonymous_type_member_names = true
dotnet_style_prefer_inferred_tuple_names = true
dotnet_style_prefer_is_null_check_over_reference_equality_method = true
dotnet_style_prefer_simplified_boolean_expressions = true
dotnet_style_prefer_simplified_interpolation = true
# 字段首选项
dotnet_style_readonly_field = true
# 参数首选项
dotnet_code_quality_unused_parameters = all
# 禁止显示首选项
dotnet_remove_unnecessary_suppression_exclusions = none
#### c# 编码约定 ####
# var 首选项
csharp_style_var_elsewhere = true
csharp_style_var_for_built_in_types = true
csharp_style_var_when_type_is_apparent = true
# Expression-bodied 成员
csharp_style_expression_bodied_accessors = true
csharp_style_expression_bodied_constructors = false
csharp_style_expression_bodied_indexers = true
csharp_style_expression_bodied_lambdas = true
csharp_style_expression_bodied_local_functions = false
csharp_style_expression_bodied_methods = false
csharp_style_expression_bodied_operators = false
csharp_style_expression_bodied_properties = true
# 模式匹配首选项
csharp_style_pattern_matching_over_as_with_null_check = true
csharp_style_pattern_matching_over_is_with_cast_check = true
csharp_style_prefer_not_pattern = true
csharp_style_prefer_pattern_matching = true
csharp_style_prefer_switch_expression = true
# Null 检查首选项
csharp_style_conditional_delegate_call = true
# 修饰符首选项
csharp_prefer_static_local_function = true
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async
# 代码块首选项
csharp_prefer_braces = false
csharp_prefer_simple_using_statement = true
# 表达式级首选项
csharp_prefer_simple_default_expression = true
csharp_style_deconstructed_variable_declaration = true
csharp_style_implicit_object_creation_when_type_is_apparent = true
csharp_style_inlined_variable_declaration = true
csharp_style_pattern_local_over_anonymous_function = true
csharp_style_prefer_index_operator = true
csharp_style_prefer_range_operator = true
csharp_style_throw_expression = true
csharp_style_unused_value_assignment_preference = discard_variable
csharp_style_unused_value_expression_statement_preference = discard_variable
# "using" 指令首选项
csharp_using_directive_placement = outside_namespace
#### C# 格式规则 ####
# 新行首选项
csharp_new_line_before_catch = true
csharp_new_line_before_else = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_open_brace = all
csharp_new_line_between_query_expression_clauses = true
# 缩进首选项
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_case_contents_when_block = true
csharp_indent_labels = one_less_than_current
csharp_indent_switch_labels = true
# 空格键首选项
csharp_space_after_cast = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false
csharp_space_before_dot = false
csharp_space_before_open_square_brackets = false
csharp_space_before_semicolon_in_for_statement = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_between_square_brackets = false
# 包装首选项
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = true
#### 命名样式 ####
# 命名规则
dotnet_naming_rule.interface_should_be_以_i_开始.severity = suggestion
dotnet_naming_rule.interface_should_be_以_i_开始.symbols = interface
dotnet_naming_rule.interface_should_be_以_i_开始.style = 以_i_开始
dotnet_naming_rule.类型_should_be_帕斯卡拼写法.severity = suggestion
dotnet_naming_rule.类型_should_be_帕斯卡拼写法.symbols = 类型
dotnet_naming_rule.类型_should_be_帕斯卡拼写法.style = 帕斯卡拼写法
dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.severity = suggestion
dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.symbols = 非字段成员
dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.style = 帕斯卡拼写法
# 符号规范
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =
dotnet_naming_symbols.类型.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.类型.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.类型.required_modifiers =
dotnet_naming_symbols.非字段成员.applicable_kinds = property, event, method
dotnet_naming_symbols.非字段成员.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.非字段成员.required_modifiers =
# 命名样式
dotnet_naming_style.帕斯卡拼写法.required_prefix =
dotnet_naming_style.帕斯卡拼写法.required_suffix =
dotnet_naming_style.帕斯卡拼写法.word_separator =
dotnet_naming_style.帕斯卡拼写法.capitalization = pascal_case
dotnet_naming_style.以_i_开始.required_prefix = I
dotnet_naming_style.以_i_开始.required_suffix =
dotnet_naming_style.以_i_开始.word_separator =
dotnet_naming_style.以_i_开始.capitalization = pascal_case
# IDE0010: 添加缺失的事例
dotnet_diagnostic.IDE0010.severity = none
# IDE0011: 添加大括号
dotnet_diagnostic.IDE0011.severity = none
# IDE0040: 添加可访问性修饰符
dotnet_diagnostic.IDE0040.severity = none
# IDE0130: 命名空间与文件夹结构不匹配
dotnet_style_namespace_match_folder = false
# IDE0130: 命名空间与文件夹结构不匹配
dotnet_diagnostic.IDE0130.severity = none
-63
View File
@@ -1,63 +0,0 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
+65
View File
@@ -0,0 +1,65 @@
---
name: "(English)Bug Report \U0001F41B"
about: Create a report to help us improve
title: "\U0001F41B[BUG] Please enter a title"
labels: bug
assignees: ''
---
## Please check each item in the following list carefully
- [ ] I have searched and found no similar issues
- [ ] Have searched the documentation and found no relevant content
- [ ] I have tried to use the latest version, but the problem still exists
- [ ] The official version is used (no replacement and modification of the installation directory program files)
<!--
Before posting, try searching Issues to see if your issue has already been raised.
Describe the bug in detail so that everyone can understand it, please be sure that what you are posting is a bug, if you are not sure, please post a Question
Don't forget to fill in the title, which should be a short description of the problem
-->
### 🐛 Description
<!--
Describe the problem in detail
-->
### 📷 Steps to Reproduce
<!--
Clearly describe the reproduction steps so that others can see the problem
Ensure that the above steps are 100% reproducible on most devices, if possible, to pinpoint the cause of the problem
-->
1.
2.
3.
### 📄 Log Information
<!--
```
- Path to the folder where the log files are located
- Microsoft Store ```%USERPROFILE%\AppData\Local\Packages\4651ED44255E.47979655102CE_k6txddmbb6c52\LocalCache\Logs```
- Windows ```\Logs``` or ```%Tmp%\Steam++\Logs```
- macOS ```~/Library/Caches/Steam++/Logs```
- Linux ```$XDG_CACHE_HOME/Steam++/Logs``` or ```$HOME/.cache/Steam++/Logs```
- Android ```/data/data/net.steampp.app/cache/Logs```
Your log content
```
-->
### 🖼 Screenshots
<!--
Screenshots can be posted here
-->
### 🚑 Other Information
- Processor architecture: <!-- x64 / x86 / arm64 -->
- System version number: <!-- example Windows 10.19042.844(see winver) / macOS Monterey 12 / Ubuntu 20.04.2 LTS -->
- Download channels: <!-- Microsoft Store / Official Website / Github / AppStore / xx netdisk -->
- Program version: <!-- 2.8.4 -->
- Does it contain a standalone runtime: <!-- with_runtime or without fde in the file name -->
+40 -12
View File
@@ -1,36 +1,64 @@
---
name: Bug Report 🐛
about: 创建 Bug 报告以帮助我们改进 / Create a report to help us improve
title: "🐛[BUG] "
name: "(Simplified Chinese)Bug Report \U0001F41B"
about: 创建 Bug 报告以帮助我们改进
title: "\U0001F41B[BUG] 请输入标题"
labels: bug
assignees: ''
---
### 🐛 描述(Description)
## 请认真检查以下清单中的每一项
- [ ] 已经搜索过,没有发现类似的 issue
- [ ] 已经搜索过文档,没有发现相关内容
- [ ] 已经尝试使用过最新版,问题依旧存在
- [ ] 使用的是官方版本(未替换及修改过安装目录程序文件)
<!--
详细地描述 bug,让大家都能理解
发布前请先尝试在 Issues 内搜索一下你的问题是否已经被提出过,
详细地描述 bug,让大家都能理解,请一定确定你所要发布的内容是一个 Bug,如果不确定请发 Question
别忘了填写标题,标题要简短的描述问题
-->
### 📷 复现步骤(Steps to Reproduce)
### 🐛 描述
<!--
详细的描述该问题
-->
### 📷 复现步骤
<!--
清晰描述复现步骤,让别人也能看到问题
确保上述步骤尽可能能够在大多数设备上 100% 复现,以便定位问题原因
-->
1.
2.
3.
### 📄 [异常/日志]信息([Exception/Log] Information)
### 📄 日志信息
<!--
```
- 日志文件所在文件夹路径
- Microsoft Store ```%USERPROFILE%\AppData\Local\Packages\4651ED44255E.47979655102CE_k6txddmbb6c52\LocalCache\Logs```
- Windows ```\Logs``` or ```%Tmp%\Steam++\Logs```
- macOS ```~/Library/Caches/Steam++/Logs```
- Linux ```$XDG_CACHE_HOME/Steam++/Logs``` or ```$HOME/.cache/Steam++/Logs```
- Android ```/data/data/net.steampp.app/cache/Logs```
你的日志内容
```
### 🚑 基本信息(Basic Information)
-->
- 程序版本(Program Version):
- 系统版本号(OS Version): <!-- example Windows 10.19042.844(see winver) -->
### 🖼 截图(Screenshots)
### 🖼 截图
<!--
截图可以贴在这里
-->
### 🚑 其他信息
- 处理器体系结构:<!-- x64 / x86 / arm64 -->
- 系统版本号:<!-- example Windows 10.19042.844(see winver) / macOS Monterey 12 / Ubuntu 20.04.2 LTS -->
- 下载渠道:<!-- 微软商店 / 官网 / Github / AppStore / xx网盘 -->
- 程序版本:<!-- 2.8.4 -->
- 是否包含独立运行时:<!-- 文件名中带有 with_runtime 或 不包含 fde -->
-26
View File
@@ -1,26 +0,0 @@
---
name: Feature request 👑
about: 对程序的需求或建议 / Suggest an idea for program
title: "👑[Enhancement] "
labels: enhancement
assignees: ''
---
### 🥰 需求描述(Description)
<!--
详细地描述需求,让大家都能理解
-->
### 🧐 解决方案(Solution)
<!--
如果你有解决方案,在这里清晰地阐述
-->
### 🚑 其他信息(Other Information)
<!--
如截图等其他信息可以贴在这里
-->
+37
View File
@@ -0,0 +1,37 @@
---
name: "(English)Question \U0001F9D0"
about: Questions about using the program or need help
title: "\U0001F9D0[Question] Please enter a title"
labels: question
assignees: ''
---
## Please check each item in the following list carefully
- [ ] I have searched and found no similar issues
- [ ] Have searched the documentation and found no relevant content
- [ ] I have tried to use the latest version, but the problem still exists
- [ ] The official version is used (no replacement and modification of the installation directory program files)
<!--
Before posting, please try searching for your question in Issuse to see if it has already been asked.
Don't forget to fill in the title, which should be a short description of the Question
-->
### 🧐 Description
<!--
Describe the Question in detail so that everyone can understand it
-->
### 🚑 Other Information
<!--
Additional information such as screenshots can be posted here
-->
- Processor architecture: <!-- x64 / x86 / arm64 -->
- System version number: <!-- example Windows 10.19042.844(see winver) / macOS Monterey 12 / Ubuntu 20.04.2 LTS -->
- Download channels: <!-- Microsoft Store / Official Website / Github / AppStore / xx netdisk -->
- Program version: <!-- 2.8.4 -->
- Does it contain a standalone runtime: <!-- with_runtime or without fde in the file name -->
+25 -8
View File
@@ -1,20 +1,37 @@
---
name: question 🧐
about: 对程序使用的疑问或需要帮助 / Questions about the use of the program or need help
title: "🧐[Question] "
labels: question
name: "(Simplified Chinese)Question \U0001F9D0"
about: 对程序使用的疑问或需要帮助
title: "\U0001F9D0[Question] 请输入标题"
labels: question
assignees: ''
---
### 🧐 问题描述(Description)
## 请认真检查以下清单中的每一项
- [ ] 已经搜索过,没有发现类似的 issue
- [ ] 已经搜索过文档,没有发现相关内容
- [ ] 已经尝试使用过最新版,问题依旧存在
- [ ] 使用的是官方版本(未替换及修改过安装目录程序文件)
<!--
详细地描述需求,让大家都能理解
发布前请先尝试在 Issuse 内搜索一下你的 Question 是否已经被提出过,
别忘了填写标题,标题要简短的描述 Question
-->
### 🚑 其他信息(Other Information)
### 🧐 问题描述
<!--
详细地描述 Question,让大家都能理解
-->
### 🚑 其他信息
<!--
如截图等其他信息可以贴在这里
-->
-->
- 处理器体系结构:<!-- x64 / x86 / arm64 -->
- 系统版本号:<!-- example Windows 10.19042.844(see winver) / macOS Monterey 12 / Ubuntu 20.04.2 LTS -->
- 下载渠道:<!-- 微软商店 / 官网 / Github / AppStore / xx网盘 -->
- 程序版本:<!-- 2.8.4 -->
- 是否包含独立运行时:<!-- 文件名中带有 with_runtime 或 不包含 fde -->
+126
View File
@@ -0,0 +1,126 @@
name: CI
on:
push:
branches:
- main
tags:
- "*"
pull_request:
workflow_dispatch:
jobs:
test:
name: Test
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ windows-latest ]
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 0
submodules: recursive
- name: Setup .NET
uses: actions/setup-dotnet@v2
with:
dotnet-version: 7.0.x
- name: Install Android SDK
run: dotnet workload install android
- name: Install iOS SDK
run: dotnet workload install ios
- name: Install macOS SDK
run: dotnet workload install macos
- name: Install Mac Catalyst SDK
run: dotnet workload install maccatalyst
- name: Install Maui
run: dotnet workload install maui
# - name: Install wasm-tools
# run: dotnet workload install wasm-tools
- name: Restore Workload
run: dotnet workload restore
- name: Verify dotnet info
run: dotnet --info
# - name: Test
# shell: pwsh
# run: dotnet test src/BD.Common.UnitTest/BD.Common.UnitTest.csproj -c Release -p:GeneratePackageOnBuild=false
build:
name: Build
needs: [ test ]
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
runs-on: windows-latest
strategy:
matrix:
ProjectName: [
BD.WTTS.Client.Avalonia.App,
]
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 0
submodules: recursive
- name: Setup .NET
uses: actions/setup-dotnet@v2
with:
dotnet-version: 7.0.x
- name: Install Android SDK
run: dotnet workload install android
- name: Install iOS SDK
run: dotnet workload install ios
- name: Install macOS SDK
run: dotnet workload install macos
- name: Install Mac Catalyst SDK
run: dotnet workload install maccatalyst
- name: Install Maui
run: dotnet workload install maui
# - name: Install wasm-tools
# run: dotnet workload install wasm-tools
- name: Restore Workload
run: dotnet workload restore
- name: Verify dotnet info
run: dotnet --info
- name: Build
shell: pwsh
run: dotnet build -c Release src\${{ matrix.ProjectName }}\${{ matrix.ProjectName }}.csproj
# release:
# name: Release
# needs: build
# runs-on: ubuntu-latest
#
# steps:
# - name: Changelog
# uses: glennawatson/ChangeLog@v1
# id: changelog
#
# - name: Create Release
# uses: ncipollo/release-action@v1
# with:
# token: ${{ secrets.RMBADMIN_TOKEN }}
# body: ${{ steps.changelog.outputs.commitLog }}
# draft: false
# prerelease: false
-16
View File
@@ -1,16 +0,0 @@
name: Sync To Gitee
on: [ push, delete, create ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Sync to Gitee
uses: wearerequired/git-mirror-action@master
env:
SSH_PRIVATE_KEY: ${{ secrets.GITEE_PRIVATE_KEY }}
with:
source-repo: "git@github.com:SteamTools-Team/SteamTools.git"
destination-repo: "git@gitee.com:rmbgame/SteamTools"
-61
View File
@@ -1,61 +0,0 @@
name: .NET
on:
push:
branches: [ master, develop ]
pull_request:
branches: [ master, develop ]
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ windows-latest, macOS-latest, ubuntu-latest ]
steps:
- uses: actions/checkout@v2
- name: Setup .NET 5
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.x
- name: Setup .NET 6
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.100-preview.4.21255.9
- name: Checkout repository
uses: actions/checkout@v2
- name: Checkout submodules
run: git submodule update --init --recursive
- name: dotnet info
run: dotnet --info
- name: dotnet restore SteamToolsV2+.sln
if: matrix.os == 'windows-latest'
run: dotnet restore ./SteamToolsV2+.sln
- name: dotnet restore SteamToolsV2+.Linux.sln
if: matrix.os == 'ubuntu-latest'
run: dotnet restore ./SteamToolsV2+.Linux.sln
- name: dotnet restore SteamToolsV2+.Mac.sln
if: matrix.os == 'macOS-latest'
run: dotnet restore ./SteamToolsV2+.Mac.sln
- name: dotnet AvaloniaApp build
run: dotnet build ./src/ST.Client.Desktop.Avalonia.App/ST.Client.Desktop.Avalonia.App.csproj
- name: dotnet CommonUnit build
run: dotnet build ./tests/Common.UnitTest/Common.UnitTest.csproj
- name: dotnet ST.Client.UnitTest build
run: dotnet build ./tests/ST.Client.UnitTest/ST.Client.UnitTest.csproj
- name: dotnet ST.Client.Desktop.UnitTest build
run: dotnet build ./tests/ST.Client.Desktop.UnitTest/ST.Client.Desktop.UnitTest.csproj
- name: dotnet CommonUnit test
run: dotnet test ./tests/Common.UnitTest/Common.UnitTest.csproj
- name: dotnet ST.Client.UnitTest test
run: dotnet test ./tests/ST.Client.UnitTest/ST.Client.UnitTest.csproj
- name: dotnet ST.Client.Desktop.UnitTest test
if: matrix.os != 'windows-latest'
run: dotnet test ./tests/ST.Client.Desktop.UnitTest/ST.Client.Desktop.UnitTest.csproj
+243 -23
View File
@@ -13,6 +13,9 @@
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
@@ -26,7 +29,7 @@ bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ib/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
@@ -40,9 +43,10 @@ Generated\ Files/
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
@@ -123,9 +127,6 @@ _ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
@@ -182,7 +183,9 @@ publish/
PublishScripts/
# NuGet Packages
*.nupkg
# *.nupkg
# NuGet Symbol Packages
# *.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
@@ -207,6 +210,8 @@ BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
@@ -256,7 +261,9 @@ ServiceFabricBackup/
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- Backup*.rdl
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
@@ -292,10 +299,6 @@ paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush personal settings
.cr/personal
@@ -346,18 +349,235 @@ MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Built application files
*.apk
*.aar
*.ap_
*.aab
# Files for the ART/Dalvik VM
*.dex
# Java class files
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
# Generated files
bin/
gen/
out/
# Uncomment the following line in case you need and you don't have the release build type files in your app
# release/
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/
# IntelliJ
*.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
# Android Studio 3 in .gitignore file.
.idea/caches
.idea/modules.xml
# Comment next line if keeping position of elements in Navigation Editor is relevant for you
.idea/navEditor.xml
# Keystore files
# Uncomment the following lines if you do not want to check your keystore files in.
#*.jks
#*.keystore
# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
.cxx/
# Google Services (e.g. APIs or Firebase)
# google-services.json
# Freeline
freeline.py
freeline/
freeline_project_description.json
# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md
# Version control
vcs.xml
# lint
lint/intermediates/
lint/generated/
lint/outputs/
lint/tmp/
# lint/reports/
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## User settings
xcuserdata/
## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
*.xcscmblueprint
*.xccheckout
## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
build/
DerivedData/
*.moved-aside
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
## Obj-C/Swift specific
*.hmap
## App packaging
*.ipa
*.dSYM.zip
*.dSYM
## Playgrounds
timeline.xctimeline
playground.xcworkspace
# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
# Package.pins
# Package.resolved
# *.xcodeproj
#
# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
# hence it is not needed unless you have added a package configuration file to your project
# .swiftpm
.build/
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
#
# Add this line if you want to avoid checking in source code from the Xcode workspace
# *.xcworkspace
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build/
# Accio dependency management
Dependencies/
.accio/
# fastlane
#
# It is recommended to not store the screenshots in the git repo.
# Instead, use fastlane to re-generate the screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output
# Code Injection
#
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode
iOSInjectionProject/
# Prerequisites
*.d
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Fortran module files
*.mod
*.smod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.out
*.app
# macOS
.DS_Store
# Design Resource
*.psd
# Android Resource Designer
Resource.designer.cs
# csproject launchSettings
launchSettings.json
# Android KeyStore
*.jks
/Xamarin.Android.KeyStore.props
# WTTS
.idea
/pkg
!**/BD.WTTS.Client.Avalonia.App
+21 -21
View File
@@ -1,21 +1,21 @@
[submodule "references/Titanium-Web-Proxy"]
path = references/Titanium-Web-Proxy
url = https://github.com/SteamTools-Team/Titanium-Web-Proxy.git
[submodule "references/MetroRadiance"]
path = references/MetroRadiance
url = https://github.com/rmbadmin/MetroRadiance.git
[submodule "references/SteamAchievementManager"]
path = references/SteamAchievementManager
url = https://github.com/SteamTools-Team/SteamAchievementManager.git
[submodule "references/Steam4NET"]
path = references/Steam4NET
url = https://github.com/SteamTools-Team/Steam4NET.git
[submodule "references/Depressurizer"]
path = references/Depressurizer
url = https://github.com/SteamTools-Team/Depressurizer.git
[submodule "references/AvaloniaGif"]
path = references/AvaloniaGif
url = https://github.com/SteamTools-Team/AvaloniaGif
[submodule "references/WinAuth"]
path = references/WinAuth
url = https://github.com/SteamTools-Team/WinAuth
[submodule "ref/DirectoryPackages"]
path = ref/DirectoryPackages
url = https://github.com/BeyondDimension/DirectoryPackages.git
[submodule "ref/ArchiSteamFarm"]
path = ref/ArchiSteamFarm
url = https://github.com/BeyondDimension/ArchiSteamFarm.git
[submodule "ref/Avalonia.Image2"]
path = ref/Avalonia.Image2
url = https://github.com/BeyondDimension/Avalonia.Image2.git
[submodule "ref/Gameloop.Vdf"]
path = ref/Gameloop.Vdf
url = https://github.com/BeyondDimension/Gameloop.Vdf.git
[submodule "ref/Steam4NET"]
path = ref/Steam4NET
url = https://github.com/BeyondDimension/Steam4NET.git
[submodule "ref/Titanium-Web-Proxy"]
path = ref/Titanium-Web-Proxy
url = https://github.com/BeyondDimension/Titanium-Web-Proxy.git
[submodule "ref/SteamAchievementManager"]
path = ref/SteamAchievementManager
url = https://github.com/BeyondDimension/SteamAchievementManager.git
-20
View File
@@ -1,20 +0,0 @@
<Project>
<PropertyGroup>
<LangVersion>9.0</LangVersion>
<Nullable>enable</Nullable>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<TrimMode>link</TrimMode>
</PropertyGroup>
<PropertyGroup Condition=" Exists('$(MSBuildProjectDirectory)\..\..\Unicorn.pfx') ">
<DefineConstants>SIGN_ASSEMBLY;$(DefineConstants)</DefineConstants>
<SignAssembly>true</SignAssembly>
<DelaySign>false</DelaySign>
<AssemblyOriginatorKeyFile>..\..\Unicorn.pfx</AssemblyOriginatorKeyFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)'=='Release' ">
<DebugType>none</DebugType>
<DebugSymbols>false</DebugSymbols>
</PropertyGroup>
</Project>
+7
View File
@@ -0,0 +1,7 @@
<configuration>
<packageSources>
<add key="LocalNuGetPackages_rx" value="./ref/pkg/rx" />
<add key="LocalNuGetPackages_wtts" value="./ref/pkg/wtts" />
<add key="avalonia-nightly" value="https://pkgs.dev.azure.com/AvaloniaUI/AvaloniaUI/_packaging/avalonia-all/nuget/v3/index.json" protocolVersion="3" />
</packageSources>
</configuration>
+89 -99
View File
@@ -1,114 +1,90 @@
<h1 align="center">Steam++ Tools 🧰</h1>
<h1 align="center">Watt Toolkit 🧰 (Former name Steam++)</h1>
<div align="center">
「Steam++」is a toolkit that contains a variety of Steam tools, most of which require you to download and install Steam in order to use them.
![Release Download](https://img.shields.io/github/downloads/rmbadmin/SteamTools/total?style=flat-square)
[![Release Version](https://img.shields.io/github/v/release/rmbadmin/SteamTools?style=flat-square)](https://github.com/rmbadmin/SteamTools/releases/latest)
[![GitHub license](https://img.shields.io/github/license/rmbadmin/SteamTools?style=flat-square)](LICENSE)
[![GitHub Star](https://img.shields.io/github/stars/rmbadmin/SteamTools?style=flat-square)](https://github.com/rmbadmin/SteamTools/stargazers)
[![GitHub Fork](https://img.shields.io/github/forks/rmbadmin/SteamTools?style=flat-square)](https://github.com/rmbadmin/SteamTools/network/members)
![GitHub Repo size](https://img.shields.io/github/repo-size/rmbadmin/SteamTools?style=flat-square&color=3cb371)
[![GitHub Repo Languages](https://img.shields.io/github/languages/top/SteamTools-Team/SteamTools?style=flat-square)](https://github.com/SteamTools-Team/SteamTools/search?l=c%23)
[![NET 6.0](https://img.shields.io/badge/dotnet-6.0-purple.svg?style=flat-square&color=512bd4)](https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-4)
[![C# 9.0](https://img.shields.io/badge/c%23-9.0-green.svg?style=flat-square&color=6da86a)](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9)
[![Desktop GUI](https://img.shields.io/badge/gui@desktop-AvaloniaUI-purple.svg?style=flat-square&color=8c45ab)](https://github.com/AvaloniaUI/Avalonia)
[![Mobile GUI](https://img.shields.io/badge/gui@mobile-Xamarin.Forms-blue.svg?style=flat-square&color=3498db)](https://github.com/xamarin/Xamarin.Forms)
[![Official WebSite](https://img.shields.io/badge/website@official-Ant%20Design%20of%20React-blue.svg?style=flat-square&color=61dafb)](https://github.com/ant-design/ant-design)
[![BackManage WebSite](https://img.shields.io/badge/website@back_manage-Ant%20Design%20of%20Blazor-purple.svg?style=flat-square&color=512bd4)](https://github.com/ant-design-blazor/ant-design-blazor)
[![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2FSteamTools-Team%2FSteamTools%2Fbadge%3Fref%3Ddevelop&style=flat-square)](https://actions-badge.atrox.dev/SteamTools-Team/SteamTools/goto?ref=develop)
[![GitHub Star](https://img.shields.io/github/stars/rmbadmin/SteamTools.svg?style=social)](https://github.com/SteamTools-Team/SteamTools)
[![Gitee Star](https://gitee.com/rmbgame/SteamTools/badge/star.svg)](https://gitee.com/rmbgame/SteamTools)
</div>
<div align="center"><img src="./resources/screenshots.en.jpg" /></div>
English | [简体中文](./README.md)
"Watt Toolkit" is an open source cross-platform multi-purpose game toolkit, most of its features require you to download and install Steam to use it.
![Release Download](https://img.shields.io/github/downloads/BeyondDimension/SteamTools/total?style=flat-square)
[![Release Version](https://img.shields.io/github/v/release/BeyondDimension/SteamTools?style=flat-square)](https://github.com/BeyondDimension/SteamTools/releases/latest)
[![GitHub license](https://img.shields.io/github/license/BeyondDimension/SteamTools?style=flat-square)](LICENSE)
[![GitHub Star](https://img.shields.io/github/stars/BeyondDimension/SteamTools?style=flat-square)](https://github.com/BeyondDimension/SteamTools/stargazers)
[![GitHub Fork](https://img.shields.io/github/forks/BeyondDimension/SteamTools?style=flat-square)](https://github.com/BeyondDimension/SteamTools/network/members)
![GitHub Repo size](https://img.shields.io/github/repo-size/BeyondDimension/SteamTools?style=flat-square&color=3cb371)
[![GitHub Repo Languages](https://img.shields.io/github/languages/top/BeyondDimension/SteamTools?style=flat-square)](https://github.com/BeyondDimension/SteamTools/search?l=c%23)
[![NET 7.0](https://img.shields.io/badge/dotnet-7.0-purple.svg?style=flat-square&color=512bd4)](https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-7)
[![C# 11](https://img.shields.io/badge/c%23-11-brightgreen.svg?style=flat-square&color=6da86a)](https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-11)
[![Kofi](https://img.shields.io/badge/Kofi-RMBGAME-orange.svg?style=flat-square&logo=kofi)](https://ko-fi.com/rmbgame)
[![Patreon](https://img.shields.io/badge/Patreon-RMBGAME-red.svg?style=flat-square&logo=patreon)](https://www.patreon.com/rmbgame)
[![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2FSteamTools-Team%2FSteamTools%2Fbadge%3Fref%3Ddevelop&style=flat-square)](https://actions-badge.atrox.dev/BeyondDimension/SteamTools/goto?ref=develop)
[![GitHub Star](https://img.shields.io/github/stars/BeyondDimension/SteamTools.svg?logo=github)](https://github.com/BeyondDimension/SteamTools)
[![Gitee Star](https://gitee.com/rmbgame/SteamTools/badge/star.svg)](https://gitee.com/rmbgame/SteamTools)
[![Bilibili](https://img.shields.io/badge/bilibili-软妹币玩家-blue.svg?style=flat-square&logo=bilibili)](https://space.bilibili.com/797215)
</div>
## 🚀 Download Channels
- [![Microsoft Store](./res/brands/msstore.en.png)](https://apps.microsoft.com/store/detail/watt-toolkit/9MTCFHS560NG)
- [Official WebSite](https://steampp.net)
- [GitHub Releases](https://github.com/BeyondDimension/SteamTools/releases)
- [Gitee Releases](https://gitee.com/rmbgame/SteamTools/releases)
- [Arch User Repository](https://aur.archlinux.org/packages/watt-toolkit-bin)(Current release build)
- [Arch User Repository dev](https://aur.archlinux.org/packages/watt-toolkit-git)(Pull the latest source code build, maybe the build will fail)
## ⬇️ [Download Guide](./doc/download-guide.en.md)
See details [./doc/download-guide.en.md](./doc/download-guide.en.md)
## ✨ Functions
1. Local reverse proxy for Steam's community webpage to enable normal access in **the Chinese Mainland, Mainland of China**
2. Quickly switch the Steam account that the current PC has remembered to log into
- This feature is to read the local user login records stored under the Steam path to directly display the operation, you can switch between multiple accounts without re-entering passwords and tokens.
3. Achievement stat modifications for Steam games
- Function reference SteamAchievementManager for secondary development, modified the game list loading and operation ease of use.
4. Steam Local Two-Step Authenticator
- The function reference [WinAuth](https://github.com/winauth/winauth) is developed to enable you to view your token without launching the mobile version of Steam App, similar function software are [WinAuth](https://github.com/winauth/winauth), [SteamDesktopAuthenticator](https://github.com/Jessecar96/SteamDesktopAuthenticator).
5. Some game tools
- Currently there is a forced game borderless windowing, CSGO fix mistake VAC shield.
1. Account Switch <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" />
- Switch between Steam accounts that are already logged in on the current PC with one click, and manage features such as sorting your home shared library.
2. Inventory Management <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" />
- Lets you manage your Steam game inventory directly, not only by downloading older Steam games, but also by managing Steam game achievements directly, supporting unlocked achievements and unlocked achievements.
3. Local Authentication <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" /> <img src="./res/brands/android.svg" width="16" height="16" />
- Let your cell phone token unified save in the computer, currently only support Steam token, later will develop support more token types with cloud synchronization token.
4. ArchiSteamFarm <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" /> <img src="./res/brands/android.svg" width="16" height="16" />
- Integration with [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm) provides functions such as hanging and dropping Steam Collectible Cards within the app.
5. Game Tools <img src="./res/brands/windows.svg" width="16" height="16" />
- Force game windows to use borderless windowing
<!--Prerequisites Microsoft Visual C++ 2015-2019 Redistributable [64 bit](https://aka.ms/vs/16/release/vc_redist.x64.exe) / [32 bit](https://aka.ms/vs/16/release/vc_redist.x86.exe)-->
## 🖥 Supported Operating Systems
- Desktop(Only 64 bit is supported)
- Windows 10 1607+ / Windows Server, version 1909+ / Windows Server 2019 / Windows Server 2016
- Windows 8.1 / Windows Server 2012 R2
- Windows 7 SP1 [ESU](https://docs.microsoft.com/troubleshoot/windows-client/windows-7-eos-faq/windows-7-extended-security-updates-faq)
- Prerequisites
- KB3063858 [64 bit](https://www.microsoft.com/download/details.aspx?id=47442) / [32 bit](https://www.microsoft.com/download/details.aspx?id=47409)
- macOS 10.13 High Sierra Or Higher
- Linux Distribution
- Arch Linux
- Alpine Linux 3.11+
- CentOS 7+
- Debian 9+
- Deepin 20.1 / UOS 20
- Fedora 32+
- Linux Mint 18+
- openSUSE 15+
- Red Hat Enterprise Linux 7+
- SUSE Enterprise Linux (SLES) 12 SP2+
- Ubuntu 20.10, 20.04, 18.04, 16.04
- Mobile(Only ARM64 or ARM32 are supported)
- Android 5.0+
- iOS 10.0+
- Windows 11
- Windows 10 version 1809(OS internal version 17763) or higher is required
- macOS 10.15 or higher is required
- Ubuntu 18.04 or higher is required
- Debian 10 or higher is required
- CentOS 7 or higher is required
- Deepin(UOS) 20 or higher is required
- ~~iOS 11 or higher is required~~(In development…)
- Android 5.0(API 21) or higher is required
## ⛔ Unsupported Operating System
- Windows 8
- [Due to Microsoft's official support for the product has ended](https://docs.microsoft.com/lifecycle/products/windows-8), so this program cannot run on this operating system, [It is recommended to upgrade to Windows 8.1](https://support.microsoft.com/windows/update-to-windows-8-1-from-windows-8-17fc54a7-a465-6b5a-c1a0-34140afd0669)
- Windows Server 2012 / 2008 R2 SP1
- Only version 1.X is available, and version 2.X is not supported. It is recommended to upgrade to **Windows Server 2012 R2** or higher
- Windows Server / Linux version without desktop GUI
## 🧩 Screenshots
<img src="./res/screenshots/screenshot-windows-accelerator.webp" width="800" />
<br/>
<br/>
<img src="./res/screenshots/screenshot-android-authenticator.png" width="800" />
## 🌏 Roadmap
Read what we [milestones](https://github.com/SteamTools-Team/SteamTools/milestones), and feel free to ask questions.
Read what we [milestones](https://github.com/BeyondDimension/SteamTools/milestones), and feel free to ask questions.
## ⌨️ Development Environment
[Visual Studio 2019 Version 16.10 Or Higher](https://visualstudio.microsoft.com/vs/) Or [JetBrains Rider](https://www.jetbrains.com/rider/) Or ~~[Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/)~~ Or ~~[Visual Studio Code](https://code.visualstudio.com/)~~
- Supported Operating Systems
- [Windows 10 version 2004 or higher: Home, Professional, Education, and Enterprise (LTSC and S are not supported)](https://docs.microsoft.com/en-us/visualstudio/releases/2019/system-requirements)
- [macOS 10.13 High Sierra Or Higher](https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2019-system-requirements-mac)
- Workload
- Web and Cloud
- ASP.NET and Web Development
- Desktop and Mobile Applications
- .NET Desktop Development
- UWP Development
- Mobile Development using .Net
- Other Toolsets
- .NET Core Cross Platform Development
- Single Component
- GitHub Extension for Visual Studio
- Windows 10 SDK (10.0.19041.0)
- [Visual Studio Marketplace](https://marketplace.visualstudio.com/)
- [Avalonia for Visual Studio](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio)
- [NUnit VS Templates](https://marketplace.visualstudio.com/items?itemName=NUnitDevelopers.NUnitTemplatesforVisualStudio)
[Visual Studio 2022](https://visualstudio.microsoft.com/vs)
[Visual Studio 2022 for Mac](https://visualstudio.microsoft.com/vs/mac)
[JetBrains Rider](https://www.jetbrains.com/rider)
[Visual Studio Code](https://code.visualstudio.com)
[OpenJDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17)
[Android Studio Electric Eel Or Higher](https://developer.android.com/studio)
[Xcode 14 Or Higher](https://developer.apple.com/xcode)
## 📄 Thanks to the following Open Source Projects
* [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json)
* [MetroRadiance](https://github.com/Grabacr07/MetroRadiance)
* [MetroTrilithon](https://github.com/Grabacr07/MetroTrilithon)
* [Livet](https://github.com/runceel/Livet)
* [StatefulModel](https://github.com/ugaya40/StatefulModel)
* [Hardcodet.NotifyIcon](https://github.com/HavenDV/Hardcodet.NotifyIcon.Wpf.NetCore)
* [System.Reactive](https://github.com/dotnet/reactive)
* [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy)
* [BrotliSharpLib](https://github.com/master131/BrotliSharpLib)
* [YARP](https://github.com/microsoft/reverse-proxy)
* [FastGithub](https://github.com/dotnetcore/FastGithub)
* [Portable.BouncyCastle](https://github.com/novotnyllc/bc-csharp)
* [Ninject](https://github.com/ninject/Ninject)
* [log4net](https://github.com/apache/logging-log4net)
* [SteamDB-API](https://github.com/SteamDB-API/api)
* [SteamAchievementManager](https://github.com/gibbed/SteamAchievementManager)
* [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm)
* [Steam4NET](https://github.com/SteamRE/Steam4NET)
@@ -116,16 +92,20 @@ Read what we [milestones](https://github.com/SteamTools-Team/SteamTools/mileston
* [SteamDesktopAuthenticator](https://github.com/Jessecar96/SteamDesktopAuthenticator)
* [Gameloop.Vdf](https://github.com/shravan2x/Gameloop.Vdf)
* [DnsClient.NET](https://github.com/MichaCo/DnsClient.NET)
* [Costura.Fody](https://github.com/Fody/Costura)
* [MessagePack-CSharp](https://github.com/neuecc/MessagePack-CSharp)
* [MemoryPack](https://github.com/Cysharp/MemoryPack)
* [CSharpVitamins.ShortGuid](https://github.com/AigioL/CSharpVitamins.ShortGuid)
* [Nito.Comparers](https://github.com/StephenCleary/Comparers)
* [Nito.Disposables](https://github.com/StephenCleary/Disposables)
* [Crc32.NET](https://github.com/force-net/Crc32.NET)
* [gfoidl.Base64](https://github.com/gfoidl/Base64)
* [sqlite-net-pcl](https://github.com/praeclarum/sqlite-net)
* [AutoMapper](https://github.com/AutoMapper/AutoMapper)
* [Polly](https://github.com/App-vNext/Polly)
* [TaskScheduler](https://github.com/dahall/taskscheduler)
* [SharpZipLib](https://github.com/icsharpcode/SharpZipLib)
* [LibVLCSharp](https://github.com/videolan/libvlcsharp)
* [SevenZipSharp](https://github.com/squid-box/SevenZipSharp)
* [ZstdNet](https://github.com/skbkontur/ZstdNet)
* [Depressurizer](https://github.com/Depressurizer/Depressurizer)
* [NLog](https://github.com/nlog/NLog)
* [NUnit](https://github.com/nunit/nunit)
@@ -134,28 +114,38 @@ Read what we [milestones](https://github.com/SteamTools-Team/SteamTools/mileston
* [AvaloniaUI](https://github.com/AvaloniaUI/Avalonia)
* [AvaloniaGif](https://github.com/jmacato/AvaloniaGif)
* [Avalonia XAML Behaviors](https://github.com/wieslawsoltes/AvaloniaBehaviors)
* [FluentAvalonia](https://github.com/amwx/FluentAvalonia)
* [APNG.NET](https://github.com/jz5/APNG.NET)
* [Chromium Embedded Framework (CEF)](https://github.com/chromiumembedded/cef)
* [Moq](https://github.com/moq/moq4)
* [NPOI](https://github.com/nissl-lab/npoi)
* [Fleck](https://github.com/statianzo/Fleck)
* [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore)
* [AspNet.Security.OpenId.Providers](https://github.com/aspnet-contrib/AspNet.Security.OpenId.Providers)
* [AspNet.Security.OAuth.Providers](https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers)
* [CefNet](https://github.com/CefNet/CefNet)
* [CefSharp](https://github.com/cefsharp/CefSharp)
* [ZXing.Net](https://github.com/micjahn/ZXing.Net)
* [QRCoder](https://github.com/codebude/QRCoder)
* [QR Code Generator for .NET](https://github.com/manuelbl/QrCodeGenerator)
* [TinyPinyin](https://github.com/promeG/TinyPinyin)
* [TinyPinyin.Net](https://github.com/hueifeng/TinyPinyin.Net)
* [Packaging utilities for .NET Core](https://github.com/qmfrederik/dotnet-packaging)
* [React](https://github.com/facebook/react)
* [Ant Design](https://github.com/ant-design/ant-design)
* [Ant Design Blazor](https://github.com/ant-design-blazor/ant-design-blazor)
* [Toast messages for Xamarin.iOS](https://github.com/andrius-k/Toast)
* [XF.Material Library](https://github.com/Baseflow/XF-Material-Library)
* [ImageCirclePlugin](https://github.com/jamesmontemagno/ImageCirclePlugin)
* [Visual Studio App Center SDK for .NET](https://github.com/microsoft/appcenter-sdk-dotnet)
* [AppCenter-XMac](https://github.com/nor0x/AppCenter-XMac)
* [MSBuild.Sdk.Extras](https://github.com/novotnyllc/MSBuildSdkExtras)
* [Xamarin.Essentials](https://github.com/xamarin/essentials)
* [Xamarin.Forms](https://github.com/xamarin/Xamarin.Forms)
* [Open Source Components for Xamarin](https://github.com/xamarin/XamarinComponents)
* [Google Play Services / Firebase / ML Kit for Xamarin.Android](https://github.com/xamarin/GooglePlayServicesComponents)
* [Picasso](https://github.com/square/picasso)
* [OkHttp](https://github.com/square/okhttp)
* [Material Components for Android](https://github.com/material-components/material-components-android)
* [AndroidX for Xamarin.Android](https://github.com/xamarin/AndroidX)
* [MSAL.NET](https://github.com/AzureAD/microsoft-authentication-library-for-dotnet)
* [Android Jetpack](https://github.com/androidx/androidx)
* [ConstraintLayout](https://github.com/androidx/constraintlayout)
* [Entity Framework Core](https://github.com/dotnet/efcore)
* [ASP.NET Core](https://github.com/dotnet/aspnetcore)
* [Windows Forms](https://github.com/dotnet/winforms)
+124 -102
View File
@@ -1,126 +1,134 @@
<h1 align="center">Steam++ 工具箱 🧰</h1>
<h1 align="center">Watt Toolkit 🧰 (原名 Steam++)</h1>
<div align="center">
「Steam++」是一个包含多种Steam工具功能的工具箱,此工具的大部分功能都是需要您下载安装Steam才能使用。
![Release Download](https://img.shields.io/github/downloads/rmbadmin/SteamTools/total?style=flat-square)
[![Release Version](https://img.shields.io/github/v/release/rmbadmin/SteamTools?style=flat-square)](https://github.com/rmbadmin/SteamTools/releases/latest)
[![GitHub license](https://img.shields.io/github/license/rmbadmin/SteamTools?style=flat-square)](LICENSE)
[![GitHub Star](https://img.shields.io/github/stars/rmbadmin/SteamTools?style=flat-square)](https://github.com/rmbadmin/SteamTools/stargazers)
[![GitHub Fork](https://img.shields.io/github/forks/rmbadmin/SteamTools?style=flat-square)](https://github.com/rmbadmin/SteamTools/network/members)
![GitHub Repo size](https://img.shields.io/github/repo-size/rmbadmin/SteamTools?style=flat-square&color=3cb371)
[![GitHub Repo Languages](https://img.shields.io/github/languages/top/SteamTools-Team/SteamTools?style=flat-square)](https://github.com/SteamTools-Team/SteamTools/search?l=c%23)
[![NET 6.0](https://img.shields.io/badge/dotnet-6.0-purple.svg?style=flat-square&color=512bd4)](https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-4)
[![C# 9.0](https://img.shields.io/badge/c%23-9.0-brightgreen.svg?style=flat-square&color=6da86a)](https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-9)
[![Desktop GUI](https://img.shields.io/badge/gui@desktop-AvaloniaUI-purple.svg?style=flat-square&color=8c45ab)](https://github.com/AvaloniaUI/Avalonia)
[![Mobile GUI](https://img.shields.io/badge/gui@mobile-Xamarin.Forms-blue.svg?style=flat-square&color=3498db)](https://github.com/xamarin/Xamarin.Forms)
[![Official WebSite](https://img.shields.io/badge/website@official-Ant%20Design%20of%20React-blue.svg?style=flat-square&color=61dafb)](https://github.com/ant-design/ant-design)
[![BackManage WebSite](https://img.shields.io/badge/website@back_manage-Ant%20Design%20of%20Blazor-purple.svg?style=flat-square&color=512bd4)](https://github.com/ant-design-blazor/ant-design-blazor)
[![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2FSteamTools-Team%2FSteamTools%2Fbadge%3Fref%3Ddevelop&style=flat-square)](https://actions-badge.atrox.dev/SteamTools-Team/SteamTools/goto?ref=develop)
[![GitHub Star](https://img.shields.io/github/stars/rmbadmin/SteamTools.svg?style=social)](https://github.com/SteamTools-Team/SteamTools)
[![Gitee Star](https://gitee.com/rmbgame/SteamTools/badge/star.svg)](https://gitee.com/rmbgame/SteamTools)
[![QQ群](https://img.shields.io/badge/QQ群-101075312-blue.svg?style=flat-square&color=12b7f5)](https://qm.qq.com/cgi-bin/qm/qr?k=JVlZF31RKSDqcsxfEaw6AQE75P2NF18F&jump_from=webapi)
</div>
<div align="center"><img src="./resources/screenshots.jpg" /></div>
[English](./README.en.md) | 简体中文
「Watt Toolkit」是一个开源跨平台的多功能游戏工具箱,此工具的大部分功能都是需要您下载安装 Steam 才能使用。
![Release Download](https://img.shields.io/github/downloads/BeyondDimension/SteamTools/total?style=flat-square)
[![Release Version](https://img.shields.io/github/v/release/BeyondDimension/SteamTools?style=flat-square)](https://github.com/BeyondDimension/SteamTools/releases/latest)
[![GitHub license](https://img.shields.io/github/license/BeyondDimension/SteamTools?style=flat-square)](LICENSE)
[![GitHub Star](https://img.shields.io/github/stars/BeyondDimension/SteamTools?style=flat-square)](https://github.com/BeyondDimension/SteamTools/stargazers)
[![GitHub Fork](https://img.shields.io/github/forks/BeyondDimension/SteamTools?style=flat-square)](https://github.com/BeyondDimension/SteamTools/network/members)
![GitHub Repo size](https://img.shields.io/github/repo-size/BeyondDimension/SteamTools?style=flat-square&color=3cb371)
[![GitHub Repo Languages](https://img.shields.io/github/languages/top/BeyondDimension/SteamTools?style=flat-square)](https://github.com/BeyondDimension/SteamTools/search?l=c%23)
[![NET 7.0](https://img.shields.io/badge/dotnet-7.0-purple.svg?style=flat-square&color=512bd4)](https://learn.microsoft.com/zh-cn/dotnet/core/whats-new/dotnet-7)
[![C# 11](https://img.shields.io/badge/c%23-11-brightgreen.svg?style=flat-square&color=6da86a)](https://learn.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-11)
[![爱发电](https://img.shields.io/badge/爱发电-软妹币玩家-blue.svg?style=flat-square&color=ea4aaa&logo=github-sponsors)](https://afdian.net/@rmbgame)
[![Kofi](https://img.shields.io/badge/Kofi-RMBGAME-orange.svg?style=flat-square&logo=kofi)](https://ko-fi.com/rmbgame)
[![Patreon](https://img.shields.io/badge/Patreon-RMBGAME-red.svg?style=flat-square&logo=patreon)](https://www.patreon.com/rmbgame)
[![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2FSteamTools-Team%2FSteamTools%2Fbadge%3Fref%3Ddevelop&style=flat-square)](https://actions-badge.atrox.dev/BeyondDimension/SteamTools/goto?ref=develop)
[![GitHub Star](https://img.shields.io/github/stars/BeyondDimension/SteamTools.svg?logo=github)](https://github.com/BeyondDimension/SteamTools)
[![Gitee Star](https://gitee.com/rmbgame/SteamTools/badge/star.svg)](https://gitee.com/rmbgame/SteamTools)
[![Bilibili](https://img.shields.io/badge/bilibili-软妹币玩家-blue.svg?style=flat-square&logo=bilibili)](https://space.bilibili.com/797215)
[![QQ群](https://img.shields.io/badge/QQ群-960746023-blue.svg?style=flat-square&color=12b7f5&logo=qq)](https://jq.qq.com/?_wv=1027&k=3JKPt4xC)
</div>
## 🚀 下载渠道
- [![Microsoft 应用商店](./res/brands/msstore.en.png)](https://apps.microsoft.com/store/detail/watt-toolkit/9MTCFHS560NG?hl=zh-cn&gl=cn)
- [软件官网](https://steampp.net)
- [GitHub 发行版](https://github.com/BeyondDimension/SteamTools/releases)
- [码云 发行版](https://gitee.com/rmbgame/SteamTools/releases)
- [Arch 用户仓库](https://aur.archlinux.org/packages/watt-toolkit-bin)(当前 Release 构建)
- [Arch 用户仓库 dev](https://aur.archlinux.org/packages/watt-toolkit-git)(拉取最新源码构建,也许会构建失败)
## ⬇️ [下载指南](./doc/download-guide.md)
详见 [./doc/download-guide.md](./doc/download-guide.md)
## ✨ 功能
1. 反代 Steam 的社区网页使其能正常访问
- 功能类似羽翼城大佬的 [steamcommunity_302](https://www.dogfight360.com/blog/686/)
- 使用 [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy) 开源项目进行本地反代,使国内用户可以正常访问 Steam 社区页
- 相比 **302工具** 具有更快的启动速度,以及支持简单的脚本注入(还顺便支持了Pixiv、Discord、Twitch等网站的反代支持)
2. 快速切换当前设备已记住登陆的 Steam 账号
- 该功能是读取 Steam 路径下存储的本地用户登录记录直接展示操作,可以多账号切换无需重新输入密码和令牌
3. Steam游戏的成就统计管理功能
- 功能参考 [SteamAchievementManager](https://github.com/gibbed/SteamAchievementManager) 进行二次开发,修改了游戏列表的加载和操作易用性
4. Steam本地两步身份验证器
- 功能参考 [WinAuth](https://github.com/winauth/winauth) 开发,可以使您不用启动移动版 Steam App 也能查看您的令牌
- 本地令牌交易市场报价确认
- 功能类似的软件例如:
- [WinAuth](https://github.com/winauth/winauth)
- [SteamDesktopAuthenticator](https://github.com/Jessecar96/SteamDesktopAuthenticator)
5. 其他游戏工具
- 目前已有强制游戏无边框窗口化,CSGO 修复 VAC 误屏蔽
1. 网络加速 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" /> <img src="./res/brands/android.svg" width="16" height="16" />
- ~~使用 [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy) 开源项目进行本地反代来支持更快的访问游戏网站。~~
- 使用 [YARP.ReverseProxy](https://github.com/microsoft/reverse-proxy) 开源项目进行本地反代来支持更快的访问游戏网站。
2. 脚本配置 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" />
- 通过加速服务拦截网络请求将一些 JS 脚本注入在网页中,提供类似网页插件的功能。
3. 账号切换 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" />
- 一键切换已在当前 PC 上登录过的 Steam 账号,与管理家庭共享库排序及禁用等功能。
4. 库存管理 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" />
- 让您直接管理 Steam 游戏库存,可以编辑游戏名称和[自定义封面](https://www.steamgriddb.com),也能解锁以及反解锁 Steam 游戏成就。
- 监控 Steam 游戏下载进度实现 Steam 游戏下载完成定时关机功能。
- 模拟运行 Steam 游戏,让您不用安装和下载对应的游戏也能挂游玩时间和 Steam 卡片
- 自助管理 Steam 游戏云存档,随时删除和上传自定义的存档文件至 Steam 云
5. 本地令牌 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" /> <img src="./res/brands/android.svg" width="16" height="16" />
- 让您的手机令牌统一保存在电脑中,目前仅支持 Steam 令牌,后续会开发支持更多的令牌种类与云同步令牌。
6. 自动挂卡 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" /> <img src="./res/brands/android.svg" width="16" height="16" />
- 集成 [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm) 在应用内提供 挂机掉落 Steam 集换式卡牌 等功能。
7. 游戏工具 <img src="./res/brands/windows.svg" width="16" height="16" />
- 强制游戏窗口使用无边框窗口化、更多功能待开发。
<!--发布配置SelfContained=true时会自动打包VC++相关程序集-->
<!--先决条件 Microsoft Visual C++ 2015-2019 Redistributable [64 位](https://aka.ms/vs/16/release/vc_redist.x64.exe) / [32 位](https://aka.ms/vs/16/release/vc_redist.x86.exe)-->
## 🖥 系统要求
- 桌面端(仅支持 64 位)
- Windows 10 1607+ / Windows Server 版本 1903+ / Windows Server 2019 / Windows Server 2016
- Windows 8.1 / Windows Server 2012 R2
- Windows 7 SP1 [ESU](https://docs.microsoft.com/zh-cn/troubleshoot/windows-client/windows-7-eos-faq/windows-7-extended-security-updates-faq)
- 先决条件
- KB3063858 [64 位](https://www.microsoft.com/zh-cn/download/details.aspx?id=47442) / [32 位](https://www.microsoft.com/zh-cn/download/details.aspx?id=47409)
- macOS 10.13 High Sierra 或更高版本
- Linux 发行版
- Arch Linux
- Alpine Linux 3.11+
- CentOS 7+
- Debian 9+
- Deepin 20.1 / UOS 20
- Fedora 32+
- Linux Mint 18+
- openSUSE 15+
- Red Hat Enterprise Linux 7+
- SUSE Enterprise Linux (SLES) 12 SP2+
- Ubuntu 20.10, 20.04, 18.04, 16.04
- 移动端(仅支持 ARM64 或 ARM32)
- Android 5.0+
- iOS 10.0+
## 🖥 支持的操作系统
- Windows 11
- Windows 10 版本 1809(OS 内部版本 17763)或更高版本
- macOS 10.15 或更高版本
- Ubuntu 18.04 或更高版本
- Debian 10 或更高版本
- CentOS 7 或更高版本
- Deepin(UOS) 20 或更高版本
- ~~iOS 11 或更高版本~~(开发中…)
- Android 5.0(API 21) 或更高版本
## ⛔ 不受支持的操作系统
- Windows 8
- [由于微软官方对该产品的支持已结束](https://docs.microsoft.com/zh-cn/lifecycle/products/windows-8),故本程序无法在此操作系统上运行,[建议升级到 Windows 8.1](https://support.microsoft.com/zh-cn/windows/%E4%BB%8E-windows-8-%E6%9B%B4%E6%96%B0%E5%88%B0-windows-8-1-17fc54a7-a465-6b5a-c1a0-34140afd0669)
- Windows Server 2012 / 2008 R2 SP1
- 仅可使用 1.X 版本,2.X 开始不受支持,建议升级到 **Windows Server 2012 R2** 或更高版本
- 无桌面 GUI 的 Windows Server / Linux 版本
## 🧩 截图
<img src="./res/screenshots/screenshot-windows-accelerator.webp" width="800" />
<br/>
<br/>
<img src="./res/screenshots/screenshot-android-authenticator.png" width="800" />
## 从移动端 Steam App 导入令牌指南
- [Android 添加本地令牌(Xposed)](https://github.com/BeyondDimension/SteamTools/issues/2276)
- [iOS 添加本地令牌(无需越狱/网络抓包)](https://github.com/BeyondDimension/SteamTools/issues/2129)
- [iOS 添加本地令牌(无需越狱/iTunes 备份)](https://github.com/BeyondDimension/SteamTools/issues/299)
- [iOS 添加本地令牌(需越狱)](https://github.com/BeyondDimension/SteamTools/issues/95)
## 🌏 路线图
查看这个 [milestones](https://github.com/SteamTools-Team/SteamTools/milestones) 来了解我们下一步的开发计划,并随时提出问题。
查看这个 [milestones](https://github.com/BeyondDimension/SteamTools/milestones) 来了解我们下一步的开发计划,并随时提出问题。
## ⌨️ 开发环境
[Visual Studio 2019 版本 16.10 或更高版本](https://visualstudio.microsoft.com/zh-hans/vs/) 或 [JetBrains Rider](https://www.jetbrains.com/rider/) 或 ~~[Visual Studio for Mac](https://visualstudio.microsoft.com/zh-hans/vs/mac/)~~ 或 ~~[Visual Studio Code](https://code.visualstudio.com/)~~
[Visual Studio 2022](https://visualstudio.microsoft.com/zh-hans/vs) 或 [Visual Studio 2022 for Mac](https://visualstudio.microsoft.com/zh-hans/vs/mac)
- 系统要求
- [Windows 10 版本 2004 或更高版本:家庭版、专业版、教育版和企业版(不支持 LTSC 和 Windows 10 S,在较早的操作系统上可能不受支持)](https://docs.microsoft.com/zh-cn/visualstudio/releases/2019/system-requirements)
- [macOS 10.13 High Sierra 或更高版本](https://docs.microsoft.com/zh-cn/visualstudio/productinfo/vs2019-system-requirements-mac)
- 工作负载
- [Windows 11 版本 21H2 或更高版本:家庭版、专业版、专业教育版、专业工作站版、企业版和教育版](https://learn.microsoft.com/zh-cn/visualstudio/releases/2022/system-requirements)
- [macOS Big Sur 11.0 或更高版本](https://learn.microsoft.com/zh-cn/visualstudio/releases/2022/mac-system-requirements)
- 工作负荷
- Web 和云
- ASP.NET 和 Web 开发
- 桌面应用和移动应用
- 使用 .NET 的移动开发 / .NET Multi-platform App UI 开发
- .NET 桌面开发
- 通用 Windows 平台开发
- 使用 .NET 的移动开发
- 其他工具集
- .NET Core 跨平台开发
- 单个组件
- GitHub Extension for Visual Studio
- Windows 10 SDK (10.0.19041.0)
- [Visual Studio Marketplace](https://marketplace.visualstudio.com/)
- [Avalonia for Visual Studio](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio)
- [NUnit VS Templates](https://marketplace.visualstudio.com/items?itemName=NUnitDevelopers.NUnitTemplatesforVisualStudio)
- GitHub Extension for Visual Studio(可选)
- [Visual Studio Marketplace](https://marketplace.visualstudio.com)
- [Avalonia for Visual Studio(可选)](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio)
- [NUnit VS Templates(可选)](https://marketplace.visualstudio.com/items?itemName=NUnitDevelopers.NUnitTemplatesforVisualStudio)
[JetBrains Rider](https://www.jetbrains.com/rider)
[Visual Studio Code](https://code.visualstudio.com)
[OpenJDK 17](https://learn.microsoft.com/zh-cn/java/openjdk/download#openjdk-17)
[Android Studio Electric Eel 或更高版本](https://developer.android.google.cn/studio)
[Xcode 14 或更高版本](https://developer.apple.com/xcode)
## 🏗️ [项目结构](./src/README.md)
详见 [./src/README.md](./src/README.md)
## 🧑‍💼 加入我们
- [.NET/C# 高级软件工程师(客户端方向)](https://www.zhipin.com/job_detail/b271a34a3efeb84c1XJ_2dW6ElVT.html)
- [.NET/C# 高级软件工程师](https://www.zhipin.com/job_detail/0164142566ff52d71XJ_2dW7GVVW.html)
<!--
- [.NET/C# 软件工程师](https://www.zhipin.com/job_detail/80c0ad0f424e2ea61XJ_2t6-GVVZ.html)
- [高级 Web 前端工程师](https://www.zhipin.com/job_detail/e59317c527f3f49e1XJ92d24FVRV.html)
-->
<!--👇图标如果发生更改,还需更改 Tools.OpenSourceLibraryList(Program.OpenSourceLibraryListEmoji) -->
## 📄 感谢以下开源项目
* [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json)
* [MetroRadiance](https://github.com/Grabacr07/MetroRadiance)
* [MetroTrilithon](https://github.com/Grabacr07/MetroTrilithon)
* [Livet](https://github.com/runceel/Livet)
* [StatefulModel](https://github.com/ugaya40/StatefulModel)
* [Hardcodet.NotifyIcon](https://github.com/HavenDV/Hardcodet.NotifyIcon.Wpf.NetCore)
* [System.Reactive](https://github.com/dotnet/reactive)
* [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy)
* [BrotliSharpLib](https://github.com/master131/BrotliSharpLib)
* [YARP](https://github.com/microsoft/reverse-proxy)
* [FastGithub](https://github.com/dotnetcore/FastGithub)
* [Portable.BouncyCastle](https://github.com/novotnyllc/bc-csharp)
* [Ninject](https://github.com/ninject/Ninject)
* [log4net](https://github.com/apache/logging-log4net)
* [SteamDB-API](https://github.com/SteamDB-API/api)
* [SteamAchievementManager](https://github.com/gibbed/SteamAchievementManager)
* [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm)
* [Steam4NET](https://github.com/SteamRE/Steam4NET)
@@ -128,16 +136,20 @@
* [SteamDesktopAuthenticator](https://github.com/Jessecar96/SteamDesktopAuthenticator)
* [Gameloop.Vdf](https://github.com/shravan2x/Gameloop.Vdf)
* [DnsClient.NET](https://github.com/MichaCo/DnsClient.NET)
* [Costura.Fody](https://github.com/Fody/Costura)
* [MessagePack-CSharp](https://github.com/neuecc/MessagePack-CSharp)
* [MemoryPack](https://github.com/Cysharp/MemoryPack)
* [CSharpVitamins.ShortGuid](https://github.com/AigioL/CSharpVitamins.ShortGuid)
* [Nito.Comparers](https://github.com/StephenCleary/Comparers)
* [Nito.Disposables](https://github.com/StephenCleary/Disposables)
* [Crc32.NET](https://github.com/force-net/Crc32.NET)
* [gfoidl.Base64](https://github.com/gfoidl/Base64)
* [sqlite-net-pcl](https://github.com/praeclarum/sqlite-net)
* [AutoMapper](https://github.com/AutoMapper/AutoMapper)
* [Polly](https://github.com/App-vNext/Polly)
* [TaskScheduler](https://github.com/dahall/taskscheduler)
* [SharpZipLib](https://github.com/icsharpcode/SharpZipLib)
* [LibVLCSharp](https://github.com/videolan/libvlcsharp)
* [SevenZipSharp](https://github.com/squid-box/SevenZipSharp)
* [ZstdNet](https://github.com/skbkontur/ZstdNet)
* [Depressurizer](https://github.com/Depressurizer/Depressurizer)
* [NLog](https://github.com/nlog/NLog)
* [NUnit](https://github.com/nunit/nunit)
@@ -146,28 +158,38 @@
* [AvaloniaUI](https://github.com/AvaloniaUI/Avalonia)
* [AvaloniaGif](https://github.com/jmacato/AvaloniaGif)
* [Avalonia XAML Behaviors](https://github.com/wieslawsoltes/AvaloniaBehaviors)
* [FluentAvalonia](https://github.com/amwx/FluentAvalonia)
* [APNG.NET](https://github.com/jz5/APNG.NET)
* [Chromium Embedded Framework (CEF)](https://github.com/chromiumembedded/cef)
* [Moq](https://github.com/moq/moq4)
* [NPOI](https://github.com/nissl-lab/npoi)
* [Fleck](https://github.com/statianzo/Fleck)
* [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore)
* [AspNet.Security.OpenId.Providers](https://github.com/aspnet-contrib/AspNet.Security.OpenId.Providers)
* [AspNet.Security.OAuth.Providers](https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers)
* [CefNet](https://github.com/CefNet/CefNet)
* [CefSharp](https://github.com/cefsharp/CefSharp)
* [ZXing.Net](https://github.com/micjahn/ZXing.Net)
* [QRCoder](https://github.com/codebude/QRCoder)
* [QR Code Generator for .NET](https://github.com/manuelbl/QrCodeGenerator)
* [TinyPinyin](https://github.com/promeG/TinyPinyin)
* [TinyPinyin.Net](https://github.com/hueifeng/TinyPinyin.Net)
* [Packaging utilities for .NET Core](https://github.com/qmfrederik/dotnet-packaging)
* [React](https://github.com/facebook/react)
* [Ant Design](https://github.com/ant-design/ant-design)
* [Ant Design Blazor](https://github.com/ant-design-blazor/ant-design-blazor)
* [Toast messages for Xamarin.iOS](https://github.com/andrius-k/Toast)
* [XF.Material Library](https://github.com/Baseflow/XF-Material-Library)
* [ImageCirclePlugin](https://github.com/jamesmontemagno/ImageCirclePlugin)
* [Visual Studio App Center SDK for .NET](https://github.com/microsoft/appcenter-sdk-dotnet)
* [AppCenter-XMac](https://github.com/nor0x/AppCenter-XMac)
* [MSBuild.Sdk.Extras](https://github.com/novotnyllc/MSBuildSdkExtras)
* [Xamarin.Essentials](https://github.com/xamarin/essentials)
* [Xamarin.Forms](https://github.com/xamarin/Xamarin.Forms)
* [Open Source Components for Xamarin](https://github.com/xamarin/XamarinComponents)
* [Google Play Services / Firebase / ML Kit for Xamarin.Android](https://github.com/xamarin/GooglePlayServicesComponents)
* [Picasso](https://github.com/square/picasso)
* [OkHttp](https://github.com/square/okhttp)
* [Material Components for Android](https://github.com/material-components/material-components-android)
* [AndroidX for Xamarin.Android](https://github.com/xamarin/AndroidX)
* [MSAL.NET](https://github.com/AzureAD/microsoft-authentication-library-for-dotnet)
* [Android Jetpack](https://github.com/androidx/androidx)
* [ConstraintLayout](https://github.com/androidx/constraintlayout)
* [Entity Framework Core](https://github.com/dotnet/efcore)
* [ASP.NET Core](https://github.com/dotnet/aspnetcore)
* [Windows Forms](https://github.com/dotnet/winforms)
-55
View File
@@ -1,55 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31005.135
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Blazor.BackManage.Server", "src\ST.Blazor.BackManage\Server\ST.Blazor.BackManage.Server.csproj", "{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Blazor.BackManage.Client", "src\ST.Blazor.BackManage\Client\ST.Blazor.BackManage.Client.csproj", "{AB1EB396-ABBE-4CEA-A650-950A68440391}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Root", "_Root", "{3449FCD6-B7EB-40DF-A76A-6E22A8FB3A2F}"
ProjectSection(SolutionItems) = preProject
src\ST.Blazor.BackManage\README.md = src\ST.Blazor.BackManage\README.md
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Debug|x64.ActiveCfg = Debug|Any CPU
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Debug|x64.Build.0 = Debug|Any CPU
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Debug|x86.ActiveCfg = Debug|Any CPU
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Debug|x86.Build.0 = Debug|Any CPU
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Release|Any CPU.Build.0 = Release|Any CPU
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Release|x64.ActiveCfg = Release|Any CPU
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Release|x64.Build.0 = Release|Any CPU
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Release|x86.ActiveCfg = Release|Any CPU
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Release|x86.Build.0 = Release|Any CPU
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Debug|x64.ActiveCfg = Debug|Any CPU
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Debug|x64.Build.0 = Debug|Any CPU
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Debug|x86.ActiveCfg = Debug|Any CPU
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Debug|x86.Build.0 = Debug|Any CPU
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Release|Any CPU.Build.0 = Release|Any CPU
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Release|x64.ActiveCfg = Release|Any CPU
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Release|x64.Build.0 = Release|Any CPU
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Release|x86.ActiveCfg = Release|Any CPU
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {10D95A49-D583-49CD-8224-15A402FBEE1D}
EndGlobalSection
EndGlobal
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-1539
View File
File diff suppressed because it is too large Load Diff
+345
View File
@@ -0,0 +1,345 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33414.496
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "0.Root", "0.Root", "{46259E8D-32A4-4065-953D-D6F835B57A28}"
ProjectSection(SolutionItems) = preProject
src\.editorconfig = src\.editorconfig
.gitignore = .gitignore
.gitmodules = .gitmodules
src\Directory.Build.props = src\Directory.Build.props
ref\DirectoryPackages\Directory.Packages.props = ref\DirectoryPackages\Directory.Packages.props
NuGet.Config = NuGet.Config
README.en.md = README.en.md
README.md = README.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "1.AppHost", "1.AppHost", "{5541B406-4A9A-4AC8-AA77-CE14E133DB80}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2.Reference", "2.Reference", "{90E88965-DB90-4B49-94F5-6D2965491988}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "3.Test", "3.Test", "{6AF591CA-B0C4-425B-9293-9E62F5BE9B3D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "4.Shared", "4.Shared", "{CE475939-6363-4144-B18F-2F91CC297E91}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "5.Plugins", "5.Plugins", "{A5828819-62AB-4B03-A083-8B6ED4915AA3}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Document", "Document", "{1E1DFB1C-55FC-4D74-9791-6A692E647034}"
ProjectSection(SolutionItems) = preProject
doc\download-guide.en.md = doc\download-guide.en.md
doc\download-guide.md = doc\download-guide.md
doc\openwrt.md = doc\openwrt.md
doc\release-keylol.md = doc\release-keylol.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{202026AE-894E-4E18-9846-B0739CDBE3E9}"
ProjectSection(SolutionItems) = preProject
src\AssemblyInfo.Constants.cs = src\AssemblyInfo.Constants.cs
src\AssemblyInfo.cs = src\AssemblyInfo.cs
src\AssemblyInfo.Version.Max.cs = src\AssemblyInfo.Version.Max.cs
src\README.md = src\README.md
src\Utils.cs = src\Utils.cs
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ImplicitUsings", "ImplicitUsings", "{F776BA87-0B9B-4C3C-B04F-688DCC021BF1}"
ProjectSection(SolutionItems) = preProject
src\ImplicitUsings.ArchiSteamFarm.cs = src\ImplicitUsings.ArchiSteamFarm.cs
src\ImplicitUsings.AspNetCore.cs = src\ImplicitUsings.AspNetCore.cs
src\ImplicitUsings.AutoMapper.cs = src\ImplicitUsings.AutoMapper.cs
src\ImplicitUsings.Avalonia.cs = src\ImplicitUsings.Avalonia.cs
src\ImplicitUsings.BCL.cs = src\ImplicitUsings.BCL.cs
src\ImplicitUsings.Common.cs = src\ImplicitUsings.Common.cs
src\ImplicitUsings.Controllers.cs = src\ImplicitUsings.Controllers.cs
src\ImplicitUsings.Data.cs = src\ImplicitUsings.Data.cs
src\ImplicitUsings.EntityFrameworkCore.cs = src\ImplicitUsings.EntityFrameworkCore.cs
src\ImplicitUsings.Identity.cs = src\ImplicitUsings.Identity.cs
src\ImplicitUsings.Jobs.cs = src\ImplicitUsings.Jobs.cs
src\ImplicitUsings.JsonProperty.cs = src\ImplicitUsings.JsonProperty.cs
src\ImplicitUsings.JWT.cs = src\ImplicitUsings.JWT.cs
src\ImplicitUsings.MessagePack.cs = src\ImplicitUsings.MessagePack.cs
src\ImplicitUsings.Models.cs = src\ImplicitUsings.Models.cs
src\ImplicitUsings.MSEX.cs = src\ImplicitUsings.MSEX.cs
src\ImplicitUsings.Nito.cs = src\ImplicitUsings.Nito.cs
src\ImplicitUsings.NLog.cs = src\ImplicitUsings.NLog.cs
src\ImplicitUsings.Plugins.cs = src\ImplicitUsings.Plugins.cs
src\ImplicitUsings.Quartz.cs = src\ImplicitUsings.Quartz.cs
src\ImplicitUsings.ReactiveUI.cs = src\ImplicitUsings.ReactiveUI.cs
src\ImplicitUsings.Repositories.cs = src\ImplicitUsings.Repositories.cs
src\ImplicitUsings.Services.cs = src\ImplicitUsings.Services.cs
src\ImplicitUsings.Settings.cs = src\ImplicitUsings.Settings.cs
src\ImplicitUsings.SQLite.cs = src\ImplicitUsings.SQLite.cs
src\ImplicitUsings.Steam.cs = src\ImplicitUsings.Steam.cs
src\ImplicitUsings.UI.cs = src\ImplicitUsings.UI.cs
src\ImplicitUsings.UI.ViewModels.cs = src\ImplicitUsings.UI.ViewModels.cs
src\ImplicitUsings.UI.Views.cs = src\ImplicitUsings.UI.Views.cs
src\ImplicitUsings.UnitTest.cs = src\ImplicitUsings.UnitTest.cs
src\ImplicitUsings.WTTS.cs = src\ImplicitUsings.WTTS.cs
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TFM", "TFM", "{3B0CFC2A-F61B-4000-AC12-6E0AFB5C475C}"
ProjectSection(SolutionItems) = preProject
src\TFM_NET7.props = src\TFM_NET7.props
src\TFM_NET7_WINDOWS.props = src\TFM_NET7_WINDOWS.props
src\TFM_NET7_WITH_ALL.props = src\TFM_NET7_WITH_ALL.props
src\TFM_NET7_WITH_DESKTOP.props = src\TFM_NET7_WITH_DESKTOP.props
src\TFM_NET7_WITH_WINDOWS.props = src\TFM_NET7_WITH_WINDOWS.props
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ArchiSteamFarm.Library", "ref\ArchiSteamFarm\ArchiSteamFarm.Library\ArchiSteamFarm.Library.csproj", "{6981D5CA-837C-47F8-9568-E3BD451A6C68}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibAPNG", "ref\Avalonia.Image2\LibAPNG\LibAPNG.csproj", "{47B2D651-8EE0-4C05-B451-F2DA264DD5B3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AvaloniaGif", "ref\Avalonia.Image2\AvaloniaGif\AvaloniaGif.csproj", "{5D6D28A7-1CD8-4C30-A0E4-1F8ACF389A29}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ArchiSteamFarm", "ArchiSteamFarm", "{A3A703CC-F22E-40CE-9064-6DF3E55DD556}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Avalonia", "Avalonia", "{E5732454-7455-4078-88A2-E727DCC64D26}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ReverseProxy", "ReverseProxy", "{4FA9B783-ADAE-46F6-9AAD-ED32F1839F13}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Steam", "Steam", "{99D97BD4-3F51-48BC-8BD2-647F6D268BB0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Titanium.Web.Proxy", "ref\Titanium-Web-Proxy\src\Titanium.Web.Proxy\Titanium.Web.Proxy.csproj", "{826716DC-65C2-456A-BB6D-5FDEC423E4E6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gameloop.Vdf", "ref\Gameloop.Vdf\Gameloop.Vdf\Gameloop.Vdf.csproj", "{FE91B979-FE45-43F3-B9C4-430F2360FDDF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Steam4NET", "ref\Steam4NET\Steam4NET\Steam4NET.csproj", "{C8792BC7-33C0-41D4-97F6-684AD4B0B6A5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SAM.API", "ref\SteamAchievementManager\SAM.API\SAM.API.csproj", "{123F532B-4178-4D03-A4EE-2A8F3E01433F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.UnitTest", "src\BD.WTTS.UnitTest\BD.WTTS.UnitTest.csproj", "{B1131172-0748-4003-83ED-71574FD6331A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client", "src\BD.WTTS.Client\BD.WTTS.Client.csproj", "{125FB003-F154-425F-AD3F-A1D92977D353}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Avalonia.Ref", "Avalonia.Ref", "{1BD19276-7DEF-4659-9DBF-28E8E5078698}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Skia.Internals", "src\Avalonia.Skia.Internals\Avalonia.Skia.Internals.csproj", "{06360884-9EEC-49E3-8787-BE593D08AE44}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Desktop", "src\Avalonia.Desktop\Avalonia.Desktop.csproj", "{D0CB210C-67BD-4F8D-9AD6-D6ABEF845CE7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Diagnostics", "src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj", "{20629279-8E17-49D2-9A30-352972F4F699}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Native", "src\Avalonia.Native\Avalonia.Native.csproj", "{09343C10-49B7-43F7-BEA3-F4F51BFC767C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Themes.Default", "src\Avalonia.Themes.Default\Avalonia.Themes.Default.csproj", "{2AEAE82F-C690-4F19-BD60-03BA717EA350}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Themes.Fluent", "src\Avalonia.Themes.Fluent\Avalonia.Themes.Fluent.csproj", "{1C2D25C2-4CF5-439E-9672-BE8750F15CCA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.WebView2", "src\Avalonia.WebView2\Avalonia.WebView2.csproj", "{124CB400-9E02-44CC-A8ED-56CBED8B52B6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Win32", "src\Avalonia.Win32\Avalonia.Win32.csproj", "{79C8C554-451D-4D5D-9E4C-AB7E4174568C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.X11", "src\Avalonia.X11\Avalonia.X11.csproj", "{CE9BD09A-730F-4BB0-B1B0-FA692B6DD1C7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Avalonia.App", "src\BD.WTTS.Client.Avalonia.App\BD.WTTS.Client.Avalonia.App.csproj", "{A1EE03F3-6736-4D0E-AC80-FDB72EFE705C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.Accelerator", "src\BD.WTTS.Client.Plugins.Accelerator\BD.WTTS.Client.Plugins.Accelerator.csproj", "{085B609C-083F-4698-9508-563CD6A8E71D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.GameAccount", "src\BD.WTTS.Client.Plugins.GameAccount\BD.WTTS.Client.Plugins.GameAccount.csproj", "{4D8D93B0-1B94-4FF7-BC36-B22AF3AEA41A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.ArchiSteamFarmPlus", "src\BD.WTTS.Client.Plugins.ArchiSteamFarmPlus\BD.WTTS.Client.Plugins.ArchiSteamFarmPlus.csproj", "{CABDF6AC-7AE0-445D-A4BE-BC9CD0B59AA5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.GameList", "src\BD.WTTS.Client.Plugins.GameList\BD.WTTS.Client.Plugins.GameList.csproj", "{A36BA15F-11FF-41E3-B488-7D84152C4CE9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.GameTools", "src\BD.WTTS.Client.Plugins.GameTools\BD.WTTS.Client.Plugins.GameTools.csproj", "{E959F339-B52B-44A1-85EC-D5FB384255E5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.Authenticator", "src\BD.WTTS.Client.Plugins.Authenticator\BD.WTTS.Client.Plugins.Authenticator.csproj", "{861E33DB-C9C0-4C40-9042-75F7740F6DED}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.Update", "src\BD.WTTS.Client.Plugins.Update\BD.WTTS.Client.Plugins.Update.csproj", "{8DED0728-D54E-4A1E-B1D1-3740EC04ABAA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.AppHost", "src\BD.WTTS.Client.AppHost\BD.WTTS.Client.AppHost.csproj", "{AC034643-EC5B-4BCD-BD1A-007FC3C50DF4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.Accelerator.ReverseProxy", "src\BD.WTTS.Client.Plugins.Accelerator.ReverseProxy\BD.WTTS.Client.Plugins.Accelerator.ReverseProxy.csproj", "{521D4676-8E8A-4A4C-9835-B09FF4AFFBBC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.IPC", "src\BD.WTTS.Client.IPC\BD.WTTS.Client.IPC.csproj", "{407BE171-FB57-4C39-BF26-7FAF4450635F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{09F4FC1E-88A6-4264-9871-C0AF59DEA89D}"
ProjectSection(SolutionItems) = preProject
build\publish_apphost_linux_x64.sh = build\publish_apphost_linux_x64.sh
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Controls.Internals", "src\Avalonia.Controls.Internals\Avalonia.Controls.Internals.csproj", "{BAEF69C3-9347-424D-B2B4-74BD2B3C90F9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Base", "src\Avalonia.Base\Avalonia.Base.csproj", "{02B5BE74-E75D-4573-B640-58DF2B01B4E9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6981D5CA-837C-47F8-9568-E3BD451A6C68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6981D5CA-837C-47F8-9568-E3BD451A6C68}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6981D5CA-837C-47F8-9568-E3BD451A6C68}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6981D5CA-837C-47F8-9568-E3BD451A6C68}.Release|Any CPU.Build.0 = Release|Any CPU
{47B2D651-8EE0-4C05-B451-F2DA264DD5B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{47B2D651-8EE0-4C05-B451-F2DA264DD5B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{47B2D651-8EE0-4C05-B451-F2DA264DD5B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{47B2D651-8EE0-4C05-B451-F2DA264DD5B3}.Release|Any CPU.Build.0 = Release|Any CPU
{5D6D28A7-1CD8-4C30-A0E4-1F8ACF389A29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5D6D28A7-1CD8-4C30-A0E4-1F8ACF389A29}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5D6D28A7-1CD8-4C30-A0E4-1F8ACF389A29}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5D6D28A7-1CD8-4C30-A0E4-1F8ACF389A29}.Release|Any CPU.Build.0 = Release|Any CPU
{826716DC-65C2-456A-BB6D-5FDEC423E4E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{826716DC-65C2-456A-BB6D-5FDEC423E4E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{826716DC-65C2-456A-BB6D-5FDEC423E4E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{826716DC-65C2-456A-BB6D-5FDEC423E4E6}.Release|Any CPU.Build.0 = Release|Any CPU
{FE91B979-FE45-43F3-B9C4-430F2360FDDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FE91B979-FE45-43F3-B9C4-430F2360FDDF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FE91B979-FE45-43F3-B9C4-430F2360FDDF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FE91B979-FE45-43F3-B9C4-430F2360FDDF}.Release|Any CPU.Build.0 = Release|Any CPU
{C8792BC7-33C0-41D4-97F6-684AD4B0B6A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C8792BC7-33C0-41D4-97F6-684AD4B0B6A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C8792BC7-33C0-41D4-97F6-684AD4B0B6A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C8792BC7-33C0-41D4-97F6-684AD4B0B6A5}.Release|Any CPU.Build.0 = Release|Any CPU
{123F532B-4178-4D03-A4EE-2A8F3E01433F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{123F532B-4178-4D03-A4EE-2A8F3E01433F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{123F532B-4178-4D03-A4EE-2A8F3E01433F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{123F532B-4178-4D03-A4EE-2A8F3E01433F}.Release|Any CPU.Build.0 = Release|Any CPU
{B1131172-0748-4003-83ED-71574FD6331A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B1131172-0748-4003-83ED-71574FD6331A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B1131172-0748-4003-83ED-71574FD6331A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B1131172-0748-4003-83ED-71574FD6331A}.Release|Any CPU.Build.0 = Release|Any CPU
{125FB003-F154-425F-AD3F-A1D92977D353}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{125FB003-F154-425F-AD3F-A1D92977D353}.Debug|Any CPU.Build.0 = Debug|Any CPU
{125FB003-F154-425F-AD3F-A1D92977D353}.Release|Any CPU.ActiveCfg = Release|Any CPU
{125FB003-F154-425F-AD3F-A1D92977D353}.Release|Any CPU.Build.0 = Release|Any CPU
{06360884-9EEC-49E3-8787-BE593D08AE44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{06360884-9EEC-49E3-8787-BE593D08AE44}.Debug|Any CPU.Build.0 = Debug|Any CPU
{06360884-9EEC-49E3-8787-BE593D08AE44}.Release|Any CPU.ActiveCfg = Release|Any CPU
{06360884-9EEC-49E3-8787-BE593D08AE44}.Release|Any CPU.Build.0 = Release|Any CPU
{D0CB210C-67BD-4F8D-9AD6-D6ABEF845CE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D0CB210C-67BD-4F8D-9AD6-D6ABEF845CE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D0CB210C-67BD-4F8D-9AD6-D6ABEF845CE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D0CB210C-67BD-4F8D-9AD6-D6ABEF845CE7}.Release|Any CPU.Build.0 = Release|Any CPU
{20629279-8E17-49D2-9A30-352972F4F699}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{20629279-8E17-49D2-9A30-352972F4F699}.Debug|Any CPU.Build.0 = Debug|Any CPU
{20629279-8E17-49D2-9A30-352972F4F699}.Release|Any CPU.ActiveCfg = Release|Any CPU
{20629279-8E17-49D2-9A30-352972F4F699}.Release|Any CPU.Build.0 = Release|Any CPU
{09343C10-49B7-43F7-BEA3-F4F51BFC767C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{09343C10-49B7-43F7-BEA3-F4F51BFC767C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{09343C10-49B7-43F7-BEA3-F4F51BFC767C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{09343C10-49B7-43F7-BEA3-F4F51BFC767C}.Release|Any CPU.Build.0 = Release|Any CPU
{2AEAE82F-C690-4F19-BD60-03BA717EA350}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2AEAE82F-C690-4F19-BD60-03BA717EA350}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2AEAE82F-C690-4F19-BD60-03BA717EA350}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2AEAE82F-C690-4F19-BD60-03BA717EA350}.Release|Any CPU.Build.0 = Release|Any CPU
{1C2D25C2-4CF5-439E-9672-BE8750F15CCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1C2D25C2-4CF5-439E-9672-BE8750F15CCA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1C2D25C2-4CF5-439E-9672-BE8750F15CCA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1C2D25C2-4CF5-439E-9672-BE8750F15CCA}.Release|Any CPU.Build.0 = Release|Any CPU
{124CB400-9E02-44CC-A8ED-56CBED8B52B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{124CB400-9E02-44CC-A8ED-56CBED8B52B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{124CB400-9E02-44CC-A8ED-56CBED8B52B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{124CB400-9E02-44CC-A8ED-56CBED8B52B6}.Release|Any CPU.Build.0 = Release|Any CPU
{79C8C554-451D-4D5D-9E4C-AB7E4174568C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{79C8C554-451D-4D5D-9E4C-AB7E4174568C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{79C8C554-451D-4D5D-9E4C-AB7E4174568C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{79C8C554-451D-4D5D-9E4C-AB7E4174568C}.Release|Any CPU.Build.0 = Release|Any CPU
{CE9BD09A-730F-4BB0-B1B0-FA692B6DD1C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CE9BD09A-730F-4BB0-B1B0-FA692B6DD1C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CE9BD09A-730F-4BB0-B1B0-FA692B6DD1C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CE9BD09A-730F-4BB0-B1B0-FA692B6DD1C7}.Release|Any CPU.Build.0 = Release|Any CPU
{A1EE03F3-6736-4D0E-AC80-FDB72EFE705C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A1EE03F3-6736-4D0E-AC80-FDB72EFE705C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A1EE03F3-6736-4D0E-AC80-FDB72EFE705C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A1EE03F3-6736-4D0E-AC80-FDB72EFE705C}.Release|Any CPU.Build.0 = Release|Any CPU
{085B609C-083F-4698-9508-563CD6A8E71D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{085B609C-083F-4698-9508-563CD6A8E71D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{085B609C-083F-4698-9508-563CD6A8E71D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{085B609C-083F-4698-9508-563CD6A8E71D}.Release|Any CPU.Build.0 = Release|Any CPU
{4D8D93B0-1B94-4FF7-BC36-B22AF3AEA41A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4D8D93B0-1B94-4FF7-BC36-B22AF3AEA41A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4D8D93B0-1B94-4FF7-BC36-B22AF3AEA41A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4D8D93B0-1B94-4FF7-BC36-B22AF3AEA41A}.Release|Any CPU.Build.0 = Release|Any CPU
{CABDF6AC-7AE0-445D-A4BE-BC9CD0B59AA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CABDF6AC-7AE0-445D-A4BE-BC9CD0B59AA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CABDF6AC-7AE0-445D-A4BE-BC9CD0B59AA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CABDF6AC-7AE0-445D-A4BE-BC9CD0B59AA5}.Release|Any CPU.Build.0 = Release|Any CPU
{A36BA15F-11FF-41E3-B488-7D84152C4CE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A36BA15F-11FF-41E3-B488-7D84152C4CE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A36BA15F-11FF-41E3-B488-7D84152C4CE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A36BA15F-11FF-41E3-B488-7D84152C4CE9}.Release|Any CPU.Build.0 = Release|Any CPU
{E959F339-B52B-44A1-85EC-D5FB384255E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E959F339-B52B-44A1-85EC-D5FB384255E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E959F339-B52B-44A1-85EC-D5FB384255E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E959F339-B52B-44A1-85EC-D5FB384255E5}.Release|Any CPU.Build.0 = Release|Any CPU
{861E33DB-C9C0-4C40-9042-75F7740F6DED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{861E33DB-C9C0-4C40-9042-75F7740F6DED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{861E33DB-C9C0-4C40-9042-75F7740F6DED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{861E33DB-C9C0-4C40-9042-75F7740F6DED}.Release|Any CPU.Build.0 = Release|Any CPU
{8DED0728-D54E-4A1E-B1D1-3740EC04ABAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8DED0728-D54E-4A1E-B1D1-3740EC04ABAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8DED0728-D54E-4A1E-B1D1-3740EC04ABAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8DED0728-D54E-4A1E-B1D1-3740EC04ABAA}.Release|Any CPU.Build.0 = Release|Any CPU
{AC034643-EC5B-4BCD-BD1A-007FC3C50DF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AC034643-EC5B-4BCD-BD1A-007FC3C50DF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AC034643-EC5B-4BCD-BD1A-007FC3C50DF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AC034643-EC5B-4BCD-BD1A-007FC3C50DF4}.Release|Any CPU.Build.0 = Release|Any CPU
{521D4676-8E8A-4A4C-9835-B09FF4AFFBBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{521D4676-8E8A-4A4C-9835-B09FF4AFFBBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{521D4676-8E8A-4A4C-9835-B09FF4AFFBBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{521D4676-8E8A-4A4C-9835-B09FF4AFFBBC}.Release|Any CPU.Build.0 = Release|Any CPU
{407BE171-FB57-4C39-BF26-7FAF4450635F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{407BE171-FB57-4C39-BF26-7FAF4450635F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{407BE171-FB57-4C39-BF26-7FAF4450635F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{407BE171-FB57-4C39-BF26-7FAF4450635F}.Release|Any CPU.Build.0 = Release|Any CPU
{BAEF69C3-9347-424D-B2B4-74BD2B3C90F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BAEF69C3-9347-424D-B2B4-74BD2B3C90F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BAEF69C3-9347-424D-B2B4-74BD2B3C90F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BAEF69C3-9347-424D-B2B4-74BD2B3C90F9}.Release|Any CPU.Build.0 = Release|Any CPU
{02B5BE74-E75D-4573-B640-58DF2B01B4E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{02B5BE74-E75D-4573-B640-58DF2B01B4E9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{02B5BE74-E75D-4573-B640-58DF2B01B4E9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{02B5BE74-E75D-4573-B640-58DF2B01B4E9}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{1E1DFB1C-55FC-4D74-9791-6A692E647034} = {46259E8D-32A4-4065-953D-D6F835B57A28}
{202026AE-894E-4E18-9846-B0739CDBE3E9} = {46259E8D-32A4-4065-953D-D6F835B57A28}
{F776BA87-0B9B-4C3C-B04F-688DCC021BF1} = {202026AE-894E-4E18-9846-B0739CDBE3E9}
{3B0CFC2A-F61B-4000-AC12-6E0AFB5C475C} = {46259E8D-32A4-4065-953D-D6F835B57A28}
{6981D5CA-837C-47F8-9568-E3BD451A6C68} = {A3A703CC-F22E-40CE-9064-6DF3E55DD556}
{47B2D651-8EE0-4C05-B451-F2DA264DD5B3} = {E5732454-7455-4078-88A2-E727DCC64D26}
{5D6D28A7-1CD8-4C30-A0E4-1F8ACF389A29} = {E5732454-7455-4078-88A2-E727DCC64D26}
{A3A703CC-F22E-40CE-9064-6DF3E55DD556} = {90E88965-DB90-4B49-94F5-6D2965491988}
{E5732454-7455-4078-88A2-E727DCC64D26} = {90E88965-DB90-4B49-94F5-6D2965491988}
{4FA9B783-ADAE-46F6-9AAD-ED32F1839F13} = {90E88965-DB90-4B49-94F5-6D2965491988}
{99D97BD4-3F51-48BC-8BD2-647F6D268BB0} = {90E88965-DB90-4B49-94F5-6D2965491988}
{826716DC-65C2-456A-BB6D-5FDEC423E4E6} = {4FA9B783-ADAE-46F6-9AAD-ED32F1839F13}
{FE91B979-FE45-43F3-B9C4-430F2360FDDF} = {99D97BD4-3F51-48BC-8BD2-647F6D268BB0}
{C8792BC7-33C0-41D4-97F6-684AD4B0B6A5} = {99D97BD4-3F51-48BC-8BD2-647F6D268BB0}
{123F532B-4178-4D03-A4EE-2A8F3E01433F} = {99D97BD4-3F51-48BC-8BD2-647F6D268BB0}
{B1131172-0748-4003-83ED-71574FD6331A} = {6AF591CA-B0C4-425B-9293-9E62F5BE9B3D}
{125FB003-F154-425F-AD3F-A1D92977D353} = {CE475939-6363-4144-B18F-2F91CC297E91}
{1BD19276-7DEF-4659-9DBF-28E8E5078698} = {CE475939-6363-4144-B18F-2F91CC297E91}
{06360884-9EEC-49E3-8787-BE593D08AE44} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
{D0CB210C-67BD-4F8D-9AD6-D6ABEF845CE7} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
{20629279-8E17-49D2-9A30-352972F4F699} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
{09343C10-49B7-43F7-BEA3-F4F51BFC767C} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
{2AEAE82F-C690-4F19-BD60-03BA717EA350} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
{1C2D25C2-4CF5-439E-9672-BE8750F15CCA} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
{124CB400-9E02-44CC-A8ED-56CBED8B52B6} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
{79C8C554-451D-4D5D-9E4C-AB7E4174568C} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
{CE9BD09A-730F-4BB0-B1B0-FA692B6DD1C7} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
{085B609C-083F-4698-9508-563CD6A8E71D} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
{4D8D93B0-1B94-4FF7-BC36-B22AF3AEA41A} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
{CABDF6AC-7AE0-445D-A4BE-BC9CD0B59AA5} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
{A36BA15F-11FF-41E3-B488-7D84152C4CE9} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
{E959F339-B52B-44A1-85EC-D5FB384255E5} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
{861E33DB-C9C0-4C40-9042-75F7740F6DED} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
{8DED0728-D54E-4A1E-B1D1-3740EC04ABAA} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
{AC034643-EC5B-4BCD-BD1A-007FC3C50DF4} = {5541B406-4A9A-4AC8-AA77-CE14E133DB80}
{521D4676-8E8A-4A4C-9835-B09FF4AFFBBC} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
{407BE171-FB57-4C39-BF26-7FAF4450635F} = {CE475939-6363-4144-B18F-2F91CC297E91}
{09F4FC1E-88A6-4264-9871-C0AF59DEA89D} = {46259E8D-32A4-4065-953D-D6F835B57A28}
{BAEF69C3-9347-424D-B2B4-74BD2B3C90F9} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
{02B5BE74-E75D-4573-B640-58DF2B01B4E9} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {567F588F-E95C-4286-8B30-DB3B2200221C}
EndGlobalSection
EndGlobal
BIN
View File
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
dotnet publish "..\src\BD.WTTS.Client.AppHost\BD.WTTS.Client.AppHost.csproj" -f net7.0 -c Release -p:PublishProfile=linux-x64 -p:DeployOnBuild=true --nologo
+69
View File
@@ -0,0 +1,69 @@
<h1 align="center">⬇️ Download Guide</h1>
<div align="center">
English | [Simplified Chinese](./download-guide.md)
</div>
## Windows
- Store version
- Install in Microsoft Store
- User data will be stored in ```%USERPROFILE%\AppData\Local\Packages\4651ED44255E.47979655102CE_k6txddmbb6c52\LocalState```
- Portable version
- The compressed package can be decompressed to any folder and cannot be run in the compressed software
- User data will be stored in the program root directory ```\AppData```
- With a file extension of 7z, for example ```Steam++_win_x64_v3.0.0.7z```.
- Installation version
- The installation package currently only supports Simplified Chinese
- The installer will write software information in the registry
- User data will be stored in ```%LocalAppData%\Steam++```
- With a file extension of exe, for example ```Steam++_win_x64_v3.0.0.exe```.
- 64-bit applications (recommended)
- For 64-bit operating systems only, [Determine whether your computer is running a 32-bit ersionor 64-bit version of the Windows operating system](https://support.microsoft.com/n-us/topic/etermine-whether-your-computer-is-running-a-32-bit-version-or-64-bit-version-f-the-windows-perating-system-1b03ca69-ac5e-4b04-827b-c0c47145944b).
- The file name **contains** x64, such as ```Steam++_win_x64_v3.0.0.7z```.
- 32-bit application
- For 32-bit or 64-bit operating systems.
- The file name **contains** x86, such as ```Steam++_win_x86_v3.0.0.7z```.
- ~~ARM64 application~~(Adapting…)
- It is applicable to devices that use Arm64 CPU, such as **Microsoft Surface Pro X/Surface ro 95G** and other devices that use Qualcomm Snapdragon and MediaTek mobile processors.
- The file name **contains** arm64, such as ```Steam++_win_arm64_v3.0.0.7z```.
- Independent application ([SCD](https://learn.microsoft.com/en-us/dotnet/core/deploying/publish-elf-contained)) will include. NET runtime in the application. Users of this pplication do not eed to install. NET before running the application. (Recommended)
- The file name **does not contains** fde, such as ```Steam++_win_x64_v3.0.0.7z```.
- Framework-dependent application ([FDE](https://learn.microsoft.com/en-us/dotnet/core/eploying/publish-framework-dependent)), the application does not contain the. NET runtime nd library, but nly the application and third-party dependencies.
- The file name **contains** fde, such as ```Steam++_win_x64_fde_v3.0.0.7z```.
- Compared with independent applications, framework-dependent applications can reduce the disk space occupied by this application because of sharing the runtime, and the runtime can be repaired by Windows Update with security patches.
- The following runtime needs to be installed
- ASP.NET Runtime 7.x
- ASP.NET Core Runtime 7.x
- This application does not require IIS support. You can only install the relevant ntime instead of the Hosting Bundle.
## macOS
- ARM64 application
- Applicable to Mac using ARM64 (Apple Silicon) chip, such as **Apple M1/M2**.
- The file name **contains** arm64, such as ```Steam++_macos_arm64_v3.0.0.dmg```.
- 64-bit applications
- For Mac using Intel's x64 (x86-64) chip.
- The file name **contains** x64, such as ```Steam++_macos_x64_v3.0.0.dmg```.
- ~~General package~~(Adapting…)
- All versions of binaries are included in this package and are applicable to all supported evices, but the file size is large.
## Linux
- 64-bit applications
- Applicable to devices using Intel and AMD's x64 (x86-64) chips.
- The file name **contains** x64, such as ```Steam++_linux_x64_v3.0.0.tar.zst```.
- ARM64 application
- Applicable to devices using ARM64 chips, such as **Raspberry Pi Model 3+**.
- The file name **contains** x64, such as ```Steam++_linux_arm64_v3.0.0.tar.zst```.
## Android
- General package (recommended)
- All versions of binaries are included in this package and are applicable to all supported vices, but the file size is large.
- The file name **only contains** android, such as ```Steam++_android_v3.0.0.apk```.
- ~~arm64-v8a~~(Deprecated…)
- Applicable to the use of current mainstream mobile phones or tablet devices
- The file name **contains** arm64-v8a, such as ```Steam++_arm64-v8a_v3.0.0.apk```.
- ~~armeabi-v7a~~(Deprecated…)
- It is applicable to the use of old mobile phones or tablet devices, usually those roducedbefore the second half of **2014**.
- The file name **contains** armeabi_v7a, such as ```Steam++_armeabi_v7a_v3.0.0.apk```.
- ~~x86_64~~(Deprecated…)
- Applicable to devices using Intel and AMD's x64 (x86-64) chips, such as simulators on PC.
- The file name **contains** x64, such as ```Steam++_x64_v3.0.0.apk```.
## ~~iOS/iPadOS~~(In development…) <img src="../res/brands/apple.svg" width="16" height="16" />
- Download in App Store
+77
View File
@@ -0,0 +1,77 @@
<h1 align="center">⬇️ 下载指南</h1>
<div align="center">
[English](./download-guide.en.md) | 简体中文
</div>
## Windows
- 应用商店版
- 在 Microsoft 应用商店中安装
- 用户数据将存放于 ```%USERPROFILE%\AppData\Local\Packages\4651ED44255E.47979655102CE_k6txddmbb6c52\LocalState```
- 便携版
- 压缩包解压到任意文件夹即可,不可在压缩软件中运行
- 用户数据将存放于程序根目录下 ```\AppData```
- 文件扩展名为 7z 的,例如 ```Steam++_win_x64_v3.0.0.7z```。
- 安装版
- 安装包当前仅支持简体中文
- 安装程序将会在注册表中写入软件信息
- 用户数据将存放于 ```%LocalAppData%\Steam++```
- 文件扩展名为 exe 的,例如 ```Steam++_win_x64_v3.0.0.exe```。
- 64 位应用程序(推荐)
- 仅适用于 64 位操作系统,[确定您的计算机运行的是 32 位版本还是 64 位版本的 Windows 操作系统](https://pport.microsoft.com/zh-cn/topic/%E7%A1%AE%E5%AE%9A%E6%82%A8%E7%9A%84%E8%AE%1%E7%AE%97%6%9C%BAE8%BF%90%E8%A1%8C%E7%9A%84%E6%98%AF-32-%E4%BD%8D%E7%89%88%E6%9C%C%E8%BF%98%E6%98%F-64-%E4%BD%D%E7%89%88%E6%9C%AC%E7%9A%84-windows-%E6%93%8D%E4%BD%C%E7%B3%BB%E7%BB%F-1b03ca69-c5e-4b04-827b-c0c47145944b)。
- 文件名中**包含** x64 的,例如 ```Steam++_win_x64_v3.0.0.exe```。
- 32 位应用程序
- 适用于 32 位或 64 位操作系统。
- 文件名中**包含** x86 的,例如 ```Steam++_win_x86_v3.0.0.exe```。
- ~~ARM64 应用程序~~(适配中…)
- 适用于使用 Arm64 CPU 的设备,例如 **微软 Surface Pro X/Surface Pro 9 5G** 等使用高通骁龙、联发科动处理的设备。
- 文件名中**包含** arm64 的,例如 ```Steam++_win_arm64_v3.0.0.exe```。
- 独立应用([SCD](https://learn.microsoft.com/zh-cn/dotnet/core/deploying/#publish-self-ontained)),会应用中包含 .NET 运行时,该应用的用户无需在运行应用前安装 .NET。 (推荐)
- 文件名中**不包含** fde 的,例如 ```Steam++_win_x64_v3.0.0.exe```。
- 依赖于框架的应用([FDE](https://learn.microsoft.com/zh-cn/dotnet/core/deploying/#publish-ramework-ependent)),则该应用不包含 .NET 运行时和库,而仅包含该应用和第三方依赖项。
- 文件名中**包含** fde 的,例如 ```Steam++_win_x64_fde_v3.0.0.exe```。
- 依赖于框架的应用相比独立应用因共享运行时,可减少本应用占用的磁盘空间,且运行时可由 Windows 更新进行安全补丁修复。
- 需要安装以下运行时
- ASP.NET 运行时 7.x
- ASP.NET Core 运行时 7.x
- 此应用不需要 IIS 支持,可仅安装相关运行时而不是托管捆绑包。
## macOS
- ARM64 应用程序
- 适用于使用 ARM64(Apple Silicon) 芯片的 Mac,例如 **Apple M1/M2**。
- 文件名中**包含** x64 的,例如 ```Steam++_macos_arm64_v3.0.0.dmg```。
- 64 位应用程序
- 适用于使用 Intel 的 x64(x86-64) 芯片的 Mac。
- 文件名中**包含** x64 的,例如 ```Steam++_macos_x64_v3.0.0.dmg```。
- ~~通用包~~(适配中…)
- 所有版本的二进制文件都包含在此包中,适用于所有支持的设备,但文件体积较大。
## Linux
- 64 位应用程序
- 适用于使用 Intel、AMD 的 x64(x86-64) 芯片的设备。
- 文件名中**包含** x64 的,例如 ```Steam++_linux_x64_v3.0.0.tar.zst```。
- ARM64 应用程序
- 适用于使用 ARM64 芯片的设备,例如 **Raspberry Pi Model 3+**。
- 文件名中**包含** x64 的,例如 ```Steam++_linux_arm64_v3.0.0.tar.zst```。
## Android
- 通用包(推荐)
- 所有版本的二进制文件都包含在此包中,适用于所有支持的设备,但文件体积较大。
- 文件名中**仅包含** android 的,例如 ```Steam++_android_v3.0.0.apk```。
- ~~arm64-v8a~~(已弃用…)
- 适用于使用目前主流的手机或平板设备
- 文件名中**包含** arm64_v8a 的,例如 ```Steam++_android_arm64_v8a_v3.0.0.apk```。
- ~~armeabi-v7a~~(已弃用…)
- 适用于使用老旧的手机或平板设备,通常为 **2014** 年下半年之前生产的设备。
- 文件名中**包含** armeabi_v7a 的,例如 ```Steam++_android_armeabi_v7a_v3.0.0.apk```。
- ~~x86_64~~(已弃用…)
- 适用于使用 Intel、AMD 的 x64(x86-64) 芯片的设备,例如 PC 上的模拟器。
- 文件名中**包含** x64 的,例如 ```Steam++_android_x64_v3.0.0.apk```。
## ~~iOS/iPadOS~~(开发中…) <img src="../res/brands/apple.svg" width="16" height="16" />
- 在 App Store 中下载
<!--
TODO: new fileName
Steam++_win_x64_v3.0.0.exe
Steam++_win_x64_v3.0.0.7z
Steam++_win_x64_with_runtime_v3.0.0.exe
Steam++_win_x64_with_runtime_v3.0.0.7z
-->
+1
View File
@@ -0,0 +1 @@
### [OpenWrt](https://openwrt.org/start)
+152
View File
@@ -0,0 +1,152 @@
# 前言
Steam++是一款开源的跨平台Steam工具箱,请不要在非官方渠道下载软件,
[官网](https://www.steampp.net),大家可以去官网或者开源仓库地址下载。
# Steam++工具箱
## 2.6.2更新内容
微软商店版本在微软商店检查获取更新即可,一般会比桌面版晚上一天的审核时间。
### 版本亮点
1. ASF 升级至 **V5.2.0.10**
2. 新增 ASF 控制台字体大小、最大行数设置项
3. 新增 Steam 下载完成定时关机、睡眠功能
4. 新增 代理设置可自定义 DNS
5. 新增 ASF 编辑/移除 Bot 功能
6. 新增 Microsoft/Xbox 相关加速服务 (需要升级到 **2.6.2** 之后可用)
7. 新增 Uplay 相关加速服务 (需要升级到 **2.6.2** 之后可用)
8. 新增 OneDrive 等更多相关加速服务 (需要升级到 **2.6.2** 之后可用)
9. 优化 Desktop 加速代理性能
10. 优化 Desktop 脚本注入打包的性能
11. 优化 Desktop 已安装游戏加载性能
12. 从此版本开始将使用 Github Action 自动化部署发布
### 修复问题
1. 改进 Desktop 网络加速现默认使用阿里 DNS(223.5.5.5, 223.6.6.6)
2. 改进 自动更新包文件校验失败时提示
3. 改进 自动更新失败时将自动跳转官网
4. 改进 ASF IPC 默认端口号由 1242 改为 6242
5. 修复 Linux 与 macOS 中 ASF-UI 解压包文件夹分隔符不正确
6. 修复 Windows Hosts 只读时尝试取消只读属性的操作没有正确执行
7. 修复 Windows 此软件自动更新删除更新包缓存时因文件占用引发的中断
8. 修复 Desktop 高 DPI 下动态桌面错位
9. 修复 本地令牌确认交易在登录时可能会卡住
10. 修复 Windows 启用动态桌面后全屏可能导致窗口冻结无法操作
11. 修复 Windows 动态背景有时会被其他窗口遮挡
12. 改进 本地令牌 登录验证码无法加载时可点击在浏览器中查看验证码图片
13. 修复 Desktop 加速代理中可能出现的一些错误
14. 改进 Desktop 令牌详情 UI
15. 改进 Desktop 账号切换中的用户名信息现在默认隐藏
16. 改进 Desktop 深色模式与浅色模式的视觉效果
17. 修复 Pixiv 加速不能登录的问题
18. 修复 Twitch 加速不计算掉宝进度的问题
19. 修复 Discord 加速检测更新失败导致无法启动客户端的问题
20. 修复 Windows 因添加 JumpList 时可能导致的闪退
21. 修复 Desktop 本地令牌 点击锁定后输入密码按回车解锁会循环无限触发锁定的问题
[![steampp.net](https://img.shields.io/badge/WebSite-steampp.net-brightgreen.svg?style=flat-square&color=61dafb)](https://steampp.net)
[![Steam++ v2.6.2](https://img.shields.io/badge/Steam++-v2.6.2-brightgreen.svg?style=flat-square&color=512bd4)]()
------
## 工具介绍
`Steam++`是一款开源的跨平台Steam工具箱,所有本地功能完全免费,开源发布于Github,如果您对发布的二进制文件不放心,可以自行下载源码编译运行。
此工具的大部分功能都是需要您下载安装Steam才能使用。
工具预计将整合进大部分常用的Steam相关工具,并且尽力做到比原工具更好用。
软件截图
[hide]
[attachimg]1463881[/attachimg]
[attachimg]1463882[/attachimg]
[attachimg]1463884[/attachimg]
[attachimg]1463899[/attachimg]
[/hide]
## 核心功能
### 1. 通过本地反代理Steam的社区等网页使其能正常访问
功能使用Titanium-Web-Proxy开源项目进行本地反代,相比SteamCommunity302工具具有更快的启动速度。让用户能够连接上诸如Steam社区(个人资料页)、Discord语音聊天、Twitch直播观看、Origin下载加速、谷歌验证码、Pixiv图片等。
### 2. 快速切换当前PC已经记住登陆的Steam账号
该功能是读取Steam路径下存储的本地用户登录记录直接展示操作,可以多账号切换无需重新输入密码和令牌。如果您的ip地址更换,会导致登陆状态失效。
### 3. Steam游戏成就管理
能够读取任何游戏的成就信息(包括隐藏成就),并且能进行成就修改,包括成就解锁以及成就反解锁,还能够修改成就统计信息
参考SAM(SteamAchievementManager)进行二次开发,修复了成就语言有中文却依然是英文成就信息的BUG,修改了游戏列表的加载和操作易用性。
注意:滥用成就管理功能可能会导致开发者封禁!
[attachimg]1463887[/attachimg]
### 4. Steam本地两步身份验证器
该功能能够将Steam手机令牌储存到您的电脑中,并能够进行与手机端一样的操作。
不仅能查看手机令牌,还能进行交易报价确认,并且能一键全部确认。
功能参考WinAuth开发,功能类似的软件有WinAuth、SteamDesktopAuthenticator。
本地令牌交易市场报价确认
[attachimg]1463890[/attachimg]
### 5. Steam内置浏览器脚本注入
通过反代加速功能将js脚本内置插入了Steam客户端内的浏览器,达到了与油猴类似的效果。目前2.0.0.6版本新增了脚本工坊,可以从我们的服务器上下载到已经兼容的脚本。我们也会不断添加新的脚本,同时也会对旧的脚本进行维护。
[attachimg]1463883[/attachimg]
### 6.Steam家庭库共享排序
可以排序你的共享库存顺序,避免只能读取A的共享游戏,却想玩B的共享游戏。
### 7.Steam监控下载完成定时关机
可以监控Steam下载列表所有游戏的下载进度并设置下载完成后自动关机或睡眠电脑,节约你的电费。
### 8.已内置ASF挂卡功能
[ASF](https://github.com/JustArchiNET/ArchiSteamFarm)大家肯定都不陌生,它实在是太好用了,所以我们内置了ASF在Steam++内,并在后续会对ASF在UI环境下使用做更多增强体验。
### 10. 更多的游戏工具功能
支持各种老游戏无边框窗口化等等
#### 并且,以上功能全部免费。
Linux 截图:
[attachimg]1463884[/attachimg]
------
## 运行环境
> 程序使用C# 在 .NET 6.0环境下开发,新版采用独立部署编译,不需要运行环境也可以运行)。
RuntimeIdentifier | Available | Edition
--- | --- | ---
win-x64 | ✅ | Stable
osx-x64 | ✅ | β
linux-x64 | ✅ | α
android-arm64 | ✅ | α
android-arm | ✅ | α
linux-arm64 | ✅ | α
linux-arm | ✅ | α
osx-arm64 | ❌ |
win-arm64 | ❌ |
ios-arm64 | ❌ |
## 下载
> [官网](https://steampp.net/)
> [Github](https://github.com/rmbadmin/SteamTools/releases)
> [Gitee](https://gitee.com/rmbgame/SteamTools/releases)
> [Microsoft Store](https://www.microsoft.com/store/productId/9MTCFHS560NG)
> 分流下载:
> [hide]
> [蓝奏云](https://cliencer.lanzoux.com/b0165duja)
> 提取码:1234
> [/hide]
> 使用过程中可能遇到windows defender误报,您可以选择添加信任。
-8
View File
@@ -1,8 +0,0 @@
{
"msbuild-sdks": {
"MSBuild.Sdk.Extras": "3.0.22"
},
"sdk": {
"version": "6.0.100-preview.4.21255.9"
}
}
-7
View File
@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="dotnet-experimental" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental/nuget/v3/index.json" />
<add key="AvaloniaCI" value="https://nuget.avaloniaui.net/repository/avalonia-all/index.json" />
</packageSources>
</configuration>
-1
View File
@@ -1 +0,0 @@
dotnet publish ..\source\SteamTools -c Release -f net5.0-windows -r win-x86 - /p:PublishSingleFile=true /p:PublishTrimmed=true -o out/result
-318
View File
@@ -1,318 +0,0 @@
function Main
{
begin
{
$ErrorActionPreference = 'stop'
$target = 'net472'
$result = 'Steam++'
$bin = '..\source\SteamTools\bin\x86\Release\'
# '*.exe.config'
$targetKeywords = '*.exe','*.dll','*.txt','*.VisualElementsManifest.xml','*.pak','*.bin','*.js','Log4net.config'
$ignoreKeywords = '*.vshost.*','Microsoft.*.resources.dll','ExPlugin.*.dll'
$exeSource = '\Steam++.exe'
if (-not(Test-Path $bin))
{
throw 'Script detected as locate in invalid path exception!! Make sure exist in <SteamTools repository root>\tools-release\'
}
}
end
{
try
{
# clean up current
Get-ChildItem -Directory | Remove-item -Recurse
Get-ChildItem | where { $_.Extension -eq ".zip" } | Remove-Item
Copy-StrictedFilterFileWithDirectoryStructure -Path $(Join-Path $bin $target) -Destination '.\' -Targets $targetKeywords -Exclude $ignoreKeywords
# valid path check
$versionSource = Join-Path $target $exeSource -Resolve
if ((Test-Path $versionSource) -and (Test-Path $target))
{
$version = (Get-ChildItem $versionSource).VersionInfo
$result = $result + ' v{0}.{1}.{2}' -f $version.ProductMajorPart, $version.ProductMinorPart,$version.ProductBuildPart
Rename-Item -NewName $result -Path $target
New-ZipCompression -source $(Join-Path $(Get-Location) $result) -destination $(Join-Path $(Get-Location).Path ('./' + $result + '.zip'))
}
}
catch
{
throw $_
}
}
}
# https://gist.github.com/guitarrapc/e78bbd4ddc07389e17d6
function Copy-StrictedFilterFileWithDirectoryStructure
{
[CmdletBinding()]
param
(
[parameter(
mandatory = 1,
position = 0,
ValueFromPipeline = 1,
ValueFromPipelineByPropertyName = 1)]
[string]
$Path,
[parameter(
mandatory = 1,
position = 1,
ValueFromPipelineByPropertyName = 1)]
[string]
$Destination,
[parameter(
mandatory = 1,
position = 2,
ValueFromPipelineByPropertyName = 1)]
[string[]]
$Targets,
[parameter(
mandatory = 0,
position = 3,
ValueFromPipelineByPropertyName = 1)]
[string[]]
$Excludes
)
begin
{
$list = New-Object 'System.Collections.Generic.List[String]'
}
process
{
Foreach ($target in $Targets)
{
# Copy "All Directory Structure" and "File" which Extension type is $ex
Copy-Item -Path $Path -Destination $Destination -Force -Recurse -Filter $target
}
}
end
{
# Remove -Exclude Item
Foreach ($exclude in $Excludes)
{
Get-ChildItem -Path $Destination -Recurse -File | where Name -like $exclude | Remove-Item
}
# search Folder which include file
$allFolder = Get-ChildItem $Destination -Recurse -Directory
$containsFile = $allFolder | where {$_.GetFiles()}
$containsFile.FullName `
| %{
$fileContains = $_
$result = $allFolder.FullName `
| where {$_ -notin $list} `
| where {
$shortPath = $_
$fileContains -like "$shortPath*"
}
$result | %{$list.Add($_)}
}
$folderToKeep = $list | sort -Unique
# Remove All Empty (none file exist) folders
Get-ChildItem -Path $Destination -Recurse -Directory | where fullName -notin $folderToKeep | Remove-Item -Recurse
}
}
# http://tech.guitarrapc.com/entry/2013/10/08/040325
function New-ZipCompression
{
[CmdletBinding()]
param
(
[parameter(
mandatory,
position = 0,
valuefrompipeline,
valuefrompipelinebypropertyname)]
[string]
$source,
[parameter(
mandatory = 0,
position = 1,
valuefrompipeline,
valuefrompipelinebypropertyname)]
[string]
$destination,
[parameter(
mandatory = 0,
position = 2)]
[switch]
$quiet,
[parameter(
mandatory = 0,
position = 3)]
[switch]
$force
)
try
{
Add-Type -AssemblyName 'System.IO.Compression.FileSystem'
}
catch
{
}
# check file is directory
$file = Get-Item -Path $source
# set zip extension
$zipExtension = '.zip'
# set desktop as destination path if it null
if ([string]::IsNullOrWhiteSpace($destination))
{
if ($file.Mode -like 'd*')
{
$destination = (Join-Path ([System.Environment]::GetFolderPath([Environment+SpecialFolder]::Desktop)) [System.IO.Path]::GetFileNameWithoutExtension($source + $zipExtension))
}
else
{
$destination = (Join-Path ([System.Environment]::GetFolderPath([Environment+SpecialFolder]::Desktop)) [System.IO.Path]::GetFileNameWithoutExtension(($file | select -First 1 -ExpandProperty fullname))) + $zipExtension
}
}
# check destination is input as .zip
if (-not($destination.EndsWith($zipExtension)))
{
throw ('destination parameter value [{0}] not end with extension {1}' -f $destination, $zipExtension)
}
# check destination is already exist or not
if (Test-Path $destination)
{
Remove-Item -Path $destination -Confirm
}
# compressionLevel
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
# check file mode for source
Write-Verbose ('file.mode = {0}' -f $file.Mode)
if ($file.Mode -like 'd*') # Directory should be d---
{
try # create zip from directory
{
# force output zip file to new destination path, avoiding destination zip name conflict.
if ($force)
{
# check destination is already exist, CreateFromDirectory will fail with same name of destination file.
if (Test-Path $destination)
{
# show warning for same destination exist.
Write-Verbose ('Detected destination name {0} is already exist. Force trying output to new destination zip name.' -f $destination)
# get current destination information
$destinationRoot = [System.IO.Path]::GetDirectoryName($destination)
$destinationfile = [System.IO.Path]::GetFileNameWithoutExtension($destination)
$destinationExtension = [System.IO.Path]::GetExtension($destination)
# renew destination name with (2)...(x) until no more same name catch.
$count = 2
$destination = Join-Path $destinationRoot ($destinationfile + '(' + $count + ')' + $destinationExtension)
while (Test-Path $destination)
{
++$count
$destination = Join-Path $destinationRoot ($destinationfile + '(' + $count + ')' + $destinationExtension)
}
# show warning as destination name had been changed due to escape error.
Write-Verbose ('Deistination name change to new name {0}' -f $destination)
}
}
# include BaseDirectory
$includeBaseDirectory = $true
Write-Verbose ('destination = {0}' -f $destination)
Write-Verbose ('file.fullname = {0}' -f $file.FullName)
Write-Verbose ('compressionLevel = {0}' -f $compressionLevel)
Write-Verbose ('includeBaseDirectory = {0}' -f $includeBaseDirectory)
if ($quiet)
{
Write-Verbose ('zipping up folder {0} to {1}' -f $file.FullName,$destination)
[System.IO.Compression.ZipFile]::CreateFromDirectory($file.fullname,$destination,$compressionLevel,$includeBaseDirectory) > $null
$?
}
else
{
Write-Verbose ('zipping up folder {0} to {1}' -f $file.FullName,$destination)
[System.IO.Compression.ZipFile]::CreateFromDirectory($file.fullname,$destination,$compressionLevel,$includeBaseDirectory)
Get-Item $destination
}
}
catch
{
Write-Error $_
$?
}
}
else
{
try # create zip from files
{
# create zip to add
$destzip = [System.IO.Compression.Zipfile]::Open($destination,'Update')
# get items
$files = Get-ChildItem -Path $source
foreach ($file in $files)
{
$file2 = $file.name
Write-Verbose ('destzip = {0}' -f $destzip)
Write-Verbose ('file.fullname = {0}' -f $file.FullName)
Write-Verbose ('file2 = {0}' -f $file2)
Write-Verbose ('compressionLevel = {0}' -f $compressionLevel)
if ($quiet)
{
Write-Verbose ('zipping up files {0} to {1}' -f $file.FullName,$destzip)
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($destzip,$file.fullname,$file2,$compressionLevel) > $null
$?
}
else
{
Write-Verbose ('zipping up files {0} to {1}' -f $file.FullName,$destzip)
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($destzip,$file.fullname,$file2,$compressionLevel)
}
}
}
catch
{
Write-Error $_
$?
}
finally
{
# dispose opened zip
$destzip.Dispose()
}
}
}
Main
Submodule ref/ArchiSteamFarm added at 26bb562481
Submodule ref/Avalonia.Image2 added at 1a65d3ef90
+1
Submodule ref/Gameloop.Vdf added at 8e3d3dca40
Submodule
+1
Submodule ref/Steam4NET added at 04f4acd815
Binary file not shown.
@@ -1,44 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!--<TargetFrameworks>netstandard2.0;netstandard2.1;net5.0</TargetFrameworks>-->
<!--<TargetFrameworks Condition="'$(OS)' == 'Windows_NT'">$(TargetFrameworks);net461</TargetFrameworks>-->
<TargetFramework>net5.0</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<!--<Configurations>Debug;Release;Nuget_Release</Configurations>-->
<Description>.NET binding for the Chromium Embedded Framework (Avalonia control)</Description>
<PackageTags>CefNet, CEF, browser, chromium, Avalonia, AvaloniaUI</PackageTags>
<DefineConstants>AvaloniaBeta;$(DefineConstants)</DefineConstants>
</PropertyGroup>
<PropertyGroup>
<DefineConstants>$(DefineConstants);TRACE;AVALONIA</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Internal\CursorInteropHelper.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\CefNet.Windows.Forms\WinApi\DWMWINDOWATTRIBUTE.cs" Link="WinApi\DWMWINDOWATTRIBUTE.cs" />
<Compile Include="..\CefNet.Wpf\Events\PdfPrintFinishedRoutedEventArgs.cs" Link="Events\PdfPrintFinishedRoutedEventArgs.cs" />
<Compile Include="..\CefNet.Wpf\Events\ScriptDialogOpeningRoutedEventArgs.cs" Link="Events\ScriptDialogOpeningRoutedEventArgs.cs" />
<Compile Include="..\CefNet.Wpf\Events\TextFoundRoutedEventArgs.cs" Link="Events\TextFoundRoutedEventArgs.cs" />
<Compile Include="..\CefNet\WebView.CommonImplementation.cs" Link="WebView.CommonImplementation.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Avalonia" Version="0.10.999-cibuild0013694-beta" />
<PackageReference Include="CefNet" Version="90.5.21109.1453" />
</ItemGroup>
<ItemGroup Condition=" Exists('$(MSBuildProjectDirectory)\..\..\..\src\Common.CoreLib\Properties\ThisAssembly.Version.cs') ">
<Compile Include="..\..\..\src\Common.CoreLib\Properties\AssemblyInfo.Version.cs">
<Link>Properties\AssemblyInfo.Version.cs</Link>
</Compile>
<Compile Include="..\..\..\src\Common.CoreLib\Properties\ThisAssembly.Version.cs">
<Link>Properties\ThisAssembly.Version.cs</Link>
</Compile>
</ItemGroup>
</Project>
@@ -1,167 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Interactivity;
using Avalonia.Threading;
namespace CefNet
{
public class CefNetApplicationLifetime : IClassicDesktopStyleApplicationLifetime, IControlledApplicationLifetime, IApplicationLifetime, IDisposable
{
private int _exitCode;
private CancellationTokenSource _cts;
private bool _isShuttingDown;
private HashSet<Window> _windows = new HashSet<Window>();
private static CefNetApplicationLifetime _activeLifetime;
/// <inheritdoc />
public string[] Args { get; internal set; }
/// <inheritdoc />
public ShutdownMode ShutdownMode { get; set; }
/// <inheritdoc />
public Window MainWindow { get; set; }
/// <inheritdoc />
public IReadOnlyList<Window> Windows
{
get { return _windows.ToList(); }
}
/// <inheritdoc />
public event EventHandler<ControlledApplicationLifetimeStartupEventArgs> Startup;
/// <inheritdoc />
public event EventHandler<ControlledApplicationLifetimeExitEventArgs> Exit;
static CefNetApplicationLifetime()
{
Window.WindowOpenedEvent.AddClassHandler(typeof(Window), new EventHandler<RoutedEventArgs>(OnWindowOpened));
Window.WindowClosedEvent.AddClassHandler(typeof(Window), new EventHandler<RoutedEventArgs>(WindowClosedEvent));
}
private static void WindowClosedEvent(object sender, RoutedEventArgs e)
{
var window = sender as Window;
if (window is null)
return;
_activeLifetime?._windows.Remove(window);
_activeLifetime?.HandleWindowClosed(window);
}
private static void OnWindowOpened(object sender, RoutedEventArgs e)
{
var window = sender as Window;
if (window is null)
return;
_activeLifetime?._windows.Add(window);
}
public CefNetApplicationLifetime()
{
if (_activeLifetime is null)
_activeLifetime = this;
else
throw new InvalidOperationException($"Can not have multiple active {this.GetType().Name} instances and the previously created one was not disposed.");
}
protected virtual void HandleWindowClosed(Window window)
{
if (window != null && !_isShuttingDown)
{
if (ShutdownMode == ShutdownMode.OnLastWindowClose && _windows.Count == 0)
{
Shutdown();
}
else if (ShutdownMode == ShutdownMode.OnMainWindowClose && window == MainWindow)
{
Shutdown();
}
}
}
public void Shutdown(int exitCode = 0)
{
if (_isShuttingDown)
throw new InvalidOperationException("Application is already shutting down.");
_exitCode = exitCode;
_isShuttingDown = true;
try
{
foreach (Window window in Windows)
{
window.Close();
}
CefNetApplication.Instance.SignalForShutdown(ShutdownComplete);
}
catch
{
ShutdownComplete();
throw;
}
}
private void ShutdownComplete()
{
_cts?.Cancel();
_cts = null;
_isShuttingDown = false;
}
public int Start(string[] args)
{
try
{
this.Startup?.Invoke(this, new ControlledApplicationLifetimeStartupEventArgs(args));
_cts = new CancellationTokenSource();
MainWindow?.Show();
Dispatcher.UIThread.MainLoop(_cts.Token);
ControlledApplicationLifetimeExitEventArgs e = new ControlledApplicationLifetimeExitEventArgs(_exitCode);
this.Exit?.Invoke(this, e);
Environment.ExitCode = e.ApplicationExitCode;
return e.ApplicationExitCode;
}
finally
{
CefNetApplication.Instance.Shutdown();
}
}
public void Dispose()
{
if (_activeLifetime == this)
_activeLifetime = null;
}
}
public static class CefNetApplicationLifetimeExtensions
{
public static int StartWithCefNetApplicationLifetime<T>(this T builder, string[] args, ShutdownMode shutdownMode = ShutdownMode.OnLastWindowClose)
where T : AppBuilderBase<T>, new()
{
CefNetApplicationLifetime lifetime = new CefNetApplicationLifetime
{
Args = args,
ShutdownMode = shutdownMode
};
builder.SetupWithLifetime(lifetime);
return lifetime.Start(args);
}
}
}
@@ -1,199 +0,0 @@
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Media;
using CefNet.Input;
using CefNet.Internal;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
namespace CefNet.Avalonia
{
public static class CefNetAvaloniaExtensions
{
#pragma warning disable IDE0060
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static void Invoke<TEventArgs>(this RoutedEvent routedEvent, Interactive sender, TEventArgs e)
where TEventArgs : class
{
sender.RaiseEvent(e as RoutedEventArgs);
}
#pragma warning restore IDE0060
/// <summary>
/// Converts the specified <see cref="Key"/> into a virtual key.
/// </summary>
/// <param name="key">The key code.</param>
/// <returns>The virtual key code.</returns>
public static VirtualKeys ToVirtualKey(this Key key)
{
if (key >= Key.LeftShift && key <= Key.RightAlt)
return (VirtualKeys)((key - Key.LeftShift) >> 1) | VirtualKeys.ShiftKey; // VK_SHIFT, VK_CONTROL, VK_MENU
if (key == Key.System)
return VirtualKeys.Menu; // VK_MENU
return (VirtualKeys)KeyInterop.VirtualKeyFromKey(key);
}
public static Color ToColor(this CefColor color)
{
return Color.FromArgb(color.A, color.R, color.G, color.B);
}
/// <summary>
/// Converts a drag drop effects to the CEF dragging operation mask.
/// </summary>
/// <param name="self">The drag drop effects.</param>
/// <returns></returns>
public static CefDragOperationsMask ToCefDragOperationsMask(this DragDropEffects self)
{
CefDragOperationsMask effects = CefDragOperationsMask.None;
if (self.HasFlag(DragDropEffects.Copy))
effects |= CefDragOperationsMask.Copy;
if (self.HasFlag(DragDropEffects.Move))
effects |= CefDragOperationsMask.Move;
if (self.HasFlag(DragDropEffects.Link))
effects |= CefDragOperationsMask.Link;
return effects;
}
/// <summary>
/// Converts the CEF dragging operation mask to drag drop effects.
/// </summary>
/// <param name="self">The CEF dragging operation mask.</param>
/// <returns></returns>
public static DragDropEffects ToDragDropEffects(this CefDragOperationsMask self)
{
DragDropEffects effects = DragDropEffects.None;
if (self.HasFlag(CefDragOperationsMask.Every))
effects |= DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move;
if (self.HasFlag(CefDragOperationsMask.Copy))
effects |= DragDropEffects.Copy;
if (self.HasFlag(CefDragOperationsMask.Move))
effects |= DragDropEffects.Move;
if (self.HasFlag(CefDragOperationsMask.Link))
effects |= DragDropEffects.Link;
return effects;
}
/// <summary>
/// Gets the current state of the SHIFT, CTRL, and ALT keys, as well as the state of the mouse buttons.
/// </summary>
/// <param name="e">The <see cref="DragEventArgs"/> instance containing the event data.</param>
/// <returns></returns>
public static CefEventFlags GetModifiers(this DragEventArgs e)
{
#pragma warning disable CS0618 // Obsoleted InputModifiers
CefEventFlags flags = CefEventFlags.None;
InputModifiers state = e.Modifiers;
if (state.HasFlag(InputModifiers.LeftMouseButton))
flags |= CefEventFlags.LeftMouseButton;
if (state.HasFlag(InputModifiers.RightMouseButton))
flags |= CefEventFlags.RightMouseButton;
if (state.HasFlag(InputModifiers.Shift))
flags |= CefEventFlags.ShiftDown;
if (state.HasFlag(InputModifiers.Control))
flags |= CefEventFlags.ControlDown;
if (state.HasFlag(InputModifiers.MiddleMouseButton))
flags |= CefEventFlags.MiddleMouseButton;
if (state.HasFlag(InputModifiers.Alt))
flags |= CefEventFlags.AltDown;
if (state.HasFlag(InputModifiers.Windows))
flags |= CefEventFlags.CommandDown;
return flags;
#pragma warning restore CS0618
}
/// <summary>
/// Gets the drag data.
/// </summary>
/// <param name="e">The <see cref="DragEventArgs"/> instance containing the event data.</param>
public static CefDragData GetCefDragData(this DragEventArgs e)
{
CefDragData dragData;
if (e.Data.Contains(nameof(CefDragData)))
{
dragData = (CefDragData)e.Data.Get(nameof(CefDragData));
if (dragData != null)
{
dragData.ResetFileContents();
return dragData;
}
}
dragData = new CefDragData();
string[] formats = e.Data.GetDataFormats().ToArray();
if (TryGetFileDropData(e.Data, out IEnumerable<string> fileNames))
{
foreach (string filePath in fileNames)
{
dragData.AddFile(filePath.Replace("\\", "/"), Path.GetFileName(filePath));
}
}
bool isUrl = false;
string s = GetUrlString(e.Data, formats);
if (!string.IsNullOrWhiteSpace(s))
{
isUrl = true;
dragData.LinkUrl = s;
}
if (formats.Contains(CefNetDragData.DataFormatUnicodeText))
{
s = (string)e.Data.Get(CefNetDragData.DataFormatUnicodeText);
if (!isUrl && Uri.IsWellFormedUriString(s, UriKind.Absolute))
dragData.LinkUrl = s;
dragData.FragmentText = s;
}
else if (formats.Contains(DataFormats.Text))
{
s = (string)e.Data.Get(DataFormats.Text);
if (!isUrl && Uri.IsWellFormedUriString(s, UriKind.Absolute))
dragData.LinkUrl = s;
dragData.FragmentText = s;
}
if (formats.Contains(CefNetDragData.DataFormatHtml))
{
dragData.FragmentHtml = Encoding.UTF8.GetString((byte[])e.Data.Get(CefNetDragData.DataFormatHtml));
}
else if (formats.Contains(CefNetDragData.DataFormatTextHtml))
{
dragData.FragmentHtml = Encoding.UTF8.GetString((byte[])e.Data.Get(CefNetDragData.DataFormatTextHtml));
}
return dragData;
}
private static bool TryGetFileDropData(IDataObject data, out IEnumerable<string> fileNames)
{
if (data.Contains(CefNetDragData.DataFormatFileDrop))
fileNames = (IEnumerable<string>)data.Get(CefNetDragData.DataFormatFileDrop);
else if (data.Contains(CefNetDragData.DataFormatFileNames))
fileNames = (IEnumerable<string>)data.Get(CefNetDragData.DataFormatFileNames);
else
fileNames = null;
return fileNames != null;
}
private static string GetUrlString(IDataObject data, string[] formats)
{
if (formats.Contains(CefNetDragData.DataFormatUnicodeUrl))
return Encoding.Unicode.GetString((byte[])data.Get(CefNetDragData.DataFormatUnicodeUrl));
if (formats.Contains(CefNetDragData.DataFormatUrl))
return Encoding.ASCII.GetString((byte[])data.Get(CefNetDragData.DataFormatUrl));
return null;
}
}
}
@@ -1,138 +0,0 @@
using Avalonia.Input;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
namespace CefNet.Avalonia
{
public class CefNetDragData : IDataObject
{
internal const string DataFormatUrl = "UniformResourceLocator";
internal const string DataFormatUnicodeUrl = "UniformResourceLocatorW";
internal const string DataFormatTextHtml = "text/html";
internal const string DataFormatUnicodeText = "UnicodeText";
internal const string DataFormatHtml = "HTML Format";
internal const string DataFormatFileDrop = "FileDrop";
internal const string DataFormatFileNames = "FileNames";
public const string DataFormatCefNetDragData = nameof(CefNetDragData);
public const string DataFormatCefDragData = nameof(CefDragData);
private WeakReference<WebView> _source;
private HashSet<string> _formats;
/// <summary>
/// Initializes a new instance of the <see cref="CefNetDragData"/> class.
/// </summary>
/// <param name="source">The source of the drag event.</param>
/// <param name="data">The original drag data.</param>
public CefNetDragData(WebView source, CefDragData data)
{
var formats = new HashSet<string>();
formats.Add(DataFormatCefNetDragData);
formats.Add(DataFormatCefDragData);
if (data.IsFile)
{
formats.Add(DataFormatFileDrop);
formats.Add(DataFormatFileNames);
}
if (data.IsLink)
{
formats.Add(DataFormatUnicodeUrl);
formats.Add(DataFormatUnicodeText);
}
if (data.IsFragment)
{
formats.Add(DataFormatUnicodeText);
formats.Add(DataFormatHtml);
formats.Add(DataFormatTextHtml);
}
_source = new WeakReference<WebView>(source);
_formats = formats;
this.Data = data;
}
/// <summary>
/// The original drag data.
/// </summary>
public CefDragData Data { get; }
/// <summary>
/// The source of the drag event.
/// </summary>
public WebView Source
{
get
{
if (_source.TryGetTarget(out WebView source))
return source;
return null;
}
}
public bool Contains(string format)
{
return _formats.Contains(format);
}
public object Get(string format)
{
Debug.Print("GetData: " + format);
string s;
if (DataFormatUnicodeUrl.Equals(format, StringComparison.Ordinal))
{
s = Data.LinkUrl;
return s is null ? null : new MemoryStream(Encoding.Unicode.GetBytes(s));
}
if (DataFormatUrl.Equals(format, StringComparison.Ordinal))
{
s = Data.LinkUrl;
return s is null ? null : new MemoryStream(Encoding.ASCII.GetBytes(s));
}
if (DataFormatUnicodeText.Equals(format, StringComparison.Ordinal))
{
if (Data.IsLink)
return Data.LinkUrl;
return Data.FragmentText;
}
if (DataFormatHtml.Equals(format, StringComparison.Ordinal))
return Data.FragmentHtml;
if (DataFormats.Text.Equals(format, StringComparison.Ordinal))
return Data.FragmentText;
if (DataFormatTextHtml.Equals(format, StringComparison.Ordinal))
return Data.FragmentHtml;
if (DataFormatCefDragData.Equals(format, StringComparison.Ordinal))
return Data;
if (DataFormatCefNetDragData.Equals(format, StringComparison.Ordinal))
return this;
return null;
}
public IEnumerable<string> GetDataFormats()
{
return _formats;
}
public IEnumerable<string> GetFileNames()
{
using (var list = new CefStringList())
{
Data.GetFileNames(list);
foreach (string s in list)
yield return s;
}
}
public string GetText()
{
if (Data.IsLink)
return Data.LinkUrl;
return Data.FragmentText;
}
}
}
@@ -1,19 +0,0 @@
using Avalonia.Input;
using System;
using System.ComponentModel;
namespace CefNet.Avalonia
{
public class CursorChangeEventArgs : HandledEventArgs
{
public CursorChangeEventArgs(Cursor cursor, CefCursorType cursorType)
{
this.Cursor = cursor;
this.CursorType = cursorType;
}
public Cursor Cursor { get; }
public CefCursorType CursorType { get; }
}
}
@@ -1,140 +0,0 @@
#if MODERNFORMS
using Modern.Forms;
#else
using Avalonia;
using Avalonia.Input;
using Avalonia.Media.Imaging;
using Avalonia.Platform;
#endif
using CefNet.Internal;
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
#if MODERNFORMS
namespace CefNet.Modern.Forms
#else
namespace CefNet.Avalonia
#endif
{
public sealed class CustomCursor
{
public unsafe static Cursor Create(ref CefCursorInfo cursorInfo)
{
return Cursor.Default; // Not supported
/*
CefSize size = cursorInfo.Size;
var bufferSize = size.Width * size.Height * 4;
int ICON_HEADER_SIZE = sizeof(ICONDIR);
var stream = new MemoryStream(bufferSize);
{
if (stream.Seek(ICON_HEADER_SIZE, SeekOrigin.Begin) != ICON_HEADER_SIZE)
{
stream.Seek(0, SeekOrigin.Begin);
stream.Write(new byte[ICON_HEADER_SIZE], 0, ICON_HEADER_SIZE);
}
using (var image = new WriteableBitmap(new PixelSize(size.Width, size.Height), OffscreenGraphics.Dpi, PixelFormat.Bgra8888))
{
using (ILockedFramebuffer frameBuffer = image.Lock())
{
System.Runtime.CompilerServices.Unsafe.CopyBlock((void*)frameBuffer.Address, (void*)cursorInfo.Buffer, (uint)bufferSize);
}
image.Save(stream); // Save in png format!!!
}
stream.Seek(0, SeekOrigin.Begin);
}
CefPoint hotSpot = cursorInfo.Hotspot;
var icon = new ICONDIR();
icon.IconType = 2;
icon.ImagesCount = 1;
icon.Width = (byte)size.Width;
icon.Height = (byte)size.Height;
icon.HotSpotX = (short)hotSpot.X;
icon.HotSpotY = (short)hotSpot.Y;
icon.BytesInRes = (int)stream.Length - ICON_HEADER_SIZE;
icon.ImageOffset = ICON_HEADER_SIZE;
using (var iconHead = new UnmanagedMemoryStream(icon._data, ICON_HEADER_SIZE))
{
iconHead.CopyTo(stream);
stream.Seek(0, SeekOrigin.Begin);
}
return new Cursor(stream);
*/
}
[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 22)]
unsafe struct ICONDIR
{
[FieldOffset(0)]
public fixed byte _data[22];
/// <summary>
/// Reserved. Must always be 0.
/// </summary>
[FieldOffset(0)]
public short IDReserved;
/// <summary>
/// Specifies image type: 1 for icon (.ICO) image, 2 for cursor (.CUR) image.
/// </summary>
[FieldOffset(2)]
public short IconType;
/// <summary>
/// Specifies number of images in the file.
/// </summary>
[FieldOffset(4)]
public short ImagesCount;
/// <summary>
/// Specifies image width in pixels. Can be any number between 0 and 255. Value 0 means image width is 256 pixels.
/// </summary>
[FieldOffset(6)]
public byte Width;
/// <summary>
/// Specifies image height in pixels. Can be any number between 0 and 255. Value 0 means image height is 256 pixels.
/// </summary>
[FieldOffset(7)]
public byte Height;
/// <summary>
/// Specifies number of colors in the color palette. Should be 0 if the image does not use a color palette.
/// </summary>
[FieldOffset(8)]
public byte ColorCount;
/// <summary>
/// Reserved. Should be 0.
/// </summary>
[FieldOffset(9)]
public byte IDEReserved;
/// <summary>
/// Specifies the horizontal coordinates of the hotspot in number of pixels from the left.
/// </summary>
[FieldOffset(10)]
public short HotSpotX;
/// <summary>
/// Specifies the vertical coordinates of the hotspot in number of pixels from the top.
/// </summary>
[FieldOffset(12)]
public short HotSpotY;
/// <summary>
/// Specifies the size of the image's data in bytes
/// </summary>
[FieldOffset(14)]
public int BytesInRes;
/// <summary>
/// Specifies the offset of BMP or PNG data from the beginning of the ICO/CUR file
/// </summary>
[FieldOffset(18)]
public int ImageOffset;
}
}
}
@@ -1,121 +0,0 @@
using Avalonia;
using Avalonia.Collections;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Media;
using Avalonia.Threading;
using CefNet.Avalonia;
using System;
using System.Threading.Tasks;
namespace CefNet.Internal
{
internal sealed class AvaloniaContextMenuRunner
{
private readonly MenuModel Model;
private CefRunContextMenuCallback Callback;
private ContextMenu Menu;
private TaskCompletionSource<bool> _completionSource;
public AvaloniaContextMenuRunner(CefMenuModel model, CefRunContextMenuCallback callback)
{
Model = MenuModel.FromCefMenu(model);
Callback = callback;
}
public void Build()
{
if (Menu != null)
throw new InvalidOperationException();
Menu = new ContextMenu();
Menu.MenuClosed += Menu_Closed;
Build(Model, (AvaloniaList<object>)Menu.Items);
}
private void Menu_Closed(object sender, RoutedEventArgs e)
{
Cancel();
}
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
var clickedItem = sender as MenuItem;
object cid = clickedItem?.Tag;
if (cid != null)
{
Callback.Continue((int)cid, CefEventFlags.LeftMouseButton);
Callback = null;
}
}
public Task CompletionTask
{
get { return _completionSource?.Task; }
}
private void Build(MenuModel model, AvaloniaList<object> menu)
{
int count = model.Count;
for (int i = 0; i < count; i++)
{
bool isSubmenu = false;
MenuItem menuItem;
switch (model.GetTypeAt(i))
{
case CefMenuItemType.Separator:
menu.Add(new Separator());
continue;
case CefMenuItemType.Check:
menuItem = new MenuItem();
menuItem.Icon = new CheckBox() { IsChecked = model.IsCheckedAt(i), Margin = new Thickness(-2, 0, 0, 0), BorderThickness = new Thickness() };
break;
case CefMenuItemType.Radio:
menuItem = new MenuItem();
menuItem.Icon = new RadioButton() { IsChecked = model.IsCheckedAt(i), Margin = new Thickness(-2, 0, 0, 0), BorderThickness = new Thickness() };
break;
case CefMenuItemType.Command:
menuItem = new MenuItem();
break;
case CefMenuItemType.Submenu:
isSubmenu = true;
menuItem = new MenuItem();
if (model.IsEnabledAt(i))
{
Build(model.GetSubMenuAt(i), (AvaloniaList<object>)menuItem.Items);
}
break;
default:
continue;
}
if (!isSubmenu)
{
menuItem.Click += MenuItem_Click;
menuItem.Tag = model.GetCommandIdAt(i);
}
menuItem.Header = model.GetLabelAt(i).Replace('&', '_');
menuItem.IsEnabled = model.IsEnabledAt(i);
//menuItem.Foreground = model.GetColorAt(i, CefMenuColorType.Text, out CefColor color) ? new SolidColorBrush(color.ToColor()) : SystemColors.MenuTextBrush;
menu.Add(menuItem);
}
}
public void RunMenuAt(Control control, Point point)
{
_completionSource = new TaskCompletionSource<bool>();
Dispatcher.UIThread.Post(() =>
{
Menu.Open(control);
_completionSource.TrySetResult(true);
});
}
public void Cancel()
{
_completionSource?.TrySetResult(false);
Callback?.Cancel();
Callback = null;
}
}
}
@@ -1,125 +0,0 @@
using Avalonia.Input;
using CefNet.Avalonia;
using System;
using System.Diagnostics;
namespace CefNet.Internal
{
public class AvaloniaWebViewGlue : WebViewGlue
{
public AvaloniaWebViewGlue(IAvaloniaWebViewPrivate view)
: base(view)
{
}
public new IAvaloniaWebViewPrivate WebView
{
get { return (IAvaloniaWebViewPrivate)base.WebView; }
}
/// <inheritdoc />
protected override bool OnCursorChange(CefBrowser browser, IntPtr cursorHandle, CefCursorType type, CefCursorInfo customCursorInfo)
{
var ea = new CursorChangeEventArgs(type != CefCursorType.Custom ? CursorInteropHelper.Create(cursorHandle) : CustomCursor.Create(ref customCursorInfo), type);
WebView.RaiseCefCursorChange(ea);
return ea.Handled;
}
/// <inheritdoc />
protected override bool OnTooltip(CefBrowser browser, ref string text)
{
WebView.CefSetToolTip(text);
return true;
}
/// <inheritdoc />
protected override void OnStatusMessage(CefBrowser browser, string message)
{
WebView.CefSetStatusText(message);
}
/// <summary>
/// Called when the user starts dragging content in the web view. OS APIs that run a system message
/// loop may be used within the StartDragging call. Don't call any of CefBrowserHost::DragSource*Ended*
/// methods after returning false. Call CefBrowserHost::DragSourceEndedAt and DragSourceSystemDragEnded
/// either synchronously or asynchronously to inform the web view that the drag operation has ended.
/// </summary>
/// <param name="browser"></param>
/// <param name="dragData">The contextual information about the dragged content.</param>
/// <param name="allowedOps"></param>
/// <param name="x">The X-location in screen coordinates.</param>
/// <param name="y">The Y-location in screen coordinates.</param>
/// <returns>Return false to abort the drag operation or true to handle the drag operation.</returns>
protected override bool StartDragging(CefBrowser browser, CefDragData dragData, CefDragOperationsMask allowedOps, int x, int y)
{
var e = new StartDraggingEventArgs(dragData, allowedOps, x, y);
WebView.RaiseStartDragging(e);
return e.Handled;
}
/// <summary>
/// Called when the web view wants to update the mouse cursor during a drag &amp; drop operation.
/// </summary>
/// <param name="browser"></param>
/// <param name="operation">Describes the allowed operation (none, move, copy, link).</param>
protected override void UpdateDragCursor(CefBrowser browser, CefDragOperationsMask operation)
{
Cursor cursor;
CefCursorType cursorType;
switch(operation)
{
case CefDragOperationsMask.None:
cursor = CursorInteropHelper.Create(StandardCursorType.No);
cursorType = CefCursorType.Notallowed;
break;
case CefDragOperationsMask.Move:
cursor = CursorInteropHelper.Create(StandardCursorType.DragMove);
cursorType = CefCursorType.Move;
break;
case CefDragOperationsMask.Link:
cursor = CursorInteropHelper.Create(StandardCursorType.DragLink);
cursorType = CefCursorType.Alias;
break;
default:
cursor = CursorInteropHelper.Create(StandardCursorType.DragCopy);
cursorType = CefCursorType.Copy;
break;
}
WebView.RaiseCefCursorChange(new CursorChangeEventArgs(cursor, cursorType));
}
/// <inheritdoc />
protected override void OnFindResult(CefBrowser browser, int identifier, int count, CefRect selectionRect, int activeMatchOrdinal, bool finalUpdate)
{
WebView.RaiseTextFound(new TextFoundRoutedEventArgs(identifier, count, selectionRect, activeMatchOrdinal, finalUpdate));
}
/// <inheritdoc />
protected override void OnPdfPrintFinished(string path, bool success)
{
WebView.RaisePdfPrintFinished(new PdfPrintFinishedRoutedEventArgs(path, success));
}
/// <inheritdoc />
protected override bool OnJSDialog(CefBrowser browser, string originUrl, CefJSDialogType dialogType, string messageText, string defaultPromptText, CefJSDialogCallback callback, ref int suppressMessage)
{
ScriptDialogDeferral dialogDeferral = CreateScriptDialogDeferral(callback);
var ea = new ScriptDialogOpeningRoutedEventArgs(originUrl, (ScriptDialogKind)dialogType, messageText, defaultPromptText, dialogDeferral);
WebView.RaiseScriptDialogOpening(ea);
suppressMessage = ea.Suppress ? 1 : 0;
if (!ea.Handled) ((IDisposable)dialogDeferral).Dispose();
return ea.Handled;
}
/// <inheritdoc />
protected override bool OnBeforeUnloadDialog(CefBrowser browser, string messageText, bool isReload, CefJSDialogCallback callback)
{
ScriptDialogDeferral dialogDeferral = CreateScriptDialogDeferral(callback);
var ea = new ScriptDialogOpeningRoutedEventArgs(messageText, isReload, dialogDeferral);
WebView.RaiseScriptDialogOpening(ea);
if (!ea.Handled) ((IDisposable)dialogDeferral).Dispose();
return ea.Handled;
}
}
}
@@ -1,66 +0,0 @@
#if AvaloniaBeta
using Avalonia.Input;
using Avalonia.Platform;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
namespace CefNet.Internal
{
public static class CursorInteropHelper
{
private static readonly Dictionary<IntPtr, Cursor> _Cursors = new Dictionary<IntPtr, Cursor>();
private static readonly Dictionary<StandardCursorType, Cursor> _StdCursors = new Dictionary<StandardCursorType, Cursor>();
private static IntPtr GetPlatformHandle(Cursor cursor)
{
if (cursor != null)
{
if (cursor.PlatformImpl is IPlatformHandle i)
{
return i.Handle;
}
}
return default;
}
static CursorInteropHelper()
{
foreach (StandardCursorType cursorType in Enum.GetValues(typeof(StandardCursorType)))
{
var cursor = new Cursor(cursorType);
var handle = GetPlatformHandle(cursor);
if (handle == default || _Cursors.ContainsKey(handle))
continue;
_Cursors.Add(handle, cursor);
_StdCursors.Add(cursorType, cursor);
}
}
public static Cursor Create(IntPtr cursorHandle)
{
if (_Cursors.TryGetValue(cursorHandle, out Cursor cursor))
return cursor;
return Cursor.Default;
}
public static Cursor Create(StandardCursorType cursorType)
{
Cursor cursor;
lock (_StdCursors)
{
if (!_StdCursors.TryGetValue(cursorType, out cursor))
{
cursor = new Cursor(cursorType);
_StdCursors[cursorType] = cursor;
}
}
return cursor;
}
}
}
#endif
@@ -1,48 +0,0 @@
using Avalonia.Input;
using System;
using System.Collections.Generic;
using System.Text;
namespace CefNet.Internal
{
public static class CursorInteropHelper
{
private static readonly Dictionary<IntPtr, Cursor> _Cursors = new Dictionary<IntPtr, Cursor>();
private static readonly Dictionary<StandardCursorType, Cursor> _StdCursors = new Dictionary<StandardCursorType, Cursor>();
static CursorInteropHelper()
{
foreach(StandardCursorType cursorType in Enum.GetValues(typeof(StandardCursorType)))
{
var cursor = new Cursor(cursorType);
if (_Cursors.ContainsKey(cursor.PlatformCursor.Handle))
continue;
_Cursors.Add(cursor.PlatformCursor.Handle, cursor);
_StdCursors.Add(cursorType, cursor);
}
}
public static Cursor Create(IntPtr cursorHandle)
{
if (_Cursors.TryGetValue(cursorHandle, out Cursor cursor))
return cursor;
return Cursor.Default;
}
public static Cursor Create(StandardCursorType cursorType)
{
Cursor cursor;
lock (_StdCursors)
{
if (!_StdCursors.TryGetValue(cursorType, out cursor))
{
cursor = new Cursor(cursorType);
_StdCursors[cursorType] = cursor;
}
}
return cursor;
}
}
}
@@ -1,61 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
using Avalonia;
namespace CefNet.Internal
{
/// <summary>
/// Stores DPI information from which a <see cref="Avalonia.Layout.Visual"/> is rendered.
/// </summary>
///
public struct DpiScale
{
/// <summary>
/// Initializes a new instance of the <see cref="DpiScale"/> structure.
/// </summary>
/// <param name="dpiScaleX">The DPI scale on the X axis.</param>
/// <param name="dpiScaleY">The DPI scale on the Y axis.</param>
public DpiScale(double dpiScaleX, double dpiScaleY)
{
this.DpiScaleX = dpiScaleX;
this.DpiScaleY = dpiScaleY;
this.PixelsPerDip = 96.0;
this.PixelsPerInchX = dpiScaleX * 96.0;
this.PixelsPerInchY = dpiScaleY * 96.0;
}
/// <summary>
/// Gets the DPI scale on the X axis.
/// </summary>
public double DpiScaleX { get; }
/// <summary>
/// Gets the DPI scale on the Y axis.
/// </summary>
public double DpiScaleY { get; }
/// <summary>
/// Gets the PixelsPerDip at which the text should be rendered.
/// </summary>
public double PixelsPerDip { get; }
/// <summary>
/// Gets the DPI along X axis.
/// </summary>
public double PixelsPerInchX { get; }
/// <summary>
/// Gets the DPI along Y axis.
/// </summary>
public double PixelsPerInchY { get; }
/// <summary>
/// Gets the DPI.
/// </summary>
public Vector Dpi
{
get { return new Vector(PixelsPerInchX, PixelsPerInchY); }
}
}
}
@@ -1,172 +0,0 @@
using System;
using System.Collections.Generic;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Interactivity;
using System.Runtime.InteropServices;
using Avalonia.VisualTree;
using CefNet.WinApi;
using CefNet.Avalonia;
namespace CefNet.Internal
{
sealed class GlobalHooks
{
private static bool IsInitialized;
private static Dictionary<IntPtr, GlobalHooks> _HookedWindows = new Dictionary<IntPtr, GlobalHooks>();
private static List<WeakReference<WebView>> _Views = new List<WeakReference<WebView>>();
internal static void Initialize(WebView view)
{
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
return;
lock(_Views)
{
_Views.Add(new WeakReference<WebView>(view));
}
if (IsInitialized)
return;
IsInitialized = true;
var lifetime = Application.Current.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime;
if (lifetime is null)
return;
Window.WindowOpenedEvent.AddClassHandler(typeof(Window), TryAddGlobalHook, handledEventsToo: true);
//EventManager.RegisterClassHandler(typeof(Window), FrameworkElement.SizeChangedEvent, new RoutedEventHandler(TryAddGlobalHook));
foreach (Window window in lifetime.Windows)
{
TryAddGlobalHook(window);
}
}
private WindowsHwndSource _source;
private WeakReference<Window> _windowRef;
private GlobalHooks(WindowsHwndSource source, Window window)
{
_source = source;
_windowRef = new WeakReference<Window>(window);
source.WndProcCallback = WndProc;
}
private unsafe IntPtr WndProc(IntPtr hwnd, int message, IntPtr wParam, IntPtr lParam, ref bool handled)
{
const int WM_ENTERMENULOOP = 0x0211;
const int WM_EXITMENULOOP = 0x0212;
switch (message)
{
case 0x0002: // WM_DESTROY
_source.WndProcCallback = null;
foreach (var tuple in GetViews(hwnd))
{
tuple.Item1.Close();
}
lock (_HookedWindows)
{
_HookedWindows.Remove(_source.Handle);
_source.Dispose();
}
break;
case 0x0047: //WM_WINDOWPOSCHANGED
WINDOWPOS* windowPos = (WINDOWPOS*)lParam;
if ((windowPos->flags & 0x0002) != 0) // SWP_NOMOVE
break;
foreach (var tuple in GetViews(hwnd))
{
tuple.Item1.OnUpdateRootBounds();
}
break;
case 0x0231: // WM_ENTERSIZEMOVE
foreach (var tuple in GetViews(hwnd))
{
tuple.Item1.OnRootResizeBegin(EventArgs.Empty);
}
break;
case 0x0232: // WM_EXITSIZEMOVE
foreach (var tuple in GetViews(hwnd))
{
tuple.Item1.OnRootResizeEnd(EventArgs.Empty);
}
break;
case 0x0112: // WM_SYSCOMMAND
const int SC_KEYMENU = 0xF100;
// Menu loop must not be runned with Alt key
if ((int)(wParam.ToInt64() & 0xFFF0) == SC_KEYMENU && lParam == IntPtr.Zero)
{
handled = true;
}
break;
case WM_ENTERMENULOOP:
if (wParam == IntPtr.Zero)
CefApi.SetOSModalLoop(true);
break;
case WM_EXITMENULOOP:
if (wParam == IntPtr.Zero)
CefApi.SetOSModalLoop(false);
break;
}
return IntPtr.Zero;
}
private IEnumerable<ValueTuple<WebView, Window>> GetViews(IntPtr hwnd)
{
if (hwnd != _source.Handle)
yield break;
Window window;
if (!_windowRef.TryGetTarget(out window))
yield break;
lock (_Views)
{
for (int i = 0; i < _Views.Count; i++)
{
WeakReference<WebView> viewRef = _Views[i];
if (viewRef.TryGetTarget(out WebView view))
{
if (view.GetVisualRoot() == window)
{
yield return new ValueTuple<WebView, Window>(view, window);
}
}
else
{
_Views.RemoveAt(i--);
}
}
}
}
private static void TryAddGlobalHook(object sender, RoutedEventArgs e)
{
TryAddGlobalHook(e.Source as Window);
}
private static void TryAddGlobalHook(Window window)
{
if (window == null)
return;
IntPtr hwnd = window.PlatformImpl.Handle.Handle;
if (_HookedWindows.ContainsKey(hwnd))
return;
WindowsHwndSource source = WindowsHwndSource.FromHwnd(hwnd);
if (source == null)
return;
_HookedWindows.Add(hwnd, new GlobalHooks(source, window));
}
}
}
@@ -1,15 +0,0 @@
using CefNet.Avalonia;
using System;
using System.Collections.Generic;
using System.Text;
namespace CefNet.Internal
{
public interface IAvaloniaWebViewPrivate : IChromiumWebViewPrivate
{
void RaiseCefCursorChange(CursorChangeEventArgs e);
void CefSetToolTip(string text);
void CefSetStatusText(string statusText);
void RaiseStartDragging(StartDraggingEventArgs e);
}
}
@@ -1,726 +0,0 @@
using Avalonia.Input;
#pragma warning disable CS0219
namespace CefNet.Internal
{
/// <summary>
/// Provides static methods to convert between Virtual-Keys and the Key enumeration.
/// </summary>
internal static class KeyInterop
{
/// <summary>
/// Convert Key into a Virtual-Key.
/// </summary>
public static int VirtualKeyFromKey(Key key)
{
const int VK_CANCEL = 0x03;
const int VK_BACK = 0x08;
const int VK_CLEAR = 0x0C;
const int VK_RETURN = 0x0D;
const int VK_PAUSE = 0x13;
const int VK_CAPITAL = 0x14;
const int VK_KANA = 0x15;
const int VK_HANGEUL = 0x15;
const int VK_HANGUL = 0x15;
const int VK_JUNJA = 0x17;
const int VK_FINAL = 0x18;
const int VK_HANJA = 0x19;
const int VK_KANJI = 0x19;
const int VK_ESCAPE = 0x1B;
const int VK_CONVERT = 0x1C;
const int VK_NONCONVERT = 0x1D;
const int VK_ACCEPT = 0x1E;
const int VK_MODECHANGE = 0x1F;
const int VK_SPACE = 0x20;
const int VK_PRIOR = 0x21;
const int VK_NEXT = 0x22;
const int VK_END = 0x23;
const int VK_HOME = 0x24;
const int VK_LEFT = 0x25;
const int VK_UP = 0x26;
const int VK_RIGHT = 0x27;
const int VK_DOWN = 0x28;
const int VK_SELECT = 0x29;
const int VK_PRINT = 0x2A;
const int VK_EXECUTE = 0x2B;
const int VK_SNAPSHOT = 0x2C;
const int VK_INSERT = 0x2D;
const int VK_DELETE = 0x2E;
const int VK_HELP = 0x2F;
const int VK_0 = 0x30;
const int VK_1 = 0x31;
const int VK_2 = 0x32;
const int VK_3 = 0x33;
const int VK_4 = 0x34;
const int VK_5 = 0x35;
const int VK_6 = 0x36;
const int VK_7 = 0x37;
const int VK_8 = 0x38;
const int VK_9 = 0x39;
const int VK_A = 0x41;
const int VK_B = 0x42;
const int VK_C = 0x43;
const int VK_D = 0x44;
const int VK_E = 0x45;
const int VK_F = 0x46;
const int VK_G = 0x47;
const int VK_H = 0x48;
const int VK_I = 0x49;
const int VK_J = 0x4A;
const int VK_K = 0x4B;
const int VK_L = 0x4C;
const int VK_M = 0x4D;
const int VK_N = 0x4E;
const int VK_O = 0x4F;
const int VK_P = 0x50;
const int VK_Q = 0x51;
const int VK_R = 0x52;
const int VK_S = 0x53;
const int VK_T = 0x54;
const int VK_U = 0x55;
const int VK_V = 0x56;
const int VK_W = 0x57;
const int VK_X = 0x58;
const int VK_Y = 0x59;
const int VK_Z = 0x5A;
const int VK_LWIN = 0x5B;
const int VK_RWIN = 0x5C;
const int VK_APPS = 0x5D;
const int VK_POWER = 0x5E;
const int VK_SLEEP = 0x5F;
const int VK_NUMPAD0 = 0x60;
const int VK_NUMPAD1 = 0x61;
const int VK_NUMPAD2 = 0x62;
const int VK_NUMPAD3 = 0x63;
const int VK_NUMPAD4 = 0x64;
const int VK_NUMPAD5 = 0x65;
const int VK_NUMPAD6 = 0x66;
const int VK_NUMPAD7 = 0x67;
const int VK_NUMPAD8 = 0x68;
const int VK_NUMPAD9 = 0x69;
const int VK_MULTIPLY = 0x6A;
const int VK_ADD = 0x6B;
const int VK_SEPARATOR = 0x6C;
const int VK_SUBTRACT = 0x6D;
const int VK_DECIMAL = 0x6E;
const int VK_DIVIDE = 0x6F;
const int VK_F1 = 0x70;
const int VK_F2 = 0x71;
const int VK_F3 = 0x72;
const int VK_F4 = 0x73;
const int VK_F5 = 0x74;
const int VK_F6 = 0x75;
const int VK_F7 = 0x76;
const int VK_F8 = 0x77;
const int VK_F9 = 0x78;
const int VK_F10 = 0x79;
const int VK_F11 = 0x7A;
const int VK_F12 = 0x7B;
const int VK_F13 = 0x7C;
const int VK_F14 = 0x7D;
const int VK_F15 = 0x7E;
const int VK_F16 = 0x7F;
const int VK_F17 = 0x80;
const int VK_F18 = 0x81;
const int VK_F19 = 0x82;
const int VK_F20 = 0x83;
const int VK_F21 = 0x84;
const int VK_F22 = 0x85;
const int VK_F23 = 0x86;
const int VK_F24 = 0x87;
const int VK_NUMLOCK = 0x90;
const int VK_SCROLL = 0x91;
const int VK_RSHIFT = 0xA1;
const int VK_BROWSER_BACK = 0xA6;
const int VK_BROWSER_FORWARD = 0xA7;
const int VK_BROWSER_REFRESH = 0xA8;
const int VK_BROWSER_STOP = 0xA9;
const int VK_BROWSER_SEARCH = 0xAA;
const int VK_BROWSER_FAVORITES = 0xAB;
const int VK_BROWSER_HOME = 0xAC;
const int VK_VOLUME_MUTE = 0xAD;
const int VK_VOLUME_DOWN = 0xAE;
const int VK_VOLUME_UP = 0xAF;
const int VK_MEDIA_NEXT_TRACK = 0xB0;
const int VK_MEDIA_PREV_TRACK = 0xB1;
const int VK_MEDIA_STOP = 0xB2;
const int VK_MEDIA_PLAY_PAUSE = 0xB3;
const int VK_LAUNCH_MAIL = 0xB4;
const int VK_LAUNCH_MEDIA_SELECT = 0xB5;
const int VK_LAUNCH_APP1 = 0xB6;
const int VK_LAUNCH_APP2 = 0xB7;
const int VK_PROCESSKEY = 0xE5;
const int VK_PACKET = 0xE7;
const int VK_ATTN = 0xF6;
const int VK_CRSEL = 0xF7;
const int VK_EXSEL = 0xF8;
const int VK_EREOF = 0xF9;
const int VK_PLAY = 0xFA;
const int VK_ZOOM = 0xFB;
const int VK_NONAME = 0xFC;
const int VK_PA1 = 0xFD;
const int VK_OEM_CLEAR = 0xFE;
const int VK_TAB = 0x09;
const int VK_SHIFT = 0x10;
const int VK_CONTROL = 0x11;
const int VK_MENU = 0x12;
const int VK_LSHIFT = 0xA0;
const int VK_RMENU = 0xA5;
const int VK_LMENU = 0xA4;
const int VK_LCONTROL = 0xA2;
const int VK_RCONTROL = 0xA3;
const int VK_LBUTTON = 0x01;
const int VK_RBUTTON = 0x02;
const int VK_MBUTTON = 0x04;
const int VK_XBUTTON1 = 0x05;
const int VK_XBUTTON2 = 0x06;
const int VK_OEM_1 = 0xBA;
const int VK_OEM_PLUS = 0xBB;
const int VK_OEM_COMMA = 0xBC;
const int VK_OEM_MINUS = 0xBD;
const int VK_OEM_PERIOD = 0xBE;
const int VK_OEM_2 = 0xBF;
const int VK_OEM_3 = 0xC0;
const int VK_C1 = 0xC1; // ABNT_C1 (Brazilian)
const int VK_C2 = 0xC2; // ABNT_C2 (Brazilian)
const int VK_OEM_4 = 0xDB;
const int VK_OEM_5 = 0xDC;
const int VK_OEM_6 = 0xDD;
const int VK_OEM_7 = 0xDE;
const int VK_OEM_8 = 0xDF;
const int VK_OEM_AX = 0xE1;
const int VK_OEM_102 = 0xE2;
const int VK_OEM_RESET = 0xE9;
const int VK_OEM_JUMP = 0xEA;
const int VK_OEM_PA1 = 0xEB;
const int VK_OEM_PA2 = 0xEC;
const int VK_OEM_PA3 = 0xED;
const int VK_OEM_WSCTRL = 0xEE;
const int VK_OEM_CUSEL = 0xEF;
const int VK_OEM_ATTN = 0xF0;
const int VK_OEM_FINISH = 0xF1;
const int VK_OEM_COPY = 0xF2;
const int VK_OEM_AUTO = 0xF3;
const int VK_OEM_ENLW = 0xF4;
const int VK_OEM_BACKTAB = 0xF5;
switch (key)
{
case Key.Cancel:
return VK_CANCEL;
case Key.Back:
return VK_BACK;
case Key.Tab:
return VK_TAB;
case Key.Clear:
return VK_CLEAR;
case Key.Return:
return VK_RETURN;
case Key.Pause:
return VK_PAUSE;
case Key.Capital:
return VK_CAPITAL;
case Key.KanaMode:
return VK_KANA;
case Key.JunjaMode:
return VK_JUNJA;
case Key.FinalMode:
return VK_FINAL;
case Key.KanjiMode:
return VK_KANJI;
case Key.Escape:
return VK_ESCAPE;
case Key.ImeConvert:
return VK_CONVERT;
case Key.ImeNonConvert:
return VK_NONCONVERT;
case Key.ImeAccept:
return VK_ACCEPT;
case Key.ImeModeChange:
return VK_MODECHANGE;
case Key.Space:
return VK_SPACE;
case Key.Prior:
return VK_PRIOR;
case Key.Next:
return VK_NEXT;
case Key.End:
return VK_END;
case Key.Home:
return VK_HOME;
case Key.Left:
return VK_LEFT;
case Key.Up:
return VK_UP;
case Key.Right:
return VK_RIGHT;
case Key.Down:
return VK_DOWN;
case Key.Select:
return VK_SELECT;
case Key.Print:
return VK_PRINT;
case Key.Execute:
return VK_EXECUTE;
case Key.Snapshot:
return VK_SNAPSHOT;
case Key.Insert:
return VK_INSERT;
case Key.Delete:
return VK_DELETE;
case Key.Help:
return VK_HELP;
case Key.D0:
return VK_0;
case Key.D1:
return VK_1;
case Key.D2:
return VK_2;
case Key.D3:
return VK_3;
case Key.D4:
return VK_4;
case Key.D5:
return VK_5;
case Key.D6:
return VK_6;
case Key.D7:
return VK_7;
case Key.D8:
return VK_8;
case Key.D9:
return VK_9;
case Key.A:
return VK_A;
case Key.B:
return VK_B;
case Key.C:
return VK_C;
case Key.D:
return VK_D;
case Key.E:
return VK_E;
case Key.F:
return VK_F;
case Key.G:
return VK_G;
case Key.H:
return VK_H;
case Key.I:
return VK_I;
case Key.J:
return VK_J;
case Key.K:
return VK_K;
case Key.L:
return VK_L;
case Key.M:
return VK_M;
case Key.N:
return VK_N;
case Key.O:
return VK_O;
case Key.P:
return VK_P;
case Key.Q:
return VK_Q;
case Key.R:
return VK_R;
case Key.S:
return VK_S;
case Key.T:
return VK_T;
case Key.U:
return VK_U;
case Key.V:
return VK_V;
case Key.W:
return VK_W;
case Key.X:
return VK_X;
case Key.Y:
return VK_Y;
case Key.Z:
return VK_Z;
case Key.LWin:
return VK_LWIN;
case Key.RWin:
return VK_RWIN;
case Key.Apps:
return VK_APPS;
case Key.Sleep:
return VK_SLEEP;
case Key.NumPad0:
return VK_NUMPAD0;
case Key.NumPad1:
return VK_NUMPAD1;
case Key.NumPad2:
return VK_NUMPAD2;
case Key.NumPad3:
return VK_NUMPAD3;
case Key.NumPad4:
return VK_NUMPAD4;
case Key.NumPad5:
return VK_NUMPAD5;
case Key.NumPad6:
return VK_NUMPAD6;
case Key.NumPad7:
return VK_NUMPAD7;
case Key.NumPad8:
return VK_NUMPAD8;
case Key.NumPad9:
return VK_NUMPAD9;
case Key.Multiply:
return VK_MULTIPLY;
case Key.Add:
return VK_ADD;
case Key.Separator:
return VK_SEPARATOR;
case Key.Subtract:
return VK_SUBTRACT;
case Key.Decimal:
return VK_DECIMAL;
case Key.Divide:
return VK_DIVIDE;
case Key.F1:
return VK_F1;
case Key.F2:
return VK_F2;
case Key.F3:
return VK_F3;
case Key.F4:
return VK_F4;
case Key.F5:
return VK_F5;
case Key.F6:
return VK_F6;
case Key.F7:
return VK_F7;
case Key.F8:
return VK_F8;
case Key.F9:
return VK_F9;
case Key.F10:
return VK_F10;
case Key.F11:
return VK_F11;
case Key.F12:
return VK_F12;
case Key.F13:
return VK_F13;
case Key.F14:
return VK_F14;
case Key.F15:
return VK_F15;
case Key.F16:
return VK_F16;
case Key.F17:
return VK_F17;
case Key.F18:
return VK_F18;
case Key.F19:
return VK_F19;
case Key.F20:
return VK_F20;
case Key.F21:
return VK_F21;
case Key.F22:
return VK_F22;
case Key.F23:
return VK_F23;
case Key.F24:
return VK_F24;
case Key.NumLock:
return VK_NUMLOCK;
case Key.Scroll:
return VK_SCROLL;
case Key.LeftShift:
return VK_LSHIFT;
case Key.RightShift:
return VK_RSHIFT;
case Key.LeftCtrl:
return VK_LCONTROL;
case Key.RightCtrl:
return VK_RCONTROL;
case Key.LeftAlt:
return VK_LMENU;
case Key.RightAlt:
return VK_RMENU;
case Key.BrowserBack:
return VK_BROWSER_BACK;
case Key.BrowserForward:
return VK_BROWSER_FORWARD;
case Key.BrowserRefresh:
return VK_BROWSER_REFRESH;
case Key.BrowserStop:
return VK_BROWSER_STOP;
case Key.BrowserSearch:
return VK_BROWSER_SEARCH;
case Key.BrowserFavorites:
return VK_BROWSER_FAVORITES;
case Key.BrowserHome:
return VK_BROWSER_HOME;
case Key.VolumeMute:
return VK_VOLUME_MUTE;
case Key.VolumeDown:
return VK_VOLUME_DOWN;
case Key.VolumeUp:
return VK_VOLUME_UP;
case Key.MediaNextTrack:
return VK_MEDIA_NEXT_TRACK;
case Key.MediaPreviousTrack:
return VK_MEDIA_PREV_TRACK;
case Key.MediaStop:
return VK_MEDIA_STOP;
case Key.MediaPlayPause:
return VK_MEDIA_PLAY_PAUSE;
case Key.LaunchMail:
return VK_LAUNCH_MAIL;
case Key.SelectMedia:
return VK_LAUNCH_MEDIA_SELECT;
case Key.LaunchApplication1:
return VK_LAUNCH_APP1;
case Key.LaunchApplication2:
return VK_LAUNCH_APP2;
case Key.OemSemicolon:
return VK_OEM_1;
case Key.OemPlus:
return VK_OEM_PLUS;
case Key.OemComma:
return VK_OEM_COMMA;
case Key.OemMinus:
return VK_OEM_MINUS;
case Key.OemPeriod:
return VK_OEM_PERIOD;
case Key.OemQuestion:
return VK_OEM_2;
case Key.OemTilde:
return VK_OEM_3;
case Key.AbntC1:
return VK_C1;
case Key.AbntC2:
return VK_C2;
case Key.OemOpenBrackets:
return VK_OEM_4;
case Key.OemPipe:
return VK_OEM_5;
case Key.OemCloseBrackets:
return VK_OEM_6;
case Key.OemQuotes:
return VK_OEM_7;
case Key.Oem8:
return VK_OEM_8;
case Key.OemBackslash:
return VK_OEM_102;
case Key.ImeProcessed:
return VK_PROCESSKEY;
case Key.OemAttn:
return VK_OEM_ATTN; // VK_DBE_ALPHANUMERIC
case Key.OemFinish:
return VK_OEM_FINISH; // VK_DBE_KATAKANA
case Key.OemCopy:
return VK_OEM_COPY; // VK_DBE_HIRAGANA
case Key.OemAuto:
return VK_OEM_AUTO; // VK_DBE_SBCSCHAR
case Key.OemEnlw:
return VK_OEM_ENLW; // VK_DBE_DBCSCHAR
case Key.OemBackTab:
return VK_OEM_BACKTAB; // VK_DBE_ROMAN
case Key.Attn:
return VK_ATTN; // VK_DBE_NOROMAN
case Key.CrSel:
return VK_CRSEL; // VK_DBE_ENTERWORDREGISTERMODE
case Key.ExSel:
return VK_EXSEL; // VK_DBE_ENTERIMECONFIGMODE
case Key.EraseEof:
return VK_EREOF; // VK_DBE_FLUSHSTRING
case Key.Play:
return VK_PLAY; // VK_DBE_CODEINPUT
case Key.Zoom:
return VK_ZOOM; // VK_DBE_NOCODEINPUT
case Key.NoName:
return VK_NONAME; // VK_DBE_DETERMINESTRING
case Key.Pa1:
return VK_PA1; // VK_ENTERDLGCONVERSIONMODE
case Key.OemClear:
return VK_OEM_CLEAR;
case Key.DeadCharProcessed:
return 0; // There is no Win32 VKey for this.
default:
return 0;
}
}
}
}
@@ -1,209 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace CefNet.Internal
{
internal sealed class MenuModel
{
private sealed class MenuModelItem
{
public int Command;
public string Label;
public CefMenuItemType Type;
public int Group;
public bool Visible;
public bool Enabled;
public bool Checked;
public CefColor[] Colors;
public Accelerator Accelerator;
public MenuModel SubMenu;
}
private sealed class Accelerator
{
public int KeyCode;
public bool Alt;
public bool Shift;
public bool Ctrl;
}
private MenuModelItem[] _items;
private MenuModel(MenuModelItem[] items)
{
_items = items;
}
public static MenuModel FromCefMenu(CefMenuModel model)
{
var items = new MenuModelItem[model.Count];
CopyItems(model, items);
return new MenuModel(items);
}
private static void CopyItems(CefMenuModel model, MenuModelItem[] dest)
{
for (int i = 0; i < dest.Length; i++)
{
var item = new MenuModelItem
{
Command = model.GetCommandIdAt(i),
Label = model.GetLabelAt(i),
Type = model.GetTypeAt(i),
Group = model.GetGroupIdAt(i),
Visible = model.IsVisibleAt(i),
Enabled = model.IsEnabledAt(i),
Checked = model.IsCheckedAt(i),
};
CefColor color = default;
item.Colors = new CefColor[(int)CefMenuColorType.Count];
for (int j = 0; j < item.Colors.Length; j++)
{
item.Colors[j] = model.GetColorAt(i, (CefMenuColorType)j, ref color) ? color : default;
}
int keycode = 0, alt = 0, ctrl = 0, shift = 0;
if (model.GetAcceleratorAt(i, ref keycode, ref shift, ref ctrl, ref alt))
{
item.Accelerator = new Accelerator { KeyCode = keycode, Alt = alt != 0, Ctrl = ctrl != 0, Shift = shift != 0 };
}
if (item.Type == CefMenuItemType.Submenu)
{
CefMenuModel submenu = model.GetSubMenuAt(i);
var items = new MenuModelItem[submenu.Count];
CopyItems(submenu, items);
item.SubMenu = new MenuModel(items) { IsSubMenu = true };
}
dest[i] = item;
}
}
/// <summary>
/// Returns true if this menu is a submenu.
/// </summary>
public bool IsSubMenu { get; private set; }
/// <summary>
/// Returns the number of items in this menu.
/// </summary>
public int Count
{
get { return _items.Length; }
}
/// <summary>
/// Returns the command id at the specified |index| or -1 if not found due to
/// invalid range or the index being a separator.
/// </summary>
public int GetCommandIdAt(int index)
{
return _items[index].Command;
}
/// <summary>
/// Returns the label at the specified |index| or NULL if not found due to
/// invalid range or the index being a separator.
/// The resulting string must be freed by calling cef_string_userfree_free().
/// </summary>
public string GetLabelAt(int index)
{
return _items[index].Label;
}
/// <summary>
/// Returns the item type at the specified |index|.
/// </summary>
public CefMenuItemType GetTypeAt(int index)
{
return _items[index].Type;
}
/// <summary>
/// Returns the group id at the specified |index| or -1 if invalid.
/// </summary>
public int GetGroupIdAt(int index)
{
return _items[index].Group;
}
/// <summary>
/// Returns the submenu at the specified |index| or NULL if invalid.
/// </summary>
public MenuModel GetSubMenuAt(int index)
{
return _items[index].SubMenu;
}
/// <summary>
/// Returns true if the specified |index| is visible.
/// </summary>
public bool IsVisibleAt(int index)
{
return _items[index].Visible;
}
/// <summary>
/// Returns true if the specified |index| is enabled.
/// </summary>
public bool IsEnabledAt(int index)
{
return _items[index].Enabled;
}
/// <summary>
/// Returns true if the specified |index| is checked. Only applies to check
/// and radio items.
/// </summary>
public bool IsCheckedAt(int index)
{
return _items[index].Checked;
}
/// <summary>
/// Returns true if the specified |index| has a keyboard accelerator
/// assigned.
/// </summary>
public bool HasAcceleratorAt(int index)
{
return _items[index].Accelerator != null;
}
/// <summary>
/// Retrieves the keyboard accelerator for the specified |index|. Returns true on success.
/// </summary>
public bool GetAcceleratorAt(int index, out int keyCode, out bool shift, out bool ctrl, out bool alt)
{
Accelerator accelerator = _items[index].Accelerator;
if (accelerator == null)
{
keyCode = 0;
shift = false;
ctrl = false;
alt = false;
return false;
}
keyCode = accelerator.KeyCode;
shift = accelerator.Shift;
ctrl = accelerator.Ctrl;
alt = accelerator.Alt;
return true;
}
/// <summary>
/// Returns in |color| the color that was explicitly set for |command_id| and
/// |color_type|. Specify an |index| value of -1 to return the default color in
/// |color|. If a color was not set then 0 will be returned in |color|. Returns
/// true on success.
/// </summary>
public bool GetColorAt(int index, CefMenuColorType colorType, out CefColor color)
{
color = _items[index].Colors[(int)colorType];
return color != 0;
}
}
}
@@ -1,234 +0,0 @@
using System;
using System.Buffers;
using System.Collections.Generic;
using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using Avalonia;
using Avalonia.Media;
using Avalonia.Media.Imaging;
using Avalonia.Platform;
using CefNet.Avalonia;
namespace CefNet.Internal
{
public sealed class OffscreenGraphics
{
private class PixelBuffer : IDisposable
{
public byte[] DIB;
private List<CefRect> _dirtyRects = new List<CefRect>();
public int Width;
public int Height;
public WriteableBitmap Surface;
public PixelBuffer(int width, int height)
{
this.Width = width;
this.Height = height;
this.DIB = ArrayPool<byte>.Shared.Rent(width * height * 4);
}
~PixelBuffer()
{
Dispose(false);
}
private void Dispose(bool disposing)
{
byte[] buffer = Interlocked.Exchange(ref DIB, null);
if (buffer != null)
{
ArrayPool<byte>.Shared.Return(buffer);
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public int Stride
{
get { return Width * 4; }
}
public int Size
{
get
{
return Width * Height * 4;
}
}
public void AddDirtyRects(CefRect[] dirtyRects)
{
_dirtyRects.AddRange(dirtyRects);
}
//public Int32Rect GetDirtyRectangle()
//{
// if (_dirtyRects.Count == 0)
// return new Int32Rect();
// CefRect r = _dirtyRects[0];
// Int32Rect dirtyRect = new Int32Rect(r.X, r.Y, r.Width, r.Height);
// for (int i = 1; i < _dirtyRects.Count; i++)
// {
// dirtyRect.Union(_dirtyRects[i]);
// }
// return dirtyRect;
//}
public void ClearDirtyRectangle()
{
_dirtyRects.Clear();
}
}
private PixelBuffer ViewPixels;
private PixelBuffer PopupPixels;
private readonly object _syncRoot;
private CefRect _bounds;
private CefRect _popupBounds;
public OffscreenGraphics()
{
_syncRoot = new object();
_bounds = new CefRect(0, 0, 1, 1);
}
public static DpiScale DpiScale { get; set; } = new DpiScale(1, 1);
public void SetLocation(int x, int y)
{
_bounds.X = x;
_bounds.Y = y;
}
public bool SetSize(int width, int height)
{
width = Math.Max(width, 1);
height = Math.Max(height, 1);
_bounds.Width = width;
_bounds.Height = height;
lock (_syncRoot)
{
return ViewPixels == null || ViewPixels.Width != width || ViewPixels.Height != height;
}
}
public CefRect GetBounds()
{
return _bounds;
}
public void Draw(CefPaintEventArgs e)
{
lock (_syncRoot)
{
PixelBuffer pixelBuffer;
if (e.PaintElementType == CefPaintElementType.View)
{
if (ViewPixels == null || ViewPixels.Width != e.Width || ViewPixels.Height != e.Height)
{
if (ViewPixels != null)
ViewPixels.Dispose();
ViewPixels = new PixelBuffer(e.Width, e.Height);
}
pixelBuffer = ViewPixels;
}
else if(e.PaintElementType == CefPaintElementType.Popup)
{
if (PopupPixels == null || PopupPixels.Width != e.Width || PopupPixels.Height != e.Height)
{
if (PopupPixels != null)
PopupPixels.Dispose();
PopupPixels = new PixelBuffer(e.Width, e.Height);
}
pixelBuffer = PopupPixels;
}
else
{
return;
}
Marshal.Copy(e.Buffer, pixelBuffer.DIB, 0, pixelBuffer.Size);
pixelBuffer.AddDirtyRects(e.DirtyRects);
}
}
public unsafe void Render(DrawingContext drawingContext)
{
lock (_syncRoot)
{
if (ViewPixels != null)
{
PixelSize pixelSize;
WriteableBitmap surface;
surface = GetSurface(ViewPixels);
pixelSize = surface.PixelSize;
drawingContext.DrawImage(surface, new Rect(0, 0, pixelSize.Width, pixelSize.Height), new Rect(surface.Size));
PixelBuffer pixelBuffer = PopupPixels;
if (pixelBuffer == null)
return;
surface = GetSurface(pixelBuffer);
Size size = surface.Size;
pixelSize = surface.PixelSize;
drawingContext.DrawImage(surface,
new Rect(0, 0, pixelSize.Width, pixelSize.Height),
new Rect(_popupBounds.X, _popupBounds.Y, size.Width, size.Height));
}
}
}
private WriteableBitmap GetSurface(PixelBuffer pixelBuffer)
{
if (!Monitor.IsEntered(_syncRoot))
throw new InvalidOperationException();
WriteableBitmap surface = pixelBuffer.Surface;
if (surface is null || surface.PixelSize != new PixelSize(pixelBuffer.Width, pixelBuffer.Height))
{
surface?.Dispose();
surface = new WriteableBitmap(new PixelSize(pixelBuffer.Width, pixelBuffer.Height), OffscreenGraphics.DpiScale.Dpi, PixelFormat.Bgra8888, AlphaFormat.Premul);
pixelBuffer.Surface = surface;
}
using (ILockedFramebuffer frameBuffer = surface.Lock())
{
Marshal.Copy(pixelBuffer.DIB, 0, frameBuffer.Address, pixelBuffer.Size);
pixelBuffer.ClearDirtyRectangle();
}
return surface;
}
public void SetPopup(PopupShowEventArgs e)
{
if (e.Visible)
{
_popupBounds = e.Bounds;
}
else
{
lock (_syncRoot)
{
PopupPixels?.Dispose();
PopupPixels = null;
}
}
}
}
}
@@ -1,91 +0,0 @@
using System;
using System.ComponentModel;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using CefNet.WinApi;
namespace CefNet.Internal
{
internal delegate IntPtr WindowsWindowProcDelegate(IntPtr hwnd, int message, IntPtr wParam, IntPtr lParam, ref bool handled);
internal sealed class WindowsHwndSource : CriticalFinalizerObject, IDisposable
{
private delegate IntPtr WindowProc(IntPtr hwnd, int message, IntPtr wParam, IntPtr lParam);
private bool _disposed;
private IntPtr hWndProcHook;
private readonly WindowProc fnWndProcHook;
public static WindowsHwndSource FromHwnd(IntPtr hwnd)
{
const int GWLP_WNDPROC = -4;
uint tid = NativeMethods.GetWindowThreadProcessId(hwnd, IntPtr.Zero);
if (tid == 0)
throw new Win32Exception(Marshal.GetLastWin32Error());
var source = new WindowsHwndSource(hwnd);
source.hWndProcHook = NativeMethods.SetWindowLong(hwnd, GWLP_WNDPROC, Marshal.GetFunctionPointerForDelegate(source.fnWndProcHook));
if (source.hWndProcHook == IntPtr.Zero)
throw new Win32Exception(Marshal.GetLastWin32Error());
return source;
}
private WindowsHwndSource(IntPtr hwnd)
{
hWndProcHook = IntPtr.Zero;
this.Handle = hwnd;
fnWndProcHook = new WindowProc(WndProcHook);
}
~WindowsHwndSource()
{
Dispose(false);
}
private void Dispose(bool disposing)
{
if (_disposed)
return;
if (hWndProcHook != IntPtr.Zero)
{
const int GWLP_WNDPROC = -4;
NativeMethods.SetWindowLong(this.Handle, GWLP_WNDPROC, hWndProcHook);
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public IntPtr Handle { get; }
public WindowsWindowProcDelegate WndProcCallback { get; set; }
private unsafe IntPtr WndProcHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam)
{
IntPtr retval = IntPtr.Zero;
WindowsWindowProcDelegate wndproc = this.WndProcCallback;
if (wndproc != null)
{
bool handled = false;
retval = wndproc(hwnd, msg, wParam, lParam, ref handled);
if (handled)
return retval;
}
return NativeMethods.CallWindowProc(hWndProcHook, hwnd, msg, wParam, lParam);
}
}
}
@@ -1,51 +0,0 @@
using Avalonia.Interactivity;
using System;
using System.Collections.Generic;
using System.Text;
namespace CefNet.Avalonia
{
/// <summary>
/// Provides data for the <see cref="WebView.StartDragging"/> event.
/// </summary>
public class StartDraggingEventArgs : RoutedEventArgs
{
/// <summary>
/// Initializes a new instance of the <see cref="StartDraggingEventArgs"/> class.
/// </summary>
/// <param name="source"></param>
/// <param name="data">The data associated with this event.</param>
/// <param name="allowedOps">Drag-and-drop operations which allowed by the source of the drag event.</param>
/// <param name="x">The X-location in screen coordinates.</param>
/// <param name="y">The Y-location in screen coordinates.</param>
public StartDraggingEventArgs(CefDragData data, CefDragOperationsMask allowedOps, int x, int y)
: base(WebView.StartDraggingEvent)
{
this.Data = data;
this.AllowedEffects = allowedOps;
this.X = x;
this.Y = y;
}
/// <summary>
/// The contextual information about the dragged content.
/// </summary>
public CefDragData Data { get; }
/// <summary>
/// Gets which drag-and-drop operations are allowed by the originator (or source) of the drag event.
/// </summary>
public CefDragOperationsMask AllowedEffects { get; }
/// <summary>
/// Gets the X-location of the mouse pointer in screen coordinates.
/// </summary>
public int X { get; }
/// <summary>
/// Gets the Y-location of the mouse pointer in screen coordinates.
/// </summary>
public int Y { get; }
}
}
File diff suppressed because it is too large Load Diff
@@ -1,14 +0,0 @@
using System;
using System.Runtime.InteropServices;
namespace CefNet.WinApi
{
[StructLayout(LayoutKind.Sequential)]
internal struct CWPSTRUCT
{
public IntPtr lParam;
public IntPtr wParam;
public int message;
public IntPtr hwnd;
}
}
@@ -1,45 +0,0 @@
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace CefNet.WinApi
{
static class NativeMethods
{
[DllImport("user32.dll")]
public static extern IntPtr GetKeyboardLayout(uint idThread);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr ActivateKeyboardLayout(IntPtr hkl, int flags);
[DllImport("user32.dll", EntryPoint = "VkKeyScanW", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern ushort VkKeyScan(char ch);
public static IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong)
{
if (IntPtr.Size == 8)
return SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
else
return new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32()));
}
[DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int SetWindowLong32(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr pPid);
[DllImport("Dwmapi.dll", CharSet = CharSet.Auto)]
public static unsafe extern int DwmGetWindowAttribute(IntPtr hwnd, DWMWINDOWATTRIBUTE attribute, void* value, int size);
[DllImport("Dwmapi.dll", CharSet = CharSet.Auto, PreserveSig = false)]
public static extern bool DwmIsCompositionEnabled();
}
}
@@ -1,20 +0,0 @@
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace CefNet.WinApi
{
[StructLayout(LayoutKind.Sequential)]
internal struct WINDOWPOS
{
public IntPtr hwnd;
public IntPtr hwndInsertAfter;
public int x;
public int y;
public int cx;
public int cy;
public int flags;
}
}
@@ -1,22 +0,0 @@
namespace CefNet.WinApi
{
internal enum DWMWINDOWATTRIBUTE
{
NCRenderingEnabled = 1,
NCRenderingPolicy,
TransitionsForceDisabled,
AllowNCPaint,
CaptionButtonBounds,
NonClientRtlLayout,
ForceIconicRepresentation,
Flip3DPolicy,
ExtendedFrameBounds,
HasIconicBitmap,
DisallowPeek,
ExcludedFromPeek,
ExceludedFromPeek,
Cloak,
Cloaked,
FreezeRepresentation
}
}
@@ -1,42 +0,0 @@
#if AVALONIA
using Avalonia.Interactivity;
#elif WPF
using System.Windows;
#endif
#if AVALONIA
namespace CefNet.Avalonia
#elif WPF
namespace CefNet.Wpf
#endif
{
/// <summary>
/// Represents PDF printing results.
/// </summary>
public sealed class PdfPrintFinishedRoutedEventArgs : RoutedEventArgs, IPdfPrintFinishedEventArgs
{
/// <summary>
/// Initializes a new instance of the <see cref="PdfPrintFinishedEventArgs"/> class.
/// </summary>
/// <param name="path">The path to PDF file.</param>
/// <param name="success">A value which indicates that the PDF printing completed successfully.</param>
public PdfPrintFinishedRoutedEventArgs(string path, bool success)
: base(WebView.PdfPrintFinishedEvent)
{
this.Path = path;
this.Success = success;
}
/// <summary>
/// Gets the path to PDF file.
/// </summary>
public string Path { get; }
/// <summary>
/// Gets a value which indicates that the PDF printing completed successfully.
/// </summary>
/// <value></value>
public bool Success { get; }
}
}
@@ -1,81 +0,0 @@
#if AVALONIA
using Avalonia.Interactivity;
#elif WPF
using System.Windows;
#endif
using System;
#if AVALONIA
namespace CefNet.Avalonia
#elif WPF
namespace CefNet.Wpf
#endif
{
/// <summary>
/// Event args for the <see cref="IChromiumWebView.ScriptDialogOpening"/> event.
/// </summary>
public sealed class ScriptDialogOpeningRoutedEventArgs : RoutedEventArgs, IScriptDialogOpeningEventArgs
{
private readonly ScriptDialogDeferral _callback;
/// <summary>
/// Initializes a new instance of the <see cref="ScriptDialogOpeningEventArgs"/> class.
/// </summary>
/// <param name="originUrl">The URI of the page that requested the dialog box.</param>
/// <param name="kind">The kind of JavaScript dialog box.</param>
/// <param name="message">The message of the dialog box.</param>
/// <param name="defaultText">The default value to use for the result of the prompt JavaScript function.</param>
/// <param name="callback"></param>
public ScriptDialogOpeningRoutedEventArgs(string originUrl, ScriptDialogKind kind, string message, string defaultText, ScriptDialogDeferral callback)
: base(WebView.ScriptDialogOpeningEvent)
{
this.Uri = Uri.TryCreate(originUrl, UriKind.Absolute, out Uri uri) ? uri : null;
this.Kind = kind;
this.Message = message;
this.DefaultText = defaultText;
_callback = callback;
}
/// <summary>
/// Initializes a new instance of the <see cref="ScriptDialogOpeningEventArgs"/> class.
/// </summary>
/// <param name="kind">The kind of JavaScript dialog box.</param>
/// <param name="message">The message of the dialog box.</param>
/// <param name="reload">Indicates that the event is fired before page reloading.</param>
/// <param name="callback"></param>
public ScriptDialogOpeningRoutedEventArgs(string message, bool reload, ScriptDialogDeferral callback)
: base(WebView.ScriptDialogOpeningEvent)
{
this.Uri = null;
this.Kind = ScriptDialogKind.BeforeUnload;
this.Message = message;
this.IsReload = reload;
_callback = callback;
}
/// <inheritdoc/>
public Uri Uri { get; }
/// <inheritdoc/>
public ScriptDialogKind Kind { get; }
/// <inheritdoc/>
public string Message { get; }
/// <inheritdoc/>
public string DefaultText { get; }
/// <inheritdoc/>
public bool Suppress { get; set; }
/// <inheritdoc />
public bool IsReload { get; set; }
/// <inheritdoc/>
public ScriptDialogDeferral GetDeferral()
{
this.Handled = true;
return _callback;
}
}
}
@@ -1,39 +0,0 @@
#if AVALONIA
using Avalonia.Interactivity;
#elif WPF
using System.Windows;
#endif
#if AVALONIA
namespace CefNet.Avalonia
#elif WPF
namespace CefNet.Wpf
#endif
{
/// <summary>
/// Represents find results.
/// </summary>
public sealed class TextFoundRoutedEventArgs : RoutedEventArgs, ITextFoundEventArgs
{
public TextFoundRoutedEventArgs(int identifier, int count, CefRect selectionRect, int index, bool finalUpdate)
: base(WebView.TextFoundEvent)
{
this.ID = identifier;
this.Count = count;
this.SelectionRect = selectionRect;
this.Index = index;
this.FinalUpdate = finalUpdate;
}
public int ID { get; }
public int Index { get; }
public int Count { get; }
public CefRect SelectionRect { get; }
public bool FinalUpdate { get; }
}
}
File diff suppressed because it is too large Load Diff
-21
View File
@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2020 CefNet
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Binary file not shown.
-116
View File
@@ -1,116 +0,0 @@
# 前言
Steam++项目创建于2018年5月8日,不过并不是耗时三年才做出来,之前一直由于软软(软件原作者)的工作原因,并没有多少空闲时间,直到去年中旬软软辞职了,才开始猛肝。
去年年底发布了Steam++的第一个版本,受到了其乐广大用户的喜爱,并有了高达数百位网友的赞助支持。在此动力下,一直一个人更新维护到今年2月份。之后又找来几位朋友一起全职合作开发,并创立了我们自己的公司来进行运营这一产品。
在每人每天近16小时的高强度爆肝下,我们使用了最新的技术、最新的框架,将Steam++原先的代码全部重写,重新制作了UI。于是乎,Steam++2.0崭新出炉了。
Steam++目前处于一个完全开源的状态,所以对于软件报毒可以不用担心安全问题。我们也制作了自己的产品[官网](https://www.steampp.net),大家可以去官网下载到我们的工具。
# Steam++工具箱
## 更新内容
### 2.3.0
```
1. 改进 端口被占用检测进程名
2. 修复 部分 Toast 没有正确显示
3. 新增 账号注销功能
4. 改进 hosts 文件写入无权操作时显示的错误文本
5. 新增 快速登录后可绑定手机号
6. 新增 解绑快速登录账号
7. 新增 隐藏库存游戏
8. 新增 游戏功能-无边框窗口化
9. 新增 关于-更新日志
10. 新增 令牌加密设置,现在新增令牌默认将不启用本机加密
11. 修复 非正常退出程序时导致残留进程且无法启动程序
12. 改进 不再写入 C:\Users\用户名\AppData\Local 目录
13. 修复 文本框中某些符号可能无法正确输入
14. 改进 令牌排序上移下移
15. 新增 令牌导入导出
16. 新增 游戏时长挂机功能
17. 新增 Microsoft 账号快速登录与绑定
18. 新增 社区加速 hCaptcha 验证码 / EPIC 验证码 / artstation / v2ex
19. 修复 社区加速 discord 更新下载
```
## 工具介绍
「Steam++」是一个包含多种Steam工具功能的工具箱,所有功能完全免费,开源发布于Github,如果您对发布的二进制文件不放心,可以自行下载源码编译运行。
此工具的大部分功能都是需要您下载安装Steam才能使用。
工具预计将整合进大部分常用的Steam相关工具,并且尽力做到比原工具更好用。
软件截图
[hide]
[attachimg]1228394[/attachimg]
[attachimg]1228395[/attachimg]
[attachimg]1228396[/attachimg]
[attachimg]1228397[/attachimg]
[/hide]
## 核心功能
### 1. 通过本地反代理Steam的社区等网页使其能正常访问
功能使用Titanium-Web-Proxy开源项目进行本地反代,相比SteamCommunity302工具具有更快的启动速度。让用户能够连接上诸如Steam社区(个人资料页)、Discord语音聊天、Twitch直播观看、Origin下载加速、谷歌验证码、Pixiv图片等。
[attachimg]1228388[/attachimg]
### 2. 快速切换当前PC已经记住登陆的Steam账号
该功能是读取Steam路径下存储的本地用户登录记录直接展示操作,可以多账号切换无需重新输入密码和令牌。如果您的ip地址更换,会导致登陆状态失效。在Steam++2.0新版本支持了动态头像。
[attachimg]1228389[/attachimg]
### 3. Steam游戏的成就统计管理功能
能够读取任何游戏的成就信息(包括隐藏成就),并且能进行成就修改,包括成就解锁以及成就反解锁,还能够修改成就统计信息
参考SAM(SteamAchievementManager)进行二次开发,修复了成就语言有中文却依然是英文成就信息的BUG,修改了游戏列表的加载和操作易用性。
注意:滥用成就管理功能可能会导致开发者封禁!
[attachimg]1228390[/attachimg]
### 4. Steam本地两步身份验证器
该功能能够将Steam手机令牌储存到您的电脑中,并能够进行与手机端一样的操作。
不仅能查看手机令牌,还能进行交易报价确认,并且能一键全部确认。
功能参考WinAuth开发,功能类似的软件有WinAuth、SteamDesktopAuthenticator。
[attachimg]1228391[/attachimg]
本地令牌交易市场报价确认
[attachimg]1262615[/attachimg]
### 5. Steam内置浏览器脚本注入
通过反代加速功能将js脚本内置插入了Steam客户端内的浏览器,达到了与油猴类似的效果。目前2.0.0.6版本新增了脚本工坊,可以从我们的服务器上下载到已经兼容的脚本。我们也会不断添加新的脚本,同时也会对旧的脚本进行维护。
### 6. 更多的游戏工具功能
支持各种老游戏无边框窗口化等等
### 6. 更新计划(画饼时间到)
我们预计会在6月份将推出本地挂卡、挂时长功能。并且同步推出iOS、安卓端App,用户可以利用手机查看多个账号的令牌,一键确认上架,并且支持手机挂卡。
#### 并且,以上功能全部免费!
------
## 运行环境
> 程序使用C# 在 .NET 6.0环境下开发,新版采用独立部署编译,不需要运行环境也可以运行)。
## 下载
> [官网](https://steampp.net/)
> [Github](https://github.com/rmbadmin/SteamTools/releases)
> 分流下载:
> [hide]
> [蓝奏云](https://cliencer.lanzous.com/b0165duja)
> 提取码:1234
> [/hide]
使用过程中可能遇到windows defender误报,您可以选择添加信任。
-32
View File
@@ -1,32 +0,0 @@
1. 修复 添加令牌时引发的闪退
2. CLR 升级至 .NET 6 Preview 4
3. 64 位程序支持,从此版本开始不再提供 32 位程序支持
4. CEF 升级至 90.6.3
5. 改进 程序目录结构,所有相关 dll 将放入 bin 文件夹中
6. 新增 全新的托盘菜单
7. 改进 隐藏游戏列表与挂机游戏列表实时刷新
8. 新增 JumpList 菜单切换账号
9. 修复 Win7 中右上角按钮样式错误
10. 改进 缓存获取加速项目数据,避免失败时无数据
11. 修复 手动检查更新时有概率出现两个新版本窗口
12. 改进 未使用社区加速时退出程序不再清理 hosts 文件
| File | Checksum (SHA256) |
| ---- | ---- |
| Steam++_win_x64_v2.4.0.7z | SHA256 |
| Steam++_win_x64_v2.4.0.exe | SHA256 |
| Steam++_win_x64_v2.4.0.msix | SHA256 |
| Steam++_win_arm64_v2.4.0.7z | SHA256 |
| Steam++_win_arm64_v2.4.0.exe | SHA256 |
| Steam++_win_arm64_v2.4.0.msix | SHA256 |
| Steam++_linux_x64_v2.4.0.7z | SHA256 |
| Steam++_linux_x64_v2.4.0.deb | SHA256 |
| Steam++_macos_x64_v2.4.0.dmg | SHA256 |
| Steam++_macos_arm64_v2.4.0.dmg | SHA256 |
| Steam++_android_v2.4.0.apk | SHA256 |
| Steam++_android_arm64_v2.4.0.apk | SHA256 |
| Steam++_android_arm_v2.4.0.apk | SHA256 |
***
由于程序体积较大,推荐从 [官网 https://steampp.net](https://steampp.net) 中下载
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc.--><g fill="#3ddc84"><path d="M420.55,301.93a24,24,0,1,1,24-24,24,24,0,0,1-24,24m-265.1,0a24,24,0,1,1,24-24,24,24,0,0,1-24,24m273.7-144.48,47.94-83a10,10,0,1,0-17.27-10h0l-48.54,84.07a301.25,301.25,0,0,0-246.56,0L116.18,64.45a10,10,0,1,0-17.27,10h0l47.94,83C64.53,202.22,8.24,285.55,0,384H576c-8.24-98.45-64.54-181.78-146.85-226.55"/></g></svg>

After

Width:  |  Height:  |  Size: 570 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc.--><g fill="#A2AAAD"><path d="M318.7 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7C63.3 141.2 4 184.8 4 273.5q0 39.3 14.4 81.2c12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zm-56.6-164.2c27.3-32.4 24.8-61.9 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z"/></g></svg>

After

Width:  |  Height:  |  Size: 704 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc.--><g fill="#E95420"><path d="M220.8 123.3c1 .5 1.8 1.7 3 1.7 1.1 0 2.8-.4 2.9-1.5.2-1.4-1.9-2.3-3.2-2.9-1.7-.7-3.9-1-5.5-.1-.4.2-.8.7-.6 1.1.3 1.3 2.3 1.1 3.4 1.7zm-21.9 1.7c1.2 0 2-1.2 3-1.7 1.1-.6 3.1-.4 3.5-1.6.2-.4-.2-.9-.6-1.1-1.6-.9-3.8-.6-5.5.1-1.3.6-3.4 1.5-3.2 2.9.1 1 1.8 1.5 2.8 1.4zM420 403.8c-3.6-4-5.3-11.6-7.2-19.7-1.8-8.1-3.9-16.8-10.5-22.4-1.3-1.1-2.6-2.1-4-2.9-1.3-.8-2.7-1.5-4.1-2 9.2-27.3 5.6-54.5-3.7-79.1-11.4-30.1-31.3-56.4-46.5-74.4-17.1-21.5-33.7-41.9-33.4-72C311.1 85.4 315.7.1 234.8 0 132.4-.2 158 103.4 156.9 135.2c-1.7 23.4-6.4 41.8-22.5 64.7-18.9 22.5-45.5 58.8-58.1 96.7-6 17.9-8.8 36.1-6.2 53.3-6.5 5.8-11.4 14.7-16.6 20.2-4.2 4.3-10.3 5.9-17 8.3s-14 6-18.5 14.5c-2.1 3.9-2.8 8.1-2.8 12.4 0 3.9.6 7.9 1.2 11.8 1.2 8.1 2.5 15.7.8 20.8-5.2 14.4-5.9 24.4-2.2 31.7 3.8 7.3 11.4 10.5 20.1 12.3 17.3 3.6 40.8 2.7 59.3 12.5 19.8 10.4 39.9 14.1 55.9 10.4 11.6-2.6 21.1-9.6 25.9-20.2 12.5-.1 26.3-5.4 48.3-6.6 14.9-1.2 33.6 5.3 55.1 4.1.6 2.3 1.4 4.6 2.5 6.7v.1c8.3 16.7 23.8 24.3 40.3 23 16.6-1.3 34.1-11 48.3-27.9 13.6-16.4 36-23.2 50.9-32.2 7.4-4.5 13.4-10.1 13.9-18.3.4-8.2-4.4-17.3-15.5-29.7zM223.7 87.3c9.8-22.2 34.2-21.8 44-.4 6.5 14.2 3.6 30.9-4.3 40.4-1.6-.8-5.9-2.6-12.6-4.9 1.1-1.2 3.1-2.7 3.9-4.6 4.8-11.8-.2-27-9.1-27.3-7.3-.5-13.9 10.8-11.8 23-4.1-2-9.4-3.5-13-4.4-1-6.9-.3-14.6 2.9-21.8zM183 75.8c10.1 0 20.8 14.2 19.1 33.5-3.5 1-7.1 2.5-10.2 4.6 1.2-8.9-3.3-20.1-9.6-19.6-8.4.7-9.8 21.2-1.8 28.1 1 .8 1.9-.2-5.9 5.5-15.6-14.6-10.5-52.1 8.4-52.1zm-13.6 60.7c6.2-4.6 13.6-10 14.1-10.5 4.7-4.4 13.5-14.2 27.9-14.2 7.1 0 15.6 2.3 25.9 8.9 6.3 4.1 11.3 4.4 22.6 9.3 8.4 3.5 13.7 9.7 10.5 18.2-2.6 7.1-11 14.4-22.7 18.1-11.1 3.6-19.8 16-38.2 14.9-3.9-.2-7-1-9.6-2.1-8-3.5-12.2-10.4-20-15-8.6-4.8-13.2-10.4-14.7-15.3-1.4-4.9 0-9 4.2-12.3zm3.3 334c-2.7 35.1-43.9 34.4-75.3 18-29.9-15.8-68.6-6.5-76.5-21.9-2.4-4.7-2.4-12.7 2.6-26.4v-.2c2.4-7.6.6-16-.6-23.9-1.2-7.8-1.8-15 .9-20 3.5-6.7 8.5-9.1 14.8-11.3 10.3-3.7 11.8-3.4 19.6-9.9 5.5-5.7 9.5-12.9 14.3-18 5.1-5.5 10-8.1 17.7-6.9 8.1 1.2 15.1 6.8 21.9 16l19.6 35.6c9.5 19.9 43.1 48.4 41 68.9zm-1.4-25.9c-4.1-6.6-9.6-13.6-14.4-19.6 7.1 0 14.2-2.2 16.7-8.9 2.3-6.2 0-14.9-7.4-24.9-13.5-18.2-38.3-32.5-38.3-32.5-13.5-8.4-21.1-18.7-24.6-29.9s-3-23.3-.3-35.2c5.2-22.9 18.6-45.2 27.2-59.2 2.3-1.7.8 3.2-8.7 20.8-8.5 16.1-24.4 53.3-2.6 82.4.6-20.7 5.5-41.8 13.8-61.5 12-27.4 37.3-74.9 39.3-112.7 1.1.8 4.6 3.2 6.2 4.1 4.6 2.7 8.1 6.7 12.6 10.3 12.4 10 28.5 9.2 42.4 1.2 6.2-3.5 11.2-7.5 15.9-9 9.9-3.1 17.8-8.6 22.3-15 7.7 30.4 25.7 74.3 37.2 95.7 6.1 11.4 18.3 35.5 23.6 64.6 3.3-.1 7 .4 10.9 1.4 13.8-35.7-11.7-74.2-23.3-84.9-4.7-4.6-4.9-6.6-2.6-6.5 12.6 11.2 29.2 33.7 35.2 59 2.8 11.6 3.3 23.7.4 35.7 16.4 6.8 35.9 17.9 30.7 34.8-2.2-.1-3.2 0-4.2 0 3.2-10.1-3.9-17.6-22.8-26.1-19.6-8.6-36-8.6-38.3 12.5-12.1 4.2-18.3 14.7-21.4 27.3-2.8 11.2-3.6 24.7-4.4 39.9-.5 7.7-3.6 18-6.8 29-32.1 22.9-76.7 32.9-114.3 7.2zm257.4-11.5c-.9 16.8-41.2 19.9-63.2 46.5-13.2 15.7-29.4 24.4-43.6 25.5s-26.5-4.8-33.7-19.3c-4.7-11.1-2.4-23.1 1.1-36.3 3.7-14.2 9.2-28.8 9.9-40.6.8-15.2 1.7-28.5 4.2-38.7 2.6-10.3 6.6-17.2 13.7-21.1.3-.2.7-.3 1-.5.8 13.2 7.3 26.6 18.8 29.5 12.6 3.3 30.7-7.5 38.4-16.3 9-.3 15.7-.9 22.6 5.1 9.9 8.5 7.1 30.3 17.1 41.6 10.6 11.6 14 19.5 13.7 24.6zM173.3 148.7c2 1.9 4.7 4.5 8 7.1 6.6 5.2 15.8 10.6 27.3 10.6 11.6 0 22.5-5.9 31.8-10.8 4.9-2.6 10.9-7 14.8-10.4s5.9-6.3 3.1-6.6-2.6 2.6-6 5.1c-4.4 3.2-9.7 7.4-13.9 9.8-7.4 4.2-19.5 10.2-29.9 10.2s-18.7-4.8-24.9-9.7c-3.1-2.5-5.7-5-7.7-6.9-1.5-1.4-1.9-4.6-4.3-4.9-1.4-.1-1.8 3.7 1.7 6.5z"/></g></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc.--><g fill="#00adef"><path d="M0 93.7l183.6-25.3v177.4H0V93.7zm0 324.6l183.6 25.3V268.4H0v149.9zm203.8 28L448 480V268.4H203.8v177.9zm0-380.6v180.1H448V32L203.8 65.7z"/></g></svg>

After

Width:  |  Height:  |  Size: 404 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 364 KiB

After

Width:  |  Height:  |  Size: 364 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Before

Width:  |  Height:  |  Size: 364 KiB

After

Width:  |  Height:  |  Size: 364 KiB

Some files were not shown because too many files have changed in this diff Show More