From 3d148954714d8171bde8331a895a2a1831721ac3 Mon Sep 17 00:00:00 2001 From: kosette <35268640+Kosette@users.noreply.github.com> Date: Sun, 15 Sep 2024 21:12:08 +0800 Subject: [PATCH] feat: add windows package style: use builtin icons fix: fix dark theme --- .github/workflows/build_gnu.yml | 50 +- .github/workflows/build_linux.yml | 2 +- Cargo.lock | 829 +++++++++++++++++++----------- Cargo.toml | 6 + build.rs | 7 + resources/ui/icons/tsukimi.ico | Bin 0 -> 53515 bytes src/config/mod.rs | 67 ++- src/main.rs | 23 + src/ui/mod.rs | 3 + src/ui/mpv/tsukimi_mpv.rs | 9 +- src/ui/style.css | 222 +++++--- src/ui/widgets/item.rs | 49 +- src/ui/widgets/server_panel.rs | 4 +- src/ui/widgets/server_row.rs | 2 +- tsukimi_installer.nsi | 81 +++ tsukimi_manifest.rc | 1 + 16 files changed, 928 insertions(+), 427 deletions(-) create mode 100644 resources/ui/icons/tsukimi.ico create mode 100644 tsukimi_installer.nsi create mode 100644 tsukimi_manifest.rc diff --git a/.github/workflows/build_gnu.yml b/.github/workflows/build_gnu.yml index 6c66a234..66946fc0 100644 --- a/.github/workflows/build_gnu.yml +++ b/.github/workflows/build_gnu.yml @@ -3,13 +3,12 @@ on: workflow_dispatch: push: branches: - - 'main' + - "style" env: CARGO_TERM_COLOR: always CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse - jobs: build-release: env: @@ -42,20 +41,25 @@ jobs: mingw-w64-x86_64-mpv mingw-w64-x86_64-libadwaita mingw-w64-x86_64-gstreamer - mingw-w64-x86_64-meson mingw-w64-x86_64-glib2 mingw-w64-x86_64-gst-plugins-base mingw-w64-x86_64-gst-plugins-good mingw-w64-x86_64-gst-plugins-bad mingw-w64-x86_64-gst-plugins-ugly mingw-w64-x86_64-gst-libav - git + curl - name: Build tsukimi-${{ matrix.target }} if: ${{ !startsWith(github.ref, 'refs/tags/') }} - shell: powershell + shell: msys2 {0} run: | - $env:Path = "C:\msys64\mingw64\bin;C:\msys64\mingw64\lib;C:\msys64\mingw64\include;" + $env:Path; + curl -LO https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-gtk4-4.14.5-1-any.pkg.tar.zst + pacman --noconfirm -U ./mingw-w64-x86_64-gtk4-4.14.5-1-any.pkg.tar.zst + + curl -LO https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-libadwaita-1.5.3-1-any.pkg.tar.zst + pacman --noconfirm -U ./mingw-w64-x86_64-libadwaita-1.5.3-1-any.pkg.tar.zst + + export PATH="/c/Users/runneradmin/.cargo/bin:$PATH" rustup default stable-gnu cargo build --release --locked @@ -75,8 +79,6 @@ jobs: cp -r /mingw64/lib/gstreamer-1.0 lib/ && find lib/gstreamer-1.0 -type f ! -name "*.dll" -exec rm -f "{}" \; - cp -r /mingw64/lib/clapper-0.0 lib/ && find lib/clapper-0.0 -type f ! -name "*.dll" -exec rm -f "{}" \; - cp -r /mingw64/share/glib-2.0 share/ find share/glib-2.0/* -maxdepth 0 -type d ! -name "*schemas*" -exec rm -rf "{}" \; mv $GITHUB_WORKSPACE/moe.tsuna.tsukimi.gschema.xml share/glib-2.0/schemas/ @@ -103,13 +105,39 @@ jobs: ldd bin/tsukimi.exe | grep '\/mingw64.*\.dll' -o | xargs -I{} cp -n "{}" bin/ find lib/ -type f -name "*.dll" -exec ldd "{}" \; | grep '\/mingw64.*\.dll' -o | xargs -I{} cp -n "{}" bin/ + - name: Create NSIS installer + if: ${{ !startsWith(github.ref, 'refs/tags/') }} + shell: powershell + run: | + cp tsukimi_installer.nsi artifact + makensis /V4 artifact/tsukimi_installer.nsi + rm artifact/tsukimi_installer.nsi + + - name: Build Thin Package + if: ${{ !startsWith(github.ref, 'refs/tags/') }} + shell: powershell + run: | + cd artifact/tsukimi-windows-gnu-amd64 + 7z.exe a ../tsukimi-${{matrix.arch}}.7z ./* + + - name: Calculate Checksum + if: ${{ !startsWith(github.ref, 'refs/tags/') }} + shell: msys2 {0} + run: | + cd artifact + sha512sum *.7z > tsukimi-7z.sha512sum + sha512sum *.7z > tsukimi.sha512sum + sha512sum *.exe >> tsukimi.sha512sum + - name: Upload artifact if: ${{ !startsWith(github.ref, 'refs/tags/') }} uses: actions/upload-artifact@v4 with: name: tsukimi-${{matrix.arch}} path: | - artifact/tsukimi-windows-gnu-amd64/* - compression-level: 5 + artifact/*.exe + artifact/*.7z + artifact/*.sha512sum + compression-level: 0 retention-days: 3 - if-no-files-found: error \ No newline at end of file + if-no-files-found: error diff --git a/.github/workflows/build_linux.yml b/.github/workflows/build_linux.yml index e6c1b74c..d5c50cc3 100644 --- a/.github/workflows/build_linux.yml +++ b/.github/workflows/build_linux.yml @@ -3,7 +3,7 @@ on: workflow_dispatch: push: branches: - - 'main' + - 'style' # schedule: # - cron: '45 3 * * *' diff --git a/Cargo.lock b/Cargo.lock index f312f4ac..51592a56 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" dependencies = [ "gimli", ] @@ -55,9 +55,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.14" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", @@ -70,33 +70,33 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.3" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -133,9 +133,9 @@ dependencies = [ [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-channel" @@ -159,6 +159,12 @@ dependencies = [ "windows-sys 0.42.0", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.3.0" @@ -190,17 +196,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.2", + "miniz_oxide 0.8.0", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -229,9 +235,9 @@ checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitstream-io" -version = "2.4.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "415f8399438eb5e4b2f73ed3152a3448b98149dda642a957ee704e1daa5cf1d8" +checksum = "b81e1519b0d82120d2fd469d5bfb2919a9361c48b02d82d04befc1cdd2002452" [[package]] name = "block" @@ -250,9 +256,9 @@ dependencies = [ [[package]] name = "built" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6a6c0b39c38fd754ac338b00a88066436389c0f029da5d37d1e01091d9b7c17" +checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4" [[package]] name = "bumpalo" @@ -271,9 +277,15 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.16.1" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" + +[[package]] +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "byteorder-lite" @@ -283,21 +295,20 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cairo-rs" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "797fd5a634dcb0ad0d7d583df794deb0a236d88e759cd34b7da20198c6c9d145" +checksum = "e8a0ea147c94108c9613235388f540e4d14c327f7081c9e471fc8ee8a2533e69" dependencies = [ "bitflags 2.6.0", "cairo-sys-rs", "glib", "libc", - "thiserror", ] [[package]] @@ -308,7 +319,7 @@ checksum = "428290f914b9b86089f60f5d8a9f6e440508e1bcff23b25afd51502b0a2da88f" dependencies = [ "glib-sys", "libc", - "system-deps 7.0.1", + "system-deps 7.0.2", ] [[package]] @@ -341,9 +352,9 @@ dependencies = [ [[package]] name = "cargo_toml" -version = "0.20.2" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8cb1d556b8b8f36e5ca74938008be3ac102f5dcb5b68a0477e4249ae2291cd3" +checksum = "ad639525b1c67b6a298f378417b060fbc04618bea559482a8484381cce27d965" dependencies = [ "serde", "toml", @@ -351,13 +362,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.97" +version = "1.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" +checksum = "2d74707dde2ba56f86ae90effb3b43ddd369504387e718014de010cec7959800" dependencies = [ "jobserver", "libc", - "once_cell", + "shlex", ] [[package]] @@ -370,6 +381,16 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cfg-expr" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345c78335be0624ed29012dc10c49102196c6882c12dde65d9f35b02da2aada8" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -399,9 +420,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "concurrent-queue" @@ -424,24 +445,24 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -467,9 +488,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -586,9 +607,9 @@ dependencies = [ [[package]] name = "either" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "elf" @@ -596,6 +617,20 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" +[[package]] +name = "embed-resource" +version = "2.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4edcacde9351c33139a41e3c97eb2334351a81a2791bebb0b243df837128f602" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml", + "vswhom", + "winreg", +] + [[package]] name = "encoding_rs" version = "0.8.34" @@ -607,9 +642,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" dependencies = [ "log", "regex", @@ -617,9 +652,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.3" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" dependencies = [ "anstream", "anstyle", @@ -657,9 +692,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.3.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", @@ -686,7 +721,7 @@ dependencies = [ "flume", "half", "lebe", - "miniz_oxide 0.7.2", + "miniz_oxide 0.7.4", "rayon-core", "smallvec", "zune-inflate", @@ -694,9 +729,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fdeflate" @@ -719,14 +754,14 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.23" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", - "windows-sys 0.52.0", + "libredox", + "windows-sys 0.59.0", ] [[package]] @@ -852,9 +887,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28bb53ecb56857c683c9ec859908e076dd3969c7d67598bd8b1ce095d211304a" +checksum = "8730751991b97419fc3f0c2dca2c9e45b48edf46e48e0f965964ecf33889812f" dependencies = [ "gdk-pixbuf-sys", "gio", @@ -864,15 +899,15 @@ dependencies = [ [[package]] name = "gdk-pixbuf-sys" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6681a0c1330d1d3968bec1529f7172d62819ef0bdbb0d18022320654158b03" +checksum = "1ffbf649fd5b1c8c0f0feeb015b7533c3ef92da2887fb95ddd338bc2b1644a7c" dependencies = [ "gio-sys", "glib-sys", "gobject-sys", "libc", - "system-deps 7.0.1", + "system-deps 7.0.2", ] [[package]] @@ -904,7 +939,7 @@ dependencies = [ "libc", "pango-sys", "pkg-config", - "system-deps 7.0.1", + "system-deps 7.0.2", ] [[package]] @@ -941,9 +976,9 @@ dependencies = [ [[package]] name = "gettext-rs" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e49ea8a8fad198aaa1f9655a2524b64b70eb06b2f3ff37da407566c93054f364" +checksum = "4a6716b8a0db461a2720b850ba1623e5b69e4b1aa0224cf5e1fb23a0fe49e65c" dependencies = [ "gettext-sys", "locale_config", @@ -951,9 +986,9 @@ dependencies = [ [[package]] name = "gettext-sys" -version = "0.21.3" +version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c63ce2e00f56a206778276704bbe38564c8695249fdc8f354b4ef71c57c3839d" +checksum = "f7b8797f28f2dabfbe2caadb6db4f7fd739e251b5ede0a2ba49e506071edcf67" dependencies = [ "cc", "temp-dir", @@ -971,15 +1006,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" [[package]] name = "gio" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "398e3da68749fdc32783cbf7521ec3f65c9cf946db8c7774f8460af49e52c6e2" +checksum = "dcacaa37401cad0a95aadd266bc39c72a131d454fc012f6dfd217f891d76cc52" dependencies = [ "futures-channel", "futures-core", @@ -990,19 +1025,18 @@ dependencies = [ "libc", "pin-project-lite", "smallvec", - "thiserror", ] [[package]] name = "gio-sys" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4feb96b31c32730ea3e1e89aecd2e4e37ecb1c473ad8f685e3430a159419f63" +checksum = "5237611e97e9b86ab5768adc3eef853ae713ea797aa3835404acdfacffc9fb38" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 7.0.1", + "system-deps 7.0.2", "windows-sys 0.52.0", ] @@ -1034,14 +1068,14 @@ checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" dependencies = [ "khronos_api 3.1.0", "log", - "xml-rs 0.8.21", + "xml-rs 0.8.22", ] [[package]] name = "glib" -version = "0.20.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee90a615ce05be7a32932cfb8adf2c4bbb4700e80d37713c981fb24c0c56238" +checksum = "95648aac01b75503000bb3bcaa5ec7a7a2dd61e43636b8b1814854de94dd80e4" dependencies = [ "bitflags 2.6.0", "futures-channel", @@ -1056,7 +1090,6 @@ dependencies = [ "libc", "memchr", "smallvec", - "thiserror", ] [[package]] @@ -1070,9 +1103,9 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.20.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4da558d8177c0c8c54368818b508a4244e1286fce2858cef4e547023f0cfa5ef" +checksum = "302f1d633c9cdef4350330e7b68fd8016e2834bb106c93fdf9789fcde753c1ab" dependencies = [ "heck", "proc-macro-crate", @@ -1083,12 +1116,12 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4958c26e5a01c9af00dea669a97369eccbec29a8e6d125c24ea2d85ee7467b60" +checksum = "92eee4531c1c9abba945d19378b205031b5890e1f99c319ba0503b6e0c06a163" dependencies = [ "libc", - "system-deps 7.0.1", + "system-deps 7.0.2", ] [[package]] @@ -1099,20 +1132,20 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "gobject-sys" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6908864f5ffff15b56df7e90346863904f49b949337ed0456b9287af61903b8" +checksum = "fa3d1dcd8a1eb2e7c22be3d5e792b14b186f3524f79b25631730f9a8c169d49a" dependencies = [ "glib-sys", "libc", - "system-deps 7.0.1", + "system-deps 7.0.2", ] [[package]] name = "graphene-rs" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630e940ad5824f90221d6579043a9cd1f8bec86b4a17faaf7827d58eb16e8c1f" +checksum = "80aac87f74e81c0e13433e892a047237abdc37945c86887f5eed905038356e69" dependencies = [ "glib", "graphene-sys", @@ -1121,14 +1154,14 @@ dependencies = [ [[package]] name = "graphene-sys" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8fade7b754982f47ebbed241fd2680816fdd4598321784da10b9e1168836a" +checksum = "cc2f91ecd32989efad60326cc20a8fb252bd2852239a08e4e70cde8c100de9ca" dependencies = [ "glib-sys", "libc", "pkg-config", - "system-deps 7.0.1", + "system-deps 7.0.2", ] [[package]] @@ -1159,14 +1192,14 @@ dependencies = [ "graphene-sys", "libc", "pango-sys", - "system-deps 7.0.1", + "system-deps 7.0.2", ] [[package]] name = "gstreamer" -version = "0.23.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e95b1d1153239a621ec143501fdcca6c1ad3efb87d268597285f85c4136f73" +checksum = "683e15f8cc3a1a2646d9fe2181a58b7abb4c166256d8d15cce368e420c741140" dependencies = [ "cfg-if", "futures-channel", @@ -1196,14 +1229,14 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 7.0.1", + "system-deps 7.0.2", ] [[package]] name = "gtk4" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaffc6c743c9160514cc9b67eace364e5dc5798369fa809cdb04e035c21c5c5d" +checksum = "f4fe572bf318e5dbc6f5a2f8a25d853f1ae3f42768c0b08af6ca20a18f4057e1" dependencies = [ "cairo-rs", "field-offset", @@ -1222,9 +1255,9 @@ dependencies = [ [[package]] name = "gtk4-macros" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "188211f546ce5801f6d0245c37b6249143a2cb4fa040e54829ca1e76796e9f09" +checksum = "e9e7b362c8fccd2712297903717d65d30defdab2b509bc9d209cbe5ffb9fabaf" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -1248,20 +1281,20 @@ dependencies = [ "gsk4-sys", "libc", "pango-sys", - "system-deps 7.0.1", + "system-deps 7.0.2", ] [[package]] name = "h2" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http", "indexmap", "slab", @@ -1306,7 +1339,7 @@ checksum = "f9c7c7c8ac16c798734b8a24560c1362120597c40d5e1459f09498f8f6c8f2ba" dependencies = [ "cfg-if", "libc", - "windows", + "windows 0.52.0", ] [[package]] @@ -1322,9 +1355,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", @@ -1332,12 +1365,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "futures-core", + "futures-util", "http", "http-body", "pin-project-lite", @@ -1345,15 +1378,15 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "hyper" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", @@ -1369,6 +1402,23 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-rustls" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + [[package]] name = "hyper-tls" version = "0.6.0" @@ -1387,9 +1437,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" dependencies = [ "bytes", "futures-channel", @@ -1407,16 +1457,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.52.0", ] [[package]] @@ -1469,12 +1519,12 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d730b085583c4d789dfd07fdcf185be59501666a90c97c40162b37e4fdad272d" +checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" dependencies = [ "byteorder-lite", - "thiserror", + "quick-error", ] [[package]] @@ -1485,9 +1535,9 @@ checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" [[package]] name = "indexmap" -version = "2.2.6" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", "hashbrown", @@ -1506,15 +1556,15 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" [[package]] name = "is_terminal_polyfill" -version = "1.70.0" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" @@ -1542,9 +1592,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] @@ -1557,9 +1607,9 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -1616,7 +1666,7 @@ dependencies = [ "gtk4-sys", "libc", "pango-sys", - "system-deps 7.0.1", + "system-deps 7.0.2", ] [[package]] @@ -1669,13 +1719,14 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", + "redox_syscall", ] [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "locale_config" @@ -1700,6 +1751,12 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "lockfree-object-pool" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" + [[package]] name = "log" version = "0.4.22" @@ -1742,7 +1799,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" dependencies = [ "cfg-if", - "rayon", ] [[package]] @@ -1774,9 +1830,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", "simd-adler32", @@ -1820,11 +1876,10 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -1939,9 +1994,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" dependencies = [ "memchr", ] @@ -1954,9 +2009,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -1986,9 +2041,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -2013,9 +2068,9 @@ dependencies = [ [[package]] name = "pango" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54768854025df6903061d0084fd9702a253ddfd60db7d9b751d43b76689a7f0a" +checksum = "5764e5a174a5a0ec054fe5962ce6d4fc7052e2d0dcc23bbc77202b40a4a403d3" dependencies = [ "gio", "glib", @@ -2025,27 +2080,27 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07cc57d10cee4ec661f718a6902cee18c2f4cfae08e87e5a390525946913390" +checksum = "fd317e1de76b14b3d3efe05518c08b360327f1ab7fec150473a89ffcad4b072d" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 7.0.1", + "system-deps 7.0.2", ] [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -2059,7 +2114,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.1", + "redox_syscall", "smallvec", "windows-targets 0.52.6", ] @@ -2124,22 +2179,25 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.7.2", + "miniz_oxide 0.7.4", ] [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro-crate" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.21.1", + "toml_edit", ] [[package]] @@ -2187,9 +2245,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -2261,16 +2319,15 @@ dependencies = [ [[package]] name = "ravif" -version = "0.11.7" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67376f469e7e7840d0040bbf4b9b3334005bb167f814621326e4c7ab8cd6e944" +checksum = "a8f0bfd976333248de2078d350bfdf182ff96e168a24d23d2436cef320dd4bdd" dependencies = [ "avif-serialize", "imgref", "loop9", "quick-error", "rav1e", - "rayon", "rgb", ] @@ -2296,27 +2353,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", @@ -2337,9 +2385,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -2348,15 +2396,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" -version = "0.12.4" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" dependencies = [ "base64", "bytes", @@ -2368,6 +2416,7 @@ dependencies = [ "http-body", "http-body-util", "hyper", + "hyper-rustls", "hyper-tls", "hyper-util", "ipnet", @@ -2391,18 +2440,33 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg", + "windows-registry", ] [[package]] name = "rgb" -version = "0.8.40" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7439be6844e40133eda024efd85bf07f59d0dd2f59b10c00dd6cfb92cc5c741" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" dependencies = [ "bytemuck", ] +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -2411,18 +2475,18 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ "bitflags 2.6.0", "errno", @@ -2431,11 +2495,24 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rustls" +version = "0.23.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" dependencies = [ "base64", "rustls-pki-types", @@ -2443,9 +2520,20 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] [[package]] name = "ryu" @@ -2455,11 +2543,11 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2470,9 +2558,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", "core-foundation", @@ -2483,9 +2571,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -2499,18 +2587,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", @@ -2519,9 +2607,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", "memchr", @@ -2571,6 +2659,12 @@ dependencies = [ "libc", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -2635,11 +2729,17 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" -version = "2.0.70" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", @@ -2648,26 +2748,29 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", @@ -2679,7 +2782,7 @@ version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ - "cfg-expr", + "cfg-expr 0.15.8", "heck", "pkg-config", "toml", @@ -2688,11 +2791,11 @@ dependencies = [ [[package]] name = "system-deps" -version = "7.0.1" +version = "7.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c81f13d9a334a6c242465140bd262fae382b752ff2011c4f7419919a9c97922" +checksum = "070a0a5e7da2d24be457809c4b3baa57a835fd2829ad8b86f9a049052fe71031" dependencies = [ - "cfg-expr", + "cfg-expr 0.16.0", "heck", "pkg-config", "toml", @@ -2711,9 +2814,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.14" +version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "temp-dir" @@ -2736,18 +2839,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.60" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.60" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", @@ -2767,9 +2870,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -2782,9 +2885,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.3" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", @@ -2819,11 +2922,22 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -2841,7 +2955,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.20", + "toml_edit", ] [[package]] @@ -2855,26 +2969,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.21.1" +version = "0.22.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.22.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.18", + "winnow", ] [[package]] @@ -2890,20 +2993,19 @@ dependencies = [ "tokio", "tower-layer", "tower-service", - "tracing", ] [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -2911,7 +3013,6 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -2955,6 +3056,7 @@ dependencies = [ "chrono", "derive_builder", "dirs", + "embed-resource", "epoxy", "flume", "gettext-rs", @@ -2977,14 +3079,9 @@ dependencies = [ "tracing", "url", "uuid", + "windows 0.58.0", ] -[[package]] -name = "typed-arena" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" - [[package]] name = "typenum" version = "1.17.0" @@ -2999,9 +3096,9 @@ checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" @@ -3014,9 +3111,15 @@ dependencies = [ [[package]] name = "unicode-width" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" @@ -3031,9 +3134,9 @@ dependencies = [ [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" @@ -3069,9 +3172,29 @@ checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" +dependencies = [ + "cc", + "libc", +] [[package]] name = "want" @@ -3090,19 +3213,20 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", @@ -3115,9 +3239,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -3127,9 +3251,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3137,9 +3261,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", @@ -3150,15 +3274,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -3198,7 +3322,17 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-core", + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", "windows-targets 0.52.6", ] @@ -3211,6 +3345,71 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.42.0" @@ -3416,15 +3615,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - [[package]] name = "winnow" version = "0.6.18" @@ -3455,9 +3645,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "539a77ee7c0de333dcc6da69b177380a0b81e0dacfa4f7344c465a36871ee601" +checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26" [[package]] name = "xz2" @@ -3468,16 +3658,45 @@ dependencies = [ "lzma-sys", ] +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + [[package]] name = "zopfli" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1f48f3508a3a3f2faee01629564400bc12260f6214a056d06a3aaaa6ef0736" +checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" dependencies = [ + "bumpalo", "crc32fast", + "lockfree-object-pool", "log", + "once_cell", "simd-adler32", - "typed-arena", ] [[package]] @@ -3497,9 +3716,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec866b44a2a1fd6133d363f073ca1b179f438f99e7e5bfb1e33f7181facfe448" +checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768" dependencies = [ "zune-core", ] diff --git a/Cargo.toml b/Cargo.toml index c1645607..39d0b23b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,8 +36,10 @@ atomic-wait = "1.1.0" flume = "0.11.0" derive_builder = "0.20.1" anyhow = "1.0.89" +windows = { version = "0.58.0", features = ["Win32_Foundation", "Win32_System_Registry", "Win32_UI_WindowsAndMessaging"] } [build-dependencies] +embed-resource = "2.4.3" glib-build-tools = "0.20.0" [features] @@ -63,3 +65,7 @@ assets = [ [profile.release] lto = true +codegen-units = 1 +opt-level = "s" +debug = false +strip = true diff --git a/build.rs b/build.rs index 4871d982..b3f0d2ce 100644 --- a/build.rs +++ b/build.rs @@ -1,3 +1,4 @@ +#[cfg(target_os = "linux")] use std::process::Command; fn main() { @@ -29,4 +30,10 @@ fn main() { println!("FAILED"); } } + + #[cfg(windows)] + { + println!("cargo:rerun-if-changed=tsukimi-manifest.rc"); + embed_resource::compile("./tsukimi_manifest.rc", embed_resource::NONE); + } } diff --git a/resources/ui/icons/tsukimi.ico b/resources/ui/icons/tsukimi.ico new file mode 100644 index 0000000000000000000000000000000000000000..6c6792114b6fb4a6214ae86c324577e1df38ca78 GIT binary patch literal 53515 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 f^Z$RV2=NVV)XaTrlxDC8;C7yB8EGOwj* Result<(), Box> { - let mut path = dirs::config_dir().ok_or("Failed to get home directory")?; + let mut path = get_config_dir()?; std::fs::DirBuilder::new().recursive(true).create(&path)?; path.push("tsukimi.toml"); let mut accounts: Accounts = load_cfgv2()?; @@ -53,7 +53,7 @@ pub async fn save_cfg(account: Account) -> Result<(), Box } pub fn load_cfgv2() -> Result> { - let mut path = dirs::config_dir().ok_or("Failed to get home directory")?; + let mut path = get_config_dir()?; path.push("tsukimi.toml"); if !path.exists() { return Ok(Accounts { @@ -68,7 +68,7 @@ pub fn load_cfgv2() -> Result> { } pub fn remove(account: &Account) -> Result<(), Box> { - let mut path = dirs::config_dir().ok_or("Failed to get home directory")?; + let mut path = get_config_dir()?; path.push("tsukimi.toml"); let mut accounts: Accounts = load_cfgv2()?; accounts.accounts.retain(|x| { @@ -88,7 +88,66 @@ pub fn remove(account: &Account) -> Result<(), Box> { .write(true) .create(true) .truncate(true) - .open(&path)?; + .open(path)?; writeln!(file, "{}", toml)?; Ok(()) } + +// Set %APPDATA%\tsukimi as config_dir on Windows +pub fn get_config_dir() -> Result> { + #[cfg(windows)] + { + let path = dirs::config_dir() + .ok_or("Failed to get %APPDATA%")? + .join("tsukimi"); + Ok(path) + } + + #[cfg(unix)] + { + let path = dirs::config_dir().ok_or("Failed to get home directory")?; + Ok(path) + } +} + +pub mod theme { + #[cfg(target_os = "windows")] + use windows::{core::*, Win32::System::Registry::*}; + + /// Use windows api to detect system dark mode setting + #[cfg(target_os = "windows")] + pub fn is_system_dark_mode_enabled() -> bool { + #[cfg(windows)] + unsafe { + let subkey = w!("Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"); + let mut key_handle = HKEY::default(); + + let result = RegOpenKeyExW(HKEY_CURRENT_USER, subkey, 0, KEY_READ, &mut key_handle); + + if result.is_err() { + return false; + } + + let mut data: u32 = 0; + let mut data_size: u32 = std::mem::size_of::() as u32; + let value_name = w!("SystemUsesLightTheme"); + + let result = RegQueryValueExW( + key_handle, + value_name, + None, + None, + Some(&mut data as *mut u32 as *mut u8), + Some(&mut data_size), + ); + + let _ = RegCloseKey(key_handle); + + if result.is_err() { + return false; + } + + data == 0 + } + } +} diff --git a/src/main.rs b/src/main.rs index c058de92..fad61186 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +#![windows_subsystem = "windows"] +#[cfg(target_os = "linux")] use gettextrs::*; use gtk::prelude::*; use gtk::{gio, glib}; @@ -10,7 +12,10 @@ mod ui; mod utils; const APP_ID: &str = "moe.tsuna.tsukimi"; + +#[cfg(target_os = "linux")] const GETTEXT_PACKAGE: &str = "tsukimi"; +#[cfg(target_os = "linux")] const LOCALEDIR: &str = "/usr/share/locale"; fn main() -> glib::ExitCode { @@ -22,12 +27,30 @@ fn main() -> glib::ExitCode { textdomain(GETTEXT_PACKAGE).expect("Invalid string passed to textdomain"); } + // redirect cache dir to %LOCALAPPDATA% + #[cfg(target_os = "windows")] + { + let config_local_dir = dirs::config_local_dir().expect("Failed to get %LOCALAPPDATA%"); + std::env::set_var("XDG_CACHE_HOME", config_local_dir); + } + // Register and include resources gio::resources_register_include!("tsukimi.gresource").expect("Failed to register resources."); // Initialize the GTK application adw::init().expect("Failed to initialize Adw"); + // Determine dark mode setting + #[cfg(target_os = "windows")] + { + use crate::config::theme::is_system_dark_mode_enabled; + + if is_system_dark_mode_enabled() { + let style_manager = adw::StyleManager::default(); + style_manager.set_color_scheme(adw::ColorScheme::PreferDark); + } + } + // Create a new application let app = adw::Application::builder().application_id(APP_ID).build(); diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 2aab310c..e219d6fa 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -63,6 +63,9 @@ pub fn load_css() { accent_color )); + #[cfg(target_os = "windows")] + styles.push_str("window {box-shadow:none;}"); + provider.load_from_string(&styles); gtk::style_context_add_provider_for_display( diff --git a/src/ui/mpv/tsukimi_mpv.rs b/src/ui/mpv/tsukimi_mpv.rs index 141bd2ee..a53f74b0 100644 --- a/src/ui/mpv/tsukimi_mpv.rs +++ b/src/ui/mpv/tsukimi_mpv.rs @@ -36,12 +36,13 @@ pub enum TrackSelection { None, } -impl TrackSelection { - pub fn to_string(&self) -> String { - match self { +impl std::fmt::Display for TrackSelection { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let str = match self { TrackSelection::Track(id) => id.to_string(), TrackSelection::None => "no".to_string(), - } + }; + write!(f, "{}", str) } } diff --git a/src/ui/style.css b/src/ui/style.css index 536c706a..851bba58 100644 --- a/src/ui/style.css +++ b/src/ui/style.css @@ -1,178 +1,176 @@ .sbackground { - background: rgba(0, 0, 0, 0.15); + background: rgba(0, 0, 0, 0.15); } child { - margin: 9px; - border-radius: 15px; + margin: 9px; + border-radius: 15px; } .mediainfo { - padding: 9px; - border-radius: 15px; + padding: 9px; + border-radius: 15px; } .osd { - padding: 7px; + padding: 7px; } .mask { - filter: blur(5px); - border-radius:10px; + filter: blur(5px); + border-radius: 10px; } .logo { - background: rgba(0, 0, 0, 0); + background: rgba(0, 0, 0, 0); } .bottom-bar { - background: transparent; + background: transparent; } .smooth-scale { - padding-top: 0px; - padding-bottom: 0px; + padding-top: 0px; + padding-bottom: 0px; } .frame { - border: 2px solid @borders; - border-radius: 5px; + border: 2px solid @borders; + border-radius: 5px; } .coverimage { - border-radius: 10px; + border-radius: 10px; } .pill { - border-radius: 10px; + border-radius: 10px; } .playing-song-label { - font-weight: bold; + font-weight: bold; } .home-carousel { - border-radius: 10px; - margin: 0px; - box-shadow: none; + border-radius: 10px; + margin: 0px; + box-shadow: none; } -clapper-gtk-video>overlay { - margin:0px; - border-radius:0px; +clapper-gtk-video > overlay { + margin: 0px; + border-radius: 0px; } -clapper-gtk-video>overlay>picture { - margin:0px; - border-radius:0px; +clapper-gtk-video > overlay > picture { + margin: 0px; + border-radius: 0px; } -.boxshadow{ - box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.2); - border-radius: 10px; +.boxshadow { + box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.2); + border-radius: 10px; } /* Starring */ button.star:hover { - opacity: 1; + opacity: 1; } @keyframes rotate_star { - from { - -gtk-icon-transform: rotate(-72deg); - } + from { + -gtk-icon-transform: rotate(-72deg); + } - to {} + to { + } } @keyframes rotate_unstar { - from { - -gtk-icon-transform: rotate(72deg); - } + from { + -gtk-icon-transform: rotate(72deg); + } - to {} + to { + } } button.star.interacted.starred image { - animation: rotate_star 0.4s ease; + animation: rotate_star 0.4s ease; } button.star.interacted:not(.starred) image { - animation: rotate_unstar 0.4s ease; + animation: rotate_unstar 0.4s ease; } .songwidget { - padding: 12px; + padding: 12px; } .no-padding { - padding: 0px; + padding: 0px; } .serverrow { - margin: 6px; - border-radius: 10px; + margin: 6px; + border-radius: 10px; } .horizontal-listview > row { - margin-left: 9px; - margin-right: 9px; - border-radius: 10px; + margin-left: 9px; + margin-right: 9px; + border-radius: 10px; } .vertical-listview > row { - margin: 9px; - border-radius: 10px; + margin: 9px; + border-radius: 10px; } picture { - border-radius: 10px; + border-radius: 10px; } listview { - background-color: rgba(0, 0, 0, 0); + background-color: rgba(0, 0, 0, 0); } gridview { - background-color: rgba(0, 0, 0, 0); + background-color: rgba(0, 0, 0, 0); } -gridview>child box { - margin: 0px; +gridview > child box { + margin: 0px; } - - -overlay>label { - background-color: #AEB5FA; - border-radius: 999px; - margin: 3px; +overlay > label { + background-color: #aeb5fa; + border-radius: 999px; + margin: 3px; } -box>overlay>image { - background-color: #AEB5FA; - border-radius: 999px; - margin: 3px; +box > overlay > image { + background-color: #aeb5fa; + border-radius: 999px; + margin: 3px; } -revealer>box>box>widget { - background-color: rgba(1, 1, 1, 0.1); - border-radius: 10px; +revealer > box > box > widget { + background-color: rgba(1, 1, 1, 0.1); + border-radius: 10px; } -revealer>box>box>widget>box { - margin: 10px; +revealer > box > box > widget > box { + margin: 10px; } -tabbar>revealer>box { - background-color: rgba(0, 0, 0, 0); +tabbar > revealer > box { + background-color: rgba(0, 0, 0, 0); } - - -scrolledwindow>viewport>box>box>box { - margin-left: 15px; - margin-top: 15px; +scrolledwindow > viewport > box > box > box { + margin-left: 15px; + margin-top: 15px; } @define-color accent_bg_color #AEB5FA; @@ -180,23 +178,85 @@ scrolledwindow>viewport>box>box>box { @define-color accent_color #AEB5FA; placessidebar { - background-color: rgba(0, 0, 0, 0); + background-color: rgba(0, 0, 0, 0); } .card { - box-shadow: none; + box-shadow: none; } .sidebar-pane { - box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); } /* Expanding */ row.expand.interacted.expanded image { - transform: rotate(-0.5turn); + transform: rotate(-0.5turn); } - row image { transition: 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94); } + +/* Scale UI Font to 125% */ +* { + -gtk-dpi: 125; +} + +/* GTK4 Window Controls Styles */ +windowcontrols > button { + color: transparent; + min-width: 20px; + min-height: 20px; + padding: 0; + margin: 0 2px; + border: none; + border-radius: 50%; + transition: all 0.2s ease; +} + +windowcontrols > button > image { + padding: 0; + -gtk-icon-size: 14px; + color: rgba(0, 0, 0, 0.7); + opacity: 0; + transition: opacity 0.2s ease, color 0.2s ease; +} + +/* Button colors */ +button.titlebutton.close, +windowcontrols > button.close { + background-color: #ff5f56; +} + +button.titlebutton.maximize, +windowcontrols > button.maximize { + background-color: #ffbd2e; +} + +button.titlebutton.minimize, +windowcontrols > button.minimize { + background-color: #27c93f; +} + +/* Hover states */ +windowcontrols > button:hover { + background-color: rgba(0, 0, 0, 0.1); +} + +windowcontrols > button:hover > image { + opacity: 1; + color: rgba(0, 0, 0, 0.9); +} + +windowcontrols > button.close:hover { + background-color: #ff5f56; +} + +windowcontrols > button.maximize:hover { + background-color: #ffbd2e; +} + +windowcontrols > button.minimize:hover { + background-color: #27c93f; +} diff --git a/src/ui/widgets/item.rs b/src/ui/widgets/item.rs index c2213dc2..b9d3749f 100644 --- a/src/ui/widgets/item.rs +++ b/src/ui/widgets/item.rs @@ -401,12 +401,14 @@ impl ItemPage { imp.episode_list_vec.replace(continue_play_list); } _ => { - let season_list = imp.season_list_vec.borrow(); - let Some(season) = season_list.iter().find(|s| s.name == season_name) else { - return; - }; + let season_id = { + let season_list = imp.season_list_vec.borrow(); + let Some(season) = season_list.iter().find(|s| s.name == season_name) else { + return; + }; - let season_id = season.id.clone(); + season.id.clone() + }; let episodes = match spawn_tokio(async move { EMBY_CLIENT.get_episodes(&series_id, &season_id).await @@ -985,15 +987,19 @@ impl ItemPage { return; }; - let video_dl: std::cell::Ref = video_object.borrow(); + let (video_url, media_source_id) = { + let video_dl: std::cell::Ref = video_object.borrow(); - let Some(ref video_url) = video_dl.direct_url else { - toast!(self, "No video source found"); - return; - }; + let Some(video_url) = video_dl.direct_url.clone() else { + toast!(self, "No video source found"); + return; + }; - let Some(ref media_source_id) = video_dl.id else { - return; + let Some(media_source_id) = video_dl.id.clone() else { + return; + }; + + (video_url, media_source_id) }; let Some(item) = self.current_item() else { @@ -1011,11 +1017,18 @@ impl ItemPage { .selected_item() .and_downcast::() { - let sub_dl: std::cell::Ref = sub_object.borrow(); - - if Some(true) == sub_dl.is_external && sub_dl.direct_url.is_none() { + let sub_dl_is_external = sub_object + .borrow::>() + .is_external; + let sub_dl_direct_url = sub_object + .borrow::>() + .direct_url + .clone(); + let sub_dl_index = sub_object.borrow::>().index; + + if Some(true) == sub_dl_is_external && sub_dl_direct_url.is_none() { let id = item.id(); - let Some(sub_index) = sub_dl.index else { + let Some(sub_index) = sub_dl_index else { return; }; let media_source_id_clone = media_source_id.to_string(); @@ -1034,9 +1047,9 @@ impl ItemPage { } }; - Self::get_sub_url(&media, media_source_id, &sub_index) + Self::get_sub_url(&media, &media_source_id, &sub_index) } else { - sub_dl.direct_url.clone() + sub_dl_direct_url } } else { None diff --git a/src/ui/widgets/server_panel.rs b/src/ui/widgets/server_panel.rs index 6bdae49a..6472e524 100644 --- a/src/ui/widgets/server_panel.rs +++ b/src/ui/widgets/server_panel.rs @@ -209,7 +209,7 @@ impl ServerPanel { for log in logs.item { let row = adw::ActionRow::builder() .title(&log.name) - .subtitle(&utc_to_localstring(&log.date)) + .subtitle(utc_to_localstring(&log.date)) .build(); let icon = Image::builder() @@ -237,7 +237,7 @@ impl ServerPanel { for log in logs.item { let row = adw::ActionRow::builder() .title(&log.name) - .subtitle(&utc_to_localstring(&log.date)) + .subtitle(utc_to_localstring(&log.date)) .build(); let avator = adw::Avatar::new(32, None, false); diff --git a/src/ui/widgets/server_row.rs b/src/ui/widgets/server_row.rs index d2711d9d..f41da5b3 100644 --- a/src/ui/widgets/server_row.rs +++ b/src/ui/widgets/server_row.rs @@ -72,7 +72,7 @@ glib::wrapper! { impl ServerRow { pub fn new(account: Account) -> Self { glib::Object::builder() - .property("item", &AccountItem::from_simple(&account)) + .property("item", AccountItem::from_simple(&account)) .build() } } diff --git a/tsukimi_installer.nsi b/tsukimi_installer.nsi new file mode 100644 index 00000000..db9898dc --- /dev/null +++ b/tsukimi_installer.nsi @@ -0,0 +1,81 @@ +; Define installer name +Name "Tsukimi Installer" + +; Define output file +OutFile "TsukimiSetup.exe" + +; Default installation directory (in user's personal folder) +InstallDir "$LOCALAPPDATA\Tsukimi" + +; Store previous installation location +Var PreviousInstallDir + +; Pages +Page directory +Page components +Page instfiles + +; Uninstaller pages +UninstPage uninstConfirm +UninstPage instfiles + +; Main installation section +Section "Tsukimi Main Program" SecMain + SectionIn RO + SetOutPath "$INSTDIR" + + ; Copy entire tsukimi folder + File /r "tsukimi-windows-gnu-amd64\*.*" + + ; Create start menu shortcut + CreateDirectory "$SMPROGRAMS\Tsukimi" + CreateShortCut "$SMPROGRAMS\Tsukimi\Tsukimi.lnk" "$INSTDIR\bin\tsukimi.exe" + + ; Create uninstaller + WriteUninstaller "$INSTDIR\Uninstall.exe" + + ; Write installation info to registry (current user only) + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tsukimi" "DisplayName" "Tsukimi" + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tsukimi" "UninstallString" '"$INSTDIR\Uninstall.exe"' + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tsukimi" "InstallLocation" "$INSTDIR" + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tsukimi" "Publisher" "tsukinaha" + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tsukimi" "DisplayVersion" "0.12.1" + WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tsukimi" "NoModify" 1 + WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tsukimi" "NoRepair" 1 +SectionEnd + +; Desktop shortcut section +Section "Create Desktop Shortcut" SecDesktopShortcut + CreateShortCut "$DESKTOP\Tsukimi.lnk" "$INSTDIR\bin\tsukimi.exe" +SectionEnd + +; Uninstall section +Section "Uninstall" + ; Remove installed files + RMDir /r "$INSTDIR" + + ; Remove start menu shortcut + Delete "$SMPROGRAMS\Tsukimi\Tsukimi.lnk" + RMDir "$SMPROGRAMS\Tsukimi" + + ; Remove desktop shortcut + Delete "$DESKTOP\Tsukimi.lnk" + + ; Remove uninstaller + Delete "$INSTDIR\Uninstall.exe" + + ; Remove registry keys (current user only) + DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tsukimi" +SectionEnd + +; Function to detect previous installation +Function .onInit + ; Try to read previous installation directory + ReadRegStr $PreviousInstallDir HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tsukimi" "InstallLocation" + StrCmp $PreviousInstallDir "" done + + ; If a previous installation is found, set the installation directory to the previous one + StrCpy $INSTDIR $PreviousInstallDir + + done: +FunctionEnd \ No newline at end of file diff --git a/tsukimi_manifest.rc b/tsukimi_manifest.rc new file mode 100644 index 00000000..60af1af2 --- /dev/null +++ b/tsukimi_manifest.rc @@ -0,0 +1 @@ +iconName ICON "resources/ui/icons/tsukimi.ico" \ No newline at end of file