diff --git a/.github/workflows/fdroid.yml b/.github/workflows/fdroid.yml new file mode 100644 index 0000000000..2dbc3a9362 --- /dev/null +++ b/.github/workflows/fdroid.yml @@ -0,0 +1,34 @@ +name: Fdroid version file generation + +on: + workflow_dispatch: + push: + tags: + - 'v[0-9]+.[0-9]+.[0-9]+' + - '[0-9]+.[0-9]+.[0-9]+' + - 'v[0-9]+.[0-9]+.[0-9]+-[0-9]+' + - '[0-9]+.[0-9]+.[0-9]+-[0-9]+' + +jobs: + # https://gitlab.com/fdroid/fdroiddata/-/blob/master/metadata/com.carriez.flutter_hbb.yml + # Finds latest release and transforms F-Droid vereion code from version as follows: + # X.Y.Z-A => X * 1e9 + Y * 1e6 + Z * 1e3 + A + update-fdroid-version-file: + name: Publish RustDesk version file for F-Droid updater + runs-on: ubuntu-latest + steps: + - name: Generate RustDesk version file + run: | + UPSTREAM_VERNAME="$(curl https://api.github.com/repos/rustdesk/rustdesk/releases/latest | jq -r .tag_name | sed 's/^v//')" + UPSTREAM_VERCODE="$(echo "$UPSTREAM_VERNAME" | tr '.' ' ' | tr '-' ' ' | while read -r MAJOR MINOR PATCH REV; do [ -z "$MAJOR" ] && MAJOR=0; [ -z "$MINOR" ] && MINOR=0; [ -z "$PATCH" ] && PATCH=0; [ -z "$REV" ] && REV=0; echo "$(( 1000000000 * $MAJOR + 1000000 * $MINOR + 1000 * $PATCH + $REV ))"; done)" + echo "versionName=$UPSTREAM_VERNAME" > rustdesk-version.txt + echo "versionCode=$UPSTREAM_VERCODE" >> rustdesk-version.txt + shell: bash + + - name: Publish RustDesk version file + uses: softprops/action-gh-release@v1 + with: + prerelease: true + tag_name: "fdroid-version" + files: | + ./rustdesk-version.txt diff --git a/.github/workflows/flutter-build.yml b/.github/workflows/flutter-build.yml index 70312d3e33..28eb5a894e 100644 --- a/.github/workflows/flutter-build.yml +++ b/.github/workflows/flutter-build.yml @@ -22,9 +22,9 @@ env: FLUTTER_ELINUX_VERSION: "3.16.9" TAG_NAME: "${{ inputs.upload-tag }}" VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" - # vcpkg version: 2024.03.25 - VCPKG_COMMIT_ID: "a34c873a9717a888f58dc05268dea15592c2f0ff" - VERSION: "1.2.6" + # vcpkg version: 2024.06.15 + VCPKG_COMMIT_ID: "f7423ee180c4b7f40d43402c2feb3859161ef625" + VERSION: "1.2.7" NDK_VERSION: "r26d" #signing keys env variable checks ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}" @@ -163,6 +163,7 @@ jobs: shell: bash if: env.UPLOAD_ARTIFACT == 'true' run: | + sed -i '/dpiAware/d' res/manifest.xml pushd ./libs/portable pip3 install -r requirements.txt python3 ./generate.py -f ../../rustdesk/ -o . -e ../../rustdesk/rustdesk.exe @@ -297,6 +298,7 @@ jobs: - name: Build self-extracted executable shell: bash run: | + sed -i '/dpiAware/d' res/manifest.xml pushd ./libs/portable pip3 install -r requirements.txt python3 ./generate.py -f ../../Release/ -o . -e ../../Release/rustdesk.exe @@ -966,12 +968,14 @@ jobs: target: x86_64-unknown-linux-gnu, distro: ubuntu18.04, on: ubuntu-20.04, + deb_arch: amd64, } - { arch: aarch64, target: aarch64-unknown-linux-gnu, distro: ubuntu18.04, on: [self-hosted, Linux, ARM64], + deb_arch: arm64, } steps: - name: Export GitHub Actions cache environment variables @@ -1006,6 +1010,7 @@ jobs: - name: Install Rust toolchain uses: dtolnay/rust-toolchain@v1 + if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' with: toolchain: ${{ env.RUST_VERSION }} targets: ${{ matrix.job.target }} @@ -1022,19 +1027,21 @@ jobs: sed -i "s/\[\"cdylib\", \"staticlib\", \"rlib\"\]/\[\"cdylib\"\]/g" Cargo.toml - name: Restore bridge files + if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' uses: actions/download-artifact@master with: name: bridge-artifact path: ./ - name: Setup vcpkg with Github Actions binary cache + if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' uses: lukka/run-vcpkg@v11 with: vcpkgDirectory: /opt/artifacts/vcpkg vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} - name: Install vcpkg dependencies - if: env.UPLOAD_ARTIFACT == 'true' + if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' run: | case ${{ matrix.job.target }} in aarch64-unknown-linux-gnu) @@ -1047,6 +1054,7 @@ jobs: shell: bash - name: Restore bridge files + if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' uses: actions/download-artifact@master with: name: bridge-artifact @@ -1055,7 +1063,7 @@ jobs: - uses: rustdesk-org/run-on-arch-action@amd64-support name: Build rustdesk id: vcpkg - if: env.UPLOAD_ARTIFACT == 'true' + if: matrix.job.arch == 'x86_64' || env.UPLOAD_ARTIFACT == 'true' with: arch: ${{ matrix.job.arch }} distro: ${{ matrix.job.distro }} @@ -1146,7 +1154,6 @@ jobs: aarch64) export PATH=/opt/flutter-elinux/bin:$PATH sed -i "s/flutter build linux --release/flutter-elinux build linux --verbose/g" ./build.py - export ARCH=arm64 sed -i "s/x64\/release/arm64\/release/g" ./build.py ;; x86_64) @@ -1178,6 +1185,7 @@ jobs: # build flutter pushd /workspace export CARGO_INCREMENTAL=0 + export DEB_ARCH=${{ matrix.job.deb_arch }} python3 ./build.py --flutter --skip-cargo for name in rustdesk*??.deb; do mv "$name" "${name%%.deb}-${{ matrix.job.arch }}.deb" @@ -1256,21 +1264,31 @@ jobs: files: | res/rustdesk-${{ env.VERSION }}*.zst - build-rustdesk-sciter-arm: + build-rustdesk-linux-sciter: if: ${{ inputs.upload-artifact }} needs: build-rustdesk-linux # not for dep, just make it run later for parallelism - runs-on: [self-hosted, Linux, ARM64] - name: build-rustdesk-sciter-arm ${{ matrix.job.target }} + runs-on: ${{ matrix.job.on }} + name: build-rustdesk-linux-sciter ${{ matrix.job.target }} strategy: fail-fast: false matrix: # use a high level qemu-user-static job: + - { + arch: x86_64, + target: x86_64-unknown-linux-gnu, + on: ubuntu-20.04, + distro: ubuntu18.04, + deb_arch: amd64, + sciter_arch: x64, + } - { arch: armv7, target: armv7-unknown-linux-gnueabihf, - deb-arch: armhf, - use-cross: true, + on: [self-hosted, Linux, ARM64], + distro: ubuntu18.04-rustdesk, + deb_arch: armhf, + sciter_arch: arm32, } steps: - name: Export GitHub Actions cache environment variables @@ -1334,7 +1352,7 @@ jobs: id: vcpkg with: arch: ${{ matrix.job.arch }} - distro: ubuntu18.04-rustdesk + distro: ${{ matrix.job.distro }} githubToken: ${{ github.token }} setup: | ls -l "${PWD}" @@ -1400,13 +1418,13 @@ jobs: pushd /workspace python3 ./res/inline-sciter.py export VCPKG_ROOT=/opt/artifacts/vcpkg - export ARCH=armhf export CARGO_INCREMENTAL=0 cargo build --features inline --release --bins --jobs 1 # package mkdir -p ./Release mv ./target/release/rustdesk ./Release/rustdesk - wget -O ./Release/libsciter-gtk.so https://github.com/c-smile/sciter-sdk/raw/master/bin.lnx/arm32/libsciter-gtk.so + wget -O ./Release/libsciter-gtk.so https://github.com/c-smile/sciter-sdk/raw/master/bin.lnx/${{ matrix.job.sciter_arch }}/libsciter-gtk.so + export DEB_ARCH=${{ matrix.job.deb_arch }} ./build.py --package ./Release - name: Rename rustdesk @@ -1426,6 +1444,13 @@ jobs: files: | rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb + - name: Upload deb + uses: actions/upload-artifact@master + if: env.UPLOAD_ARTIFACT == 'true' + with: + name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb + path: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}-sciter.deb + build-appimage: name: Build appimage ${{ matrix.job.target }} needs: [build-rustdesk-linux] @@ -1483,8 +1508,10 @@ jobs: ./appimage/rustdesk-${{ env.VERSION }}-*.AppImage build-flatpak: - name: Build flatpak ${{ matrix.job.target }} - needs: [build-rustdesk-linux] + name: Build flatpak ${{ matrix.job.target }}${{ matrix.job.suffix }} + needs: + - build-rustdesk-linux + - build-rustdesk-linux-sciter runs-on: ${{ matrix.job.on }} if: ${{ inputs.upload-artifact }} strategy: @@ -1496,6 +1523,14 @@ jobs: distro: ubuntu18.04, on: ubuntu-20.04, arch: x86_64, + suffix: "", + } + - { + target: x86_64-unknown-linux-gnu, + distro: ubuntu18.04, + on: ubuntu-20.04, + arch: x86_64, + suffix: "-sciter", } - { target: aarch64-unknown-linux-gnu, @@ -1503,6 +1538,7 @@ jobs: distro: ubuntu22.04, on: [self-hosted, Linux, ARM64], arch: aarch64, + suffix: "", } steps: - name: Checkout source code @@ -1511,12 +1547,12 @@ jobs: - name: Download Binary uses: actions/download-artifact@master with: - name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb + name: rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.deb path: . - name: Rename Binary run: | - mv rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.deb flatpak/rustdesk.deb + mv rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.deb flatpak/rustdesk.deb - uses: rustdesk-org/run-on-arch-action@amd64-support name: Build rustdesk flatpak package for ${{ matrix.job.arch }} @@ -1562,7 +1598,7 @@ jobs: pushd flatpak git clone https://github.com/flathub/shared-modules.git --depth=1 flatpak-builder --user --force-clean --repo=repo ./build ./rustdesk.json - flatpak build-bundle ./repo rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.flatpak com.rustdesk.RustDesk + flatpak build-bundle ./repo rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.flatpak com.rustdesk.RustDesk - name: Publish flatpak package uses: softprops/action-gh-release@v1 @@ -1570,7 +1606,7 @@ jobs: prerelease: true tag_name: ${{ env.TAG_NAME }} files: | - flatpak/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}.flatpak + flatpak/rustdesk-${{ env.VERSION }}-${{ matrix.job.arch }}${{ matrix.job.suffix }}.flatpak build-rustdesk-web: if: False diff --git a/.github/workflows/playground.yml b/.github/workflows/playground.yml index 99bac2bc02..b28a2050ee 100644 --- a/.github/workflows/playground.yml +++ b/.github/workflows/playground.yml @@ -16,9 +16,9 @@ env: FLUTTER_ELINUX_VERSION: "3.16.9" TAG_NAME: "nightly" VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" - # vcpkg version: 2024.03.25 - VCPKG_COMMIT_ID: "a34c873a9717a888f58dc05268dea15592c2f0ff" - VERSION: "1.2.6" + # vcpkg version: 2024.06.15 + VCPKG_COMMIT_ID: "f7423ee180c4b7f40d43402c2feb3859161ef625" + VERSION: "1.2.7" NDK_VERSION: "r26d" #signing keys env variable checks ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}" diff --git a/.github/workflows/winget.yml b/.github/workflows/winget.yml index 098e35f206..52bb17e6f0 100644 --- a/.github/workflows/winget.yml +++ b/.github/workflows/winget.yml @@ -6,7 +6,7 @@ jobs: publish: runs-on: ubuntu-latest steps: - - uses: vedantmgoyal2009/winget-releaser@v2 + - uses: vedantmgoyal9/winget-releaser@main with: identifier: RustDesk.RustDesk version: ${{ github.event.release.tag_name }} diff --git a/Cargo.lock b/Cargo.lock index 54bef44447..4b25f5cb5f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aes" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if 1.0.0", "cipher", @@ -30,9 +30,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ "getrandom", "once_cell", @@ -41,30 +41,30 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if 1.0.0", "once_cell", "version_check", - "zerocopy 0.7.32", + "zerocopy 0.7.34", ] [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "allo-isolate" -version = "0.1.20" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56b7997817c178b853573e8bdfb6c3afe02810b43f17d766d6703560074b0c3" +checksum = "97b6d794345b06592d0ebeed8e477e41b71e5a0a49df4fc0e4184d5938b99509" dependencies = [ "anyhow", "atomic", @@ -89,20 +89,19 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "alsa" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2562ad8dcf0f789f65c6fdaad8a8a9708ed6b488e649da28c01656ad66b8b47" +checksum = "37fe60779335388a88c01ac6c3be40304d1e349de3ada3b15f7808bb90fa9dce" dependencies = [ "alsa-sys", - "bitflags 1.3.2", + "bitflags 2.6.0", "libc", - "nix 0.24.3", ] [[package]] @@ -144,7 +143,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c494134f746c14dc653a35a4ea5aca24ac368529da5370ecf41fe0341c35772f" dependencies = [ "android_log-sys", - "env_logger 0.10.0", + "env_logger 0.10.2", "log", "once_cell", ] @@ -169,112 +168,75 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" - -[[package]] -name = "apple-bindgen" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f109ee76f68b4767848cb5dc93bfcc7c425deca849c4c81fa11cdce525e3d2" -dependencies = [ - "apple-sdk", - "bindgen 0.63.0", - "derive_more", - "regex", - "serde 1.0.190", - "thiserror", - "toml 0.6.0", -] - -[[package]] -name = "apple-sdk" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a04f192a700686ee70008ff4e4eb76fe7d11814ab93b7ee9d48c36b9a9f0bd2a" -dependencies = [ - "plist", - "serde 1.0.190", - "serde_json 1.0.107", -] - -[[package]] -name = "apple-sys" -version = "0.2.0" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b3a1c3342678cd72676d0c1644fde496c1f65ea41f51465f54a89cad3bdf34" -dependencies = [ - "apple-bindgen", - "apple-sdk", - "objc", -] +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "arboard" -version = "3.3.1" -source = "git+https://github.com/fufesou/arboard?branch=feat/x11_set_conn_timeout#956b5f8693b4fc7fddd7b8cafbe1111a892b34b1" +version = "3.4.0" +source = "git+https://github.com/rustdesk-org/arboard#61b448d8261fb313d67a61d03fc130bd738db396" dependencies = [ "clipboard-win", - "core-graphics 0.23.1 (registry+https://github.com/rust-lang/crates.io-index)", - "image", + "core-graphics 0.23.2", + "image 0.25.1", "log", - "objc", - "objc-foundation", - "objc_id", + "objc2 0.5.2", + "objc2-app-kit", + "objc2-foundation", "parking_lot", - "thiserror", "windows-sys 0.48.0", "wl-clipboard-rs", - "x11rb 0.13.0", + "x11rb 0.13.1", ] [[package]] @@ -289,20 +251,21 @@ dependencies = [ [[package]] name = "async-channel" -version = "1.9.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener 2.5.3", + "event-listener-strategy", "futures-core", + "pin-project-lite", ] [[package]] name = "async-compression" -version = "0.4.8" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07dbbf24db18d609b1462965249abdf49129ccad073ec257da372adc83259c60" +checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" dependencies = [ "flate2", "futures-core", @@ -313,15 +276,14 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.6.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0c4a4f319e45986f347ee47fef8bf5e81c9abc3f6f58dc2391439f30df65f0" +checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0" dependencies = [ - "async-lock", "async-task", "concurrent-queue", - "fastrand 2.0.1", - "futures-lite", + "fastrand 2.1.0", + "futures-lite 2.3.0", "slab", ] @@ -331,10 +293,10 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" dependencies = [ - "async-lock", - "autocfg 1.1.0", + "async-lock 2.8.0", + "autocfg 1.3.0", "blocking", - "futures-lite", + "futures-lite 1.13.0", ] [[package]] @@ -343,20 +305,39 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ - "async-lock", - "autocfg 1.1.0", + "async-lock 2.8.0", + "autocfg 1.3.0", "cfg-if 1.0.0", "concurrent-queue", - "futures-lite", + "futures-lite 1.13.0", "log", "parking", - "polling", + "polling 2.8.0", "rustix 0.37.27", "slab", "socket2 0.4.10", "waker-fn", ] +[[package]] +name = "async-io" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" +dependencies = [ + "async-lock 3.4.0", + "cfg-if 1.0.0", + "concurrent-queue", + "futures-io", + "futures-lite 2.3.0", + "parking", + "polling 3.7.2", + "rustix 0.38.34", + "slab", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "async-lock" version = "2.8.0" @@ -366,67 +347,78 @@ dependencies = [ "event-listener 2.5.3", ] +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.3.1", + "event-listener-strategy", + "pin-project-lite", +] + [[package]] name = "async-process" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" dependencies = [ - "async-io", - "async-lock", + "async-io 1.13.0", + "async-lock 2.8.0", "async-signal", "blocking", "cfg-if 1.0.0", - "event-listener 3.0.0", - "futures-lite", - "rustix 0.38.21", + "event-listener 3.1.0", + "futures-lite 1.13.0", + "rustix 0.38.34", "windows-sys 0.48.0", ] [[package]] name = "async-recursion" -version = "1.0.5" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] name = "async-signal" -version = "0.2.4" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a5415b7abcdc9cd7d63d6badba5288b2ca017e3fbd4173b8f405449f1a2399" +checksum = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d" dependencies = [ - "async-io", - "async-lock", + "async-io 2.3.3", + "async-lock 3.4.0", "atomic-waker", "cfg-if 1.0.0", "futures-core", "futures-io", - "rustix 0.38.21", + "rustix 0.38.34", "signal-hook-registry", "slab", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "async-task" -version = "4.5.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.79" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] @@ -449,7 +441,7 @@ dependencies = [ "glib-sys 0.18.1", "gobject-sys 0.18.0", "libc", - "system-deps 6.1.2", + "system-deps 6.2.2", ] [[package]] @@ -481,20 +473,20 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" dependencies = [ - "autocfg 1.1.0", + "autocfg 1.3.0", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -513,15 +505,15 @@ checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" @@ -544,33 +536,11 @@ dependencies = [ "lazycell", "log", "peeking_take_while", - "proc-macro2 1.0.79", - "quote 1.0.35", - "regex", - "rustc-hash", - "shlex", - "which", -] - -[[package]] -name = "bindgen" -version = "0.63.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36d860121800b2a9a94f9b5604b332d5cffb234ce17609ea479d723dbc9d3885" -dependencies = [ - "bitflags 1.3.2", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "regex", "rustc-hash", "shlex", - "syn 1.0.109", "which", ] @@ -588,33 +558,33 @@ dependencies = [ "log", "peeking_take_while", "prettyplease", - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "regex", "rustc-hash", "shlex", - "syn 2.0.55", + "syn 2.0.68", "which", ] [[package]] name = "bindgen" -version = "0.68.1" +version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726e4313eb6ec35d2730258ad4e15b547ee75d6afaa1361a922e78e59b7d8078" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "cexpr", "clang-sys", + "itertools 0.12.1", "lazy_static", "lazycell", - "peeking_take_while", - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "regex", "rustc-hash", "shlex", - "syn 2.0.55", + "syn 2.0.68", ] [[package]] @@ -631,21 +601,21 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" dependencies = [ - "serde 1.0.190", + "serde 1.0.203", ] [[package]] name = "bitmask-enum" -version = "2.2.2" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fb8528abca6895a5ada33d62aedd538a5c33e77068256483b44a3230270163" +checksum = "afb15541e888071f64592c0b4364fdff21b7cb0a247f984296699351963a8721" dependencies = [ - "quote 1.0.35", - "syn 2.0.55", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] @@ -681,7 +651,7 @@ version = "0.1.0-beta.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" dependencies = [ - "objc-sys", + "objc-sys 0.2.0-beta.2", ] [[package]] @@ -691,30 +661,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" dependencies = [ "block-sys", - "objc2-encode", + "objc2-encode 2.0.0-pre.2", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", ] [[package]] name = "blocking" -version = "1.4.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c36a4d0d48574b3dd360b4b7d95cc651d2b6557b6402848a27d4b228a473e2a" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ "async-channel", - "async-lock", "async-task", - "fastrand 2.0.1", "futures-io", - "futures-lite", + "futures-lite 2.3.0", "piper", - "tracing", ] [[package]] name = "brotli" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -739,21 +715,15 @@ checksum = "832133bbabbbaa9fbdba793456a2827627a7d2b8fb96032fa1e7666d7895832b" [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" - -[[package]] -name = "bytecount" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" [[package]] name = "byteorder" @@ -767,7 +737,7 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" dependencies = [ - "serde 1.0.190", + "serde 1.0.203", ] [[package]] @@ -797,13 +767,13 @@ version = "0.4.0-beta2" source = "git+https://github.com/clslaid/cacao?branch=feat/set-file-urls#05e1536b0b43aaae308ec72c0eed703e875b7b95" dependencies = [ "bitmask-enum", - "block2", - "core-foundation 0.9.3 (git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd)", - "core-graphics 0.23.1 (git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd)", + "block2 0.2.0-alpha.6", + "core-foundation 0.9.3", + "core-graphics 0.23.1", "dispatch", "lazy_static", "libc", - "objc2", + "objc2 0.3.0-beta.2", "os_info", "percent-encoding", "url", @@ -815,7 +785,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "cairo-sys-rs", "glib 0.18.5", "libc", @@ -831,17 +801,18 @@ checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" dependencies = [ "glib-sys 0.18.1", "libc", - "system-deps 6.1.2", + "system-deps 6.2.2", ] [[package]] name = "cc" -version = "1.0.83" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "779e6b7d17797c0b42023d417228c02889300190e700cb074c3438d9c541d332" dependencies = [ "jobserver", "libc", + "once_cell", ] [[package]] @@ -861,9 +832,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.15.5" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03915af431787e6ffdcc74c645077518c6b6e01f80b761e0fbbfa288536311b3" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ "smallvec", "target-lexicon", @@ -881,18 +852,24 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", - "num-traits 0.2.17", + "num-traits 0.2.19", "wasm-bindgen", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -903,7 +880,7 @@ checksum = "2315f7119b7146d6a883de6acd63ddf96071b5f79d9d98d2adaa84d749f6abf1" dependencies = [ "debug-helper", "num-bigint", - "num-traits 0.2.17", + "num-traits 0.2.19", "once_cell", "regex", ] @@ -920,13 +897,13 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.6.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading 0.7.4", + "libloading 0.8.4", ] [[package]] @@ -946,30 +923,30 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.7" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" +checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.4.7" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" +checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.10.0", + "strsim 0.11.1", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "clipboard" @@ -986,19 +963,33 @@ dependencies = [ "parking_lot", "percent-encoding", "rand 0.8.5", - "serde 1.0.190", + "serde 1.0.203", "serde_derive", "thiserror", "utf16string", - "x11-clipboard", + "x11-clipboard 0.8.1", "x11rb 0.12.0", ] +[[package]] +name = "clipboard-master" +version = "4.0.0-beta.6" +source = "git+https://github.com/rustdesk-org/clipboard-master#5268c7b3d7728699566ad863da0911f249706f8c" +dependencies = [ + "objc", + "objc-foundation", + "objc_id", + "windows-win", + "wl-clipboard-rs", + "x11-clipboard 0.9.2", + "x11rb 0.13.1", +] + [[package]] name = "clipboard-win" -version = "5.1.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ec832972fefb8cf9313b45a0d1945e29c9c251f1d4c6eafc5fe2124c02d2e81" +checksum = "79f4473f5144e20d9aceaf2972478f06ddf687831eafeeb434fbaf0acc4144ad" dependencies = [ "error-code", ] @@ -1030,7 +1021,7 @@ dependencies = [ "bitflags 1.3.2", "block", "cocoa-foundation", - "core-foundation 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.9.4", "core-graphics 0.22.3", "foreign-types 0.3.2", "libc", @@ -1046,8 +1037,8 @@ dependencies = [ "bitflags 1.3.2", "block", "cocoa-foundation", - "core-foundation 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "core-graphics 0.23.1 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.9.4", + "core-graphics 0.23.2", "foreign-types 0.5.0", "libc", "objc", @@ -1061,8 +1052,8 @@ checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ "bitflags 1.3.2", "block", - "core-foundation 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "core-graphics-types 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", "libc", "objc", ] @@ -1075,15 +1066,15 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "combine" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ "bytes", "memchr", @@ -1091,9 +1082,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] @@ -1104,7 +1095,7 @@ version = "0.4.0-2" source = "git+https://github.com/rustdesk-org/confy#83db9ec19a2f97e9718aef69e4fc5611bb382479" dependencies = [ "directories-next", - "serde 1.0.190", + "serde 1.0.203", "thiserror", "toml 0.5.11", ] @@ -1121,9 +1112,9 @@ dependencies = [ [[package]] name = "const_fn" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935" +checksum = "373e9fafaa20882876db20562275ff58d50e0caa2590077fe7ce7bef90211d0d" [[package]] name = "const_format" @@ -1140,8 +1131,8 @@ version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "unicode-xid 0.2.4", ] @@ -1157,43 +1148,37 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - [[package]] name = "core-foundation" version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +source = "git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd#7d593d016175755e492a92ef89edca68ac3bd5cd" dependencies = [ - "core-foundation-sys 0.8.4", + "core-foundation-sys 0.8.6 (git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd)", "libc", ] [[package]] name = "core-foundation" -version = "0.9.3" -source = "git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd#7d593d016175755e492a92ef89edca68ac3bd5cd" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ - "core-foundation-sys 0.8.6", + "core-foundation-sys 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", "libc", ] [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core-foundation-sys" version = "0.8.6" source = "git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd#7d593d016175755e492a92ef89edca68ac3bd5cd" dependencies = [ - "objc2-encode", + "objc2-encode 2.0.0-pre.2", ] [[package]] @@ -1203,8 +1188,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "core-graphics-types 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", "foreign-types 0.3.2", "libc", ] @@ -1212,49 +1197,49 @@ dependencies = [ [[package]] name = "core-graphics" version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "970a29baf4110c26fedbc7f82107d42c23f7e88e404c4577ed73fe99ff85a212" +source = "git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd#7d593d016175755e492a92ef89edca68ac3bd5cd" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "core-graphics-types 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.9.3", + "core-graphics-types 0.1.2", "foreign-types 0.5.0", "libc", + "objc2-encode 2.0.0-pre.2", ] [[package]] name = "core-graphics" -version = "0.23.1" -source = "git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd#7d593d016175755e492a92ef89edca68ac3bd5cd" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3 (git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd)", - "core-graphics-types 0.1.2 (git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd)", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", "foreign-types 0.5.0", "libc", - "objc2-encode", ] [[package]] name = "core-graphics-types" version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" +source = "git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd#7d593d016175755e492a92ef89edca68ac3bd5cd" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.9.3", "libc", + "objc2-encode 2.0.0-pre.2", ] [[package]] name = "core-graphics-types" -version = "0.1.2" -source = "git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd#7d593d016175755e492a92ef89edca68ac3bd5cd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3 (git+https://github.com/madsmtm/core-foundation-rs.git?rev=7d593d016175755e492a92ef89edca68ac3bd5cd)", + "core-foundation 0.9.4", "libc", - "objc2-encode", ] [[package]] @@ -1264,114 +1249,102 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" dependencies = [ "bitflags 1.3.2", - "core-foundation-sys 0.8.4", + "core-foundation-sys 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", "coreaudio-sys", ] [[package]] name = "coreaudio-sys" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8478e5bdad14dce236b9898ea002eabfa87cbe14f0aa538dbe3b6a4bec4332d" +checksum = "7f01585027057ff5f0a5bf276174ae4c1594a2c5bde93d5f46a016d76270f5a9" dependencies = [ - "bindgen 0.68.1", + "bindgen 0.69.4", ] [[package]] name = "cpal" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" +checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" dependencies = [ "alsa", - "core-foundation-sys 0.8.4", + "core-foundation-sys 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", "coreaudio-rs", "dasp_sample", - "jni 0.19.0", + "jni 0.21.1", "js-sys", "libc", "mach2", - "ndk", + "ndk 0.8.0", "ndk-context", "oboe", - "once_cell", - "parking_lot", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows 0.46.0", + "windows 0.54.0", ] [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ - "cfg-if 1.0.0", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if 1.0.0", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg 1.1.0", - "cfg-if 1.0.0", "crossbeam-utils", - "memoffset 0.9.0", - "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "cfg-if 1.0.0", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if 1.0.0", -] +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -1391,19 +1364,19 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.4.1" +version = "3.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e95fbd621905b854affdc67943b043a0fbb6ed7385fd5a25650d19a8a6cfdf" +checksum = "672465ae37dc1bc6380a6547a8883d5dd397b0f1faaad4f265726cc7042a5345" dependencies = [ - "nix 0.27.1", - "windows-sys 0.48.0", + "nix 0.28.0", + "windows-sys 0.52.0", ] [[package]] name = "dart-sys" -version = "4.0.2" +version = "4.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8b5680b5c2cc52f50acb2457d9b3a3b58adcca785db13a0e3655626f601de6" +checksum = "57967e4b200d767d091b961d6ab42cc7d0cc14fe9e052e75d0d3cf9eb732d895" dependencies = [ "cc", ] @@ -1415,7 +1388,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if 1.0.0", - "hashbrown 0.14.2", + "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core", @@ -1585,9 +1558,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", ] @@ -1598,32 +1571,8 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 1.0.109", -] - -[[package]] -name = "derive-new" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" -dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "0.99.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "convert_case", - "proc-macro2 1.0.79", - "quote 1.0.35", - "rustc_version", + "proc-macro2 1.0.86", + "quote 1.0.36", "syn 1.0.109", ] @@ -1723,7 +1672,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading 0.8.1", + "libloading 0.8.4", ] [[package]] @@ -1756,8 +1705,8 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a09ac8bb8c16a282264c379dffba707b9c998afc7506009137f3c6136888078" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "syn 1.0.109", ] @@ -1786,15 +1735,21 @@ checksum = "7f3f119846c823f9eafcf953a8f6ffb6ed69bf6240883261a7f13b634579a51f" dependencies = [ "lazy_static", "regex", - "serde 1.0.190", + "serde 1.0.203", "strsim 0.10.0", ] [[package]] name = "downcast-rs" -version = "1.2.0" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" [[package]] name = "dtoa" @@ -1809,7 +1764,7 @@ dependencies = [ "cc", "hbb_common", "lazy_static", - "serde 1.0.190", + "serde 1.0.203", "serde_derive", "thiserror", ] @@ -1825,9 +1780,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encoding_rs" @@ -1848,7 +1803,7 @@ dependencies = [ "objc", "pkg-config", "rdev", - "serde 1.0.190", + "serde 1.0.203", "serde_derive", "tfc", "unicode-segmentation", @@ -1866,43 +1821,43 @@ dependencies = [ [[package]] name = "enum-map" -version = "2.7.0" +version = "2.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53337c2dbf26a3c31eccc73a37b10c1614e8d4ae99b6a50d553e8936423c1f16" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" dependencies = [ "enum-map-derive", ] [[package]] name = "enum-map-derive" -version = "0.14.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04d0b288e3bb1d861c4403c1774a6f7a798781dfc519b3647df2a3dd4ae95f25" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] name = "enumflags2" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5998b4f30320c9d93aed72f63af821bfdac50465b75428fce77b48ec482c3939" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" dependencies = [ "enumflags2_derive", - "serde 1.0.190", + "serde 1.0.203", ] [[package]] name = "enumflags2_derive" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] @@ -1920,9 +1875,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", @@ -1937,7 +1892,7 @@ version = "4.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74351c3392ea1ff6cd2628e0042d268ac2371cb613252ff383b6dfa50d22fa79" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "libc", ] @@ -1949,19 +1904,19 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.5" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "error-code" -version = "3.0.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "281e452d3bad4005426416cdba5ccfd4f5c1280e10099e21db27f7c1c28347fc" +checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" [[package]] name = "evdev" @@ -1981,20 +1936,41 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "3.0.0" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29e56284f00d94c1bc7fd3c77027b4623c88c1f53d8d2394c6199f2921dea325" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", "pin-project-lite", ] +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener 5.3.1", + "pin-project-lite", +] + [[package]] name = "exr" -version = "1.71.0" +version = "1.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832a761f35ab3e6664babfbdc6cef35a4860e816ec3916dcfd0882954e98a8a8" +checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" dependencies = [ "bit_field", "flume", @@ -2017,15 +1993,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fdeflate" -version = "0.3.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ "simd-adler32", ] @@ -2036,20 +2012,20 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ - "memoffset 0.9.0", + "memoffset 0.9.1", "rustc_version", ] [[package]] name = "filetime" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.3.5", - "windows-sys 0.48.0", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", ] [[package]] @@ -2060,9 +2036,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "miniz_oxide", @@ -2070,9 +2046,9 @@ dependencies = [ [[package]] name = "flexi_logger" -version = "0.27.3" +version = "0.27.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ac35b454b60e1836602173e2eb7ef531173388c0212e02ec7f9fac086159ee5" +checksum = "469e584c031833564840fb0cdbce99bdfe946fd45480a188545e73a76f45461c" dependencies = [ "chrono", "crossbeam-channel", @@ -2123,9 +2099,9 @@ dependencies = [ [[package]] name = "flutter_rust_bridge_macros" -version = "1.82.3" +version = "1.82.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1ab3d175f0a09c1adb55fd98d7b6460b00af72c4e889b9eec2c5aee88273996" +checksum = "a7fe743d921bedf4578b9472346d03a9643a01cd565ca7df7961baebad534ba5" [[package]] name = "fnv" @@ -2167,9 +2143,9 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] @@ -2186,9 +2162,9 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -2235,9 +2211,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -2250,9 +2226,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -2260,15 +2236,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -2277,9 +2253,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" @@ -2296,34 +2272,47 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand 2.1.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -2375,7 +2364,7 @@ dependencies = [ "glib-sys 0.18.1", "gobject-sys 0.18.0", "libc", - "system-deps 6.1.2", + "system-deps 6.2.2", ] [[package]] @@ -2392,7 +2381,7 @@ dependencies = [ "libc", "pango-sys", "pkg-config", - "system-deps 6.1.2", + "system-deps 6.2.2", ] [[package]] @@ -2406,7 +2395,7 @@ dependencies = [ "gobject-sys 0.18.0", "libc", "pkg-config", - "system-deps 6.1.2", + "system-deps 6.2.2", ] [[package]] @@ -2418,7 +2407,7 @@ dependencies = [ "gdk-sys", "glib-sys 0.18.1", "libc", - "system-deps 6.1.2", + "system-deps 6.2.2", "x11 2.21.0", ] @@ -2454,9 +2443,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if 1.0.0", "libc", @@ -2465,9 +2454,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.12.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" dependencies = [ "color_quant", "weezl", @@ -2475,9 +2464,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "gio" @@ -2507,7 +2496,7 @@ dependencies = [ "glib-sys 0.18.1", "gobject-sys 0.18.0", "libc", - "system-deps 6.1.2", + "system-deps 6.2.2", "winapi 0.3.9", ] @@ -2549,7 +2538,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "futures-channel", "futures-core", "futures-executor", @@ -2574,11 +2563,11 @@ checksum = "41486a26d1366a8032b160b59065a59fb528530a46a49f627e7048fb8c064039" dependencies = [ "anyhow", "heck 0.3.3", - "itertools", + "itertools 0.9.0", "proc-macro-crate 0.1.5", "proc-macro-error", - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "syn 1.0.109", ] @@ -2589,11 +2578,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" dependencies = [ "heck 0.4.1", - "proc-macro-crate 2.0.0", + "proc-macro-crate 2.0.2", "proc-macro-error", - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] @@ -2613,7 +2602,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" dependencies = [ "libc", - "system-deps 6.1.2", + "system-deps 6.2.2", ] [[package]] @@ -2641,7 +2630,7 @@ checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" dependencies = [ "glib-sys 0.18.1", "libc", - "system-deps 6.1.2", + "system-deps 6.2.2", ] [[package]] @@ -2661,7 +2650,7 @@ dependencies = [ "gstreamer-sys", "libc", "muldiv", - "num-rational 0.3.2", + "num-rational", "once_cell", "paste", "pretty-hex", @@ -2813,7 +2802,7 @@ dependencies = [ "gobject-sys 0.18.0", "libc", "pango-sys", - "system-deps 6.1.2", + "system-deps 6.2.2", ] [[package]] @@ -2824,9 +2813,9 @@ checksum = "c6063efb63db582968fb7df72e1ae68aa6360dcfb0a75143f34fc7d616bad75e" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro-error", - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] @@ -2841,7 +2830,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.0.2", + "indexmap", "slab", "tokio", "tokio-util", @@ -2850,10 +2839,11 @@ dependencies = [ [[package]] name = "half" -version = "2.2.1" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ + "cfg-if 1.0.0", "crunchy", ] @@ -2863,16 +2853,16 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.8", ] [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.11", "allocator-api2", ] @@ -2882,14 +2872,14 @@ version = "0.1.0" dependencies = [ "anyhow", "backtrace", - "base64 0.22.0", + "base64 0.22.1", "bytes", "chrono", "confy", "directories-next", "dirs-next", "dlopen", - "env_logger 0.10.0", + "env_logger 0.10.2", "filetime", "flexi_logger", "futures", @@ -2907,9 +2897,9 @@ dependencies = [ "regex", "rustls-pki-types", "rustls-platform-verifier", - "serde 1.0.190", + "serde 1.0.203", "serde_derive", - "serde_json 1.0.107", + "serde_json 1.0.118", "socket2 0.3.19", "sodiumoxide", "sysinfo", @@ -2923,7 +2913,7 @@ dependencies = [ "url", "uuid", "winapi 0.3.9", - "zstd 0.13.0", + "zstd 0.13.1", ] [[package]] @@ -2941,6 +2931,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -2952,9 +2948,15 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" [[package]] name = "hex" @@ -2973,11 +2975,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -3003,7 +3005,7 @@ checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", - "itoa 1.0.9", + "itoa 1.0.11", ] [[package]] @@ -3019,9 +3021,9 @@ 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 = "httpdate" @@ -3038,21 +3040,21 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hwcodec" version = "0.4.18" -source = "git+https://github.com/21pages/hwcodec#b84d5bbefa949194d1fc51a5c7e9d7988e315ce6" +source = "git+https://github.com/21pages/hwcodec#4b15d782512f95cb158577853e6cdb67a37502c1" dependencies = [ "bindgen 0.59.2", "cc", "log", - "serde 1.0.190", + "serde 1.0.203", "serde_derive", - "serde_json 1.0.107", + "serde_json 1.0.118", ] [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" dependencies = [ "bytes", "futures-channel", @@ -3063,9 +3065,9 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.9", + "itoa 1.0.11", "pin-project-lite", - "socket2 0.5.5", + "socket2 0.5.7", "tokio", "tower-service", "tracing", @@ -3081,7 +3083,7 @@ dependencies = [ "futures-util", "http", "hyper", - "rustls 0.21.10", + "rustls 0.21.12", "tokio", "tokio-rustls 0.24.1", ] @@ -3101,16 +3103,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", - "core-foundation-sys 0.8.4", + "core-foundation-sys 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core 0.51.1", + "windows-core 0.52.0", ] [[package]] @@ -3124,9 +3126,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -3134,9 +3136,9 @@ dependencies = [ [[package]] name = "image" -version = "0.24.7" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" dependencies = [ "bytemuck", "byteorder", @@ -3144,13 +3146,25 @@ dependencies = [ "exr", "gif", "jpeg-decoder", - "num-rational 0.4.1", - "num-traits 0.2.17", + "num-traits 0.2.19", "png", "qoi", "tiff", ] +[[package]] +name = "image" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11" +dependencies = [ + "bytemuck", + "byteorder", + "num-traits 0.2.19", + "png", + "tiff", +] + [[package]] name = "impersonate_system" version = "0.1.0" @@ -3161,41 +3175,31 @@ dependencies = [ [[package]] name = "include_dir" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" dependencies = [ "include_dir_macros", ] [[package]] name = "include_dir_macros" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" -dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", -] - -[[package]] -name = "indexmap" -version = "1.9.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" dependencies = [ - "autocfg 1.1.0", - "hashbrown 0.12.3", + "proc-macro2 1.0.86", + "quote 1.0.36", ] [[package]] name = "indexmap" -version = "2.0.2" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.5", ] [[package]] @@ -3229,9 +3233,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if 1.0.0", ] @@ -3242,7 +3246,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.9", "libc", "windows-sys 0.48.0", ] @@ -3255,13 +3259,13 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.3", - "rustix 0.38.21", - "windows-sys 0.48.0", + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", ] [[package]] @@ -3270,6 +3274,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06d198e9919d9822d5f7083ba8530e04de87841eaf21ead9af8f2304efd57c89" +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + [[package]] name = "itertools" version = "0.9.0" @@ -3279,6 +3289,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.3.4" @@ -3287,9 +3306,9 @@ checksum = "8324a32baf01e2ae060e9de58ed0bc2320c9a2833491ee36cd3b4c414de4db8c" [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jni" @@ -3305,20 +3324,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "jni" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" -dependencies = [ - "cesu8", - "combine", - "jni-sys", - "log", - "thiserror", - "walkdir", -] - [[package]] name = "jni" version = "0.21.1" @@ -3343,27 +3348,27 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" dependencies = [ "libc", ] [[package]] name = "jpeg-decoder" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" dependencies = [ "rayon", ] [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -3371,12 +3376,11 @@ dependencies = [ [[package]] name = "keepawake" version = "0.4.3" -source = "git+https://github.com/rustdesk-org/keepawake-rs#ad94454a75cf1ff9e95e217dee9dd6a378bf625e" +source = "git+https://github.com/rustdesk-org/keepawake-rs#64d568586dd16551d02120e19668d2b0fec8e3c9" dependencies = [ "anyhow", - "apple-sys", "cfg-if 1.0.0", - "core-foundation 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.9.4", "shadow-rs", "windows 0.48.0", "winres", @@ -3399,16 +3403,16 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" dependencies = [ - "bitflags 2.4.1", - "serde 1.0.190", + "bitflags 2.6.0", + "serde 1.0.203", "unicode-segmentation", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lazycell" @@ -3448,9 +3452,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.150" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libdbus-sys" @@ -3485,12 +3489,12 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if 1.0.0", - "windows-sys 0.48.0", + "windows-targets 0.52.5", ] [[package]] @@ -3508,8 +3512,8 @@ dependencies = [ "bitflags 1.3.2", "libc", "libpulse-sys", - "num-derive", - "num-traits 0.2.17", + "num-derive 0.3.3", + "num-traits 0.2.19", "winapi 0.3.9", ] @@ -3541,12 +3545,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc19e110fbf42c17260d30f6d3dc545f58491c7830d38ecb9aaca96e26067a9b" dependencies = [ "libc", - "num-derive", - "num-traits 0.2.17", + "num-derive 0.3.3", + "num-traits 0.2.19", "pkg-config", "winapi 0.3.9", ] +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + [[package]] name = "libsamplerate-sys" version = "0.1.12" @@ -3589,9 +3603,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.12" +version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" +checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" dependencies = [ "cc", "libc", @@ -3601,12 +3615,9 @@ dependencies = [ [[package]] name = "line-wrap" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" -dependencies = [ - "safemem", -] +checksum = "dd1bc4d24ad230d21fb898d1116b1801d7adfc449d42026475862ab48b11e70e" [[package]] name = "linux-raw-sys" @@ -3616,41 +3627,41 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ - "autocfg 1.1.0", + "autocfg 1.3.0", "scopeguard", ] [[package]] name = "log" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "mac_address" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4863ee94f19ed315bf3bc00299338d857d4b5bc856af375cc97d237382ad3856" +checksum = "8836fae9d0d4be2c8b4efcdd79e828a2faa058a90d005abf42f91cac5493a08e" dependencies = [ - "nix 0.23.2", + "nix 0.28.0", "winapi 0.3.9", ] [[package]] name = "mach2" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" dependencies = [ "libc", ] @@ -3698,9 +3709,9 @@ checksum = "df39d232f5c40b0891c10216992c2f250c054105cb1e56f0fc9032db6203ecc1" [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memoffset" @@ -3708,7 +3719,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ - "autocfg 1.1.0", + "autocfg 1.3.0", ] [[package]] @@ -3717,16 +3728,16 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" dependencies = [ - "autocfg 1.1.0", + "autocfg 1.3.0", ] [[package]] name = "memoffset" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ - "autocfg 1.1.0", + "autocfg 1.3.0", ] [[package]] @@ -3743,9 +3754,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", "simd-adler32", @@ -3773,12 +3784,13 @@ dependencies = [ [[package]] name = "muda" -version = "0.11.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e406691fa7749604bbc7964bde28a300572d52621bb84540f6907c0f8fe08737" +checksum = "86b959f97c97044e4c96e32e1db292a7d594449546a3c6b77ae613dc3a5b5145" dependencies = [ "cocoa 0.25.0", "crossbeam-channel", + "dpi", "gtk", "keyboard-types", "libxdo", @@ -3797,11 +3809,10 @@ checksum = "0419348c027fa7be448d2ae7ea0e4e04c2334c31dc4e74ab29f00a2a7ca69204" [[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", @@ -3813,6 +3824,18 @@ dependencies = [ "tempfile", ] +[[package]] +name = "native-windows-gui" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f7003a669f68deb6b7c57d74fff4f8e533c44a3f0b297492440ef4ff5a28454" +dependencies = [ + "bitflags 1.3.2", + "lazy_static", + "winapi 0.3.9", + "winapi-build", +] + [[package]] name = "ndk" version = "0.7.0" @@ -3821,12 +3844,26 @@ checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" dependencies = [ "bitflags 1.3.2", "jni-sys", - "ndk-sys", - "num_enum", + "ndk-sys 0.4.1+23.1.7779620", + "num_enum 0.5.11", "raw-window-handle 0.5.2", "thiserror", ] +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.6.0", + "jni-sys", + "log", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum 0.7.2", + "thiserror", +] + [[package]] name = "ndk-context" version = "0.1.1" @@ -3842,6 +3879,15 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + [[package]] name = "netlink-packet-core" version = "0.5.0" @@ -3882,9 +3928,9 @@ dependencies = [ [[package]] name = "netlink-sys" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6471bf08e7ac0135876a9581bf3217ef0333c191c128d34878079f42ee150411" +checksum = "416060d346fbaf1f23f9512963e3e878f1a78e707cb699ba9215761754244307" dependencies = [ "bytes", "libc", @@ -3904,17 +3950,6 @@ dependencies = [ "memoffset 0.6.5", ] -[[package]] -name = "nix" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" -dependencies = [ - "bitflags 1.3.2", - "cfg-if 1.0.0", - "libc", -] - [[package]] name = "nix" version = "0.26.4" @@ -3925,18 +3960,19 @@ dependencies = [ "cfg-if 1.0.0", "libc", "memoffset 0.7.1", - "pin-utils", ] [[package]] name = "nix" -version = "0.27.1" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "cfg-if 1.0.0", + "cfg_aliases", "libc", + "memoffset 0.9.1", ] [[package]] @@ -3949,15 +3985,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "nom8" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae01545c9c7fc4486ab7debaf2aad7003ac19431791868fb2e8066df97fad2f8" -dependencies = [ - "memchr", -] - [[package]] name = "ntapi" version = "0.4.1" @@ -3978,65 +4005,69 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg 1.1.0", "num-integer", - "num-traits 0.2.17", + "num-traits 0.2.19", ] [[package]] name = "num-complex" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ - "num-traits 0.2.17", + "num-traits 0.2.19", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "syn 1.0.109", ] [[package]] -name = "num-integer" -version = "0.1.45" +name = "num-derive" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ - "autocfg 1.1.0", - "num-traits 0.2.17", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] -name = "num-rational" -version = "0.3.2" +name = "num-integer" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg 1.1.0", - "num-integer", - "num-traits 0.2.17", + "num-traits 0.2.19", ] [[package]] name = "num-rational" -version = "0.4.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" dependencies = [ - "autocfg 1.1.0", + "autocfg 1.3.0", "num-integer", - "num-traits 0.2.17", + "num-traits 0.2.19", ] [[package]] @@ -4045,16 +4076,16 @@ version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" dependencies = [ - "num-traits 0.2.17", + "num-traits 0.2.19", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "autocfg 1.1.0", + "autocfg 1.3.0", ] [[package]] @@ -4063,7 +4094,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.9", "libc", ] @@ -4073,7 +4104,16 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" dependencies = [ - "num_enum_derive", + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive 0.7.2", ] [[package]] @@ -4083,16 +4123,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "syn 1.0.109", ] +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate 2.0.2", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", +] + [[package]] name = "num_threads" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ "libc", ] @@ -4124,15 +4176,71 @@ version = "0.2.0-beta.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + [[package]] name = "objc2" version = "0.3.0-beta.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a49f420f16c8814efdcd6b4258664de9d9920cbc26b6f95d034a1ca9850ccc2c" dependencies = [ - "block2", - "objc-sys", - "objc2-encode", + "block2 0.2.0-alpha.6", + "objc-sys 0.2.0-beta.2", + "objc2-encode 2.0.0-pre.2", +] + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys 0.3.5", + "objc2-encode 4.0.3", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.6.0", + "block2 0.5.1", + "libc", + "objc2 0.5.2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.6.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation", + "objc2-metal", ] [[package]] @@ -4141,7 +4249,50 @@ version = "2.0.0-pre.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" dependencies = [ - "objc-sys", + "objc-sys 0.2.0-beta.2", +] + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2 0.5.1", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation", + "objc2-metal", ] [[package]] @@ -4164,49 +4315,49 @@ dependencies = [ [[package]] name = "object" -version = "0.32.1" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" dependencies = [ "memchr", ] [[package]] name = "oboe" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0" +checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" dependencies = [ - "jni 0.20.0", - "ndk", + "jni 0.21.1", + "ndk 0.8.0", "ndk-context", - "num-derive", - "num-traits 0.2.17", + "num-derive 0.4.2", + "num-traits 0.2.19", "oboe-sys", ] [[package]] name = "oboe-sys" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f44155e7fb718d3cfddcf70690b2b51ac4412f347cd9e4fbe511abe9cd7b5f2" +checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" dependencies = [ "cc", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.62" +version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "cfg-if 1.0.0", "foreign-types 0.3.2", "libc", @@ -4221,9 +4372,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] @@ -4234,9 +4385,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.98" +version = "0.9.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" dependencies = [ "cc", "libc", @@ -4284,23 +4435,23 @@ dependencies = [ [[package]] name = "os_info" -version = "3.7.0" +version = "3.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e" +checksum = "ae99c7fa6dd38c7cafe1ec085e804f8f555a2f8659b0dbe03f1f9963a9b51092" dependencies = [ "log", - "serde 1.0.190", - "winapi 0.3.9", + "serde 1.0.203", + "windows-sys 0.52.0", ] [[package]] name = "os_pipe" -version = "1.1.4" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae859aa07428ca9a929b936690f8b12dc5f11dd8c6992a18ca93919f28bc177" +checksum = "29d73ba8daf8fac13b0501d1abeddcfe21ba7401ada61a819144b6c2a4f32209" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -4309,9 +4460,9 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38731fa859ef679f1aec66ca9562165926b442f298467f76f5990f431efe87dc" dependencies = [ - "serde 1.0.190", + "serde 1.0.203", "serde_derive", - "serde_json 1.0.107", + "serde_json 1.0.118", ] [[package]] @@ -4341,8 +4492,8 @@ version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c94f3b9b97df3c6d4e51a14916639b24e02c7d15d1dba686ce9b1118277cb811" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "syn 1.0.109", ] @@ -4377,7 +4528,7 @@ dependencies = [ "glib-sys 0.18.1", "gobject-sys 0.18.0", "libc", - "system-deps 6.1.2", + "system-deps 6.2.2", ] [[package]] @@ -4401,9 +4552,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -4411,15 +4562,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.2", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -4435,9 +4586,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pbkdf2" @@ -4459,18 +4610,18 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.0.2", + "indexmap", ] [[package]] @@ -4513,29 +4664,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -4545,40 +4696,40 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" dependencies = [ "atomic-waker", - "fastrand 2.0.1", + "fastrand 2.1.0", "futures-io", ] [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "plist" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a4a0cfc5fb21a09dc6af4bf834cf10d4a32fccd9e2ea468c4b1751a097487aa" +checksum = "d9d34169e64b3c7a80c8621a48adaf44e0cf62c78a9b25dd9dd35f1881a17cf9" dependencies = [ - "base64 0.21.5", - "indexmap 1.9.3", + "base64 0.21.7", + "indexmap", "line-wrap", - "quick-xml", - "serde 1.0.190", - "time 0.3.30", + "quick-xml 0.31.0", + "serde 1.0.203", + "time 0.3.36", ] [[package]] name = "png" -version = "0.17.10" +version = "0.17.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -4593,7 +4744,7 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" dependencies = [ - "autocfg 1.1.0", + "autocfg 1.3.0", "bitflags 1.3.2", "cfg-if 1.0.0", "concurrent-queue", @@ -4603,6 +4754,21 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "polling" +version = "3.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" +dependencies = [ + "cfg-if 1.0.0", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix 0.38.34", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -4623,19 +4789,19 @@ checksum = "bc5c99d529f0d30937f6f4b8a86d988047327bb88d04d2c4afc356de74722131" [[package]] name = "prettyplease" -version = "0.2.15" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ - "proc-macro2 1.0.79", - "syn 2.0.55", + "proc-macro2 1.0.86", + "syn 2.0.68", ] [[package]] name = "primal-check" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9df7f93fd637f083201473dab4fee2db4c429d32e55e3299980ab3957ab916a0" +checksum = "dc0d895b311e3af9902528fbb8f928688abbd95872819320517cc24ca6b2bd08" dependencies = [ "num-integer", ] @@ -4661,11 +4827,12 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" dependencies = [ - "toml_edit 0.20.7", + "toml_datetime", + "toml_edit 0.20.2", ] [[package]] @@ -4675,8 +4842,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "syn 1.0.109", "version_check", ] @@ -4687,8 +4854,8 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "version_check", ] @@ -4703,18 +4870,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "protobuf" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58678a64de2fced2bdec6bca052a6716a0efe692d6e3f53d1bda6a1def64cfc0" +checksum = "df67496db1a89596beaced1579212e9b7c53c22dca1d9745de00ead76573d514" dependencies = [ "bytes", "once_cell", @@ -4724,9 +4891,9 @@ dependencies = [ [[package]] name = "protobuf-codegen" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32777b0b3f6538d9d2e012b3fad85c7e4b9244b5958d04a6415f4333782b7a77" +checksum = "eab09155fad2d39333d3796f67845d43e29b266eea74f7bc93f153f707f126dc" dependencies = [ "anyhow", "once_cell", @@ -4739,12 +4906,12 @@ dependencies = [ [[package]] name = "protobuf-parse" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96cb37955261126624a25b5e6bda40ae34cf3989d52a783087ca6091b29b5642" +checksum = "1a16027030d4ec33e423385f73bb559821827e9ec18c50e7874e4d6de5a4e96f" dependencies = [ "anyhow", - "indexmap 1.9.3", + "indexmap", "log", "protobuf", "protobuf-support", @@ -4755,9 +4922,9 @@ dependencies = [ [[package]] name = "protobuf-support" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ed294a835b0f30810e13616b1cd34943c6d1e84a8f3b0dcfe466d256c3e7e7" +checksum = "70e2d30ab1878b2e72d1e2fc23ff5517799c9929e2cf81a8516f9f4dcf2b9cf3" dependencies = [ "thiserror", ] @@ -4778,7 +4945,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d06cb9646c7a14096231a2474d7f21e5e8c13de090c68d13bde6157cfe7f159" dependencies = [ "html-escape", - "image", + "image 0.24.9", "qrcodegen", ] @@ -4810,6 +4977,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "quick-xml" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "0.6.13" @@ -4821,11 +4997,11 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ - "proc-macro2 1.0.79", + "proc-macro2 1.0.86", ] [[package]] @@ -4978,15 +5154,15 @@ checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] name = "raw-window-handle" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "rayon" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -4994,9 +5170,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -5008,8 +5184,8 @@ version = "0.5.0-2" source = "git+https://github.com/fufesou/rdev#b3434caee84c92412b45a2f655a15ac5dad33488" dependencies = [ "cocoa 0.24.1", - "core-foundation 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation-sys 0.8.4", + "core-foundation 0.9.4", + "core-foundation-sys 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", "core-graphics 0.22.3", "dispatch", "enum-map", @@ -5046,47 +5222,38 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ "getrandom", - "redox_syscall 0.2.16", + "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.10.2" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", @@ -5096,9 +5263,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -5107,9 +5274,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "repng" @@ -5127,7 +5294,7 @@ version = "0.11.23" source = "git+https://github.com/rustdesk-org/reqwest#9cb758c9fb2f4edc62eb790acfd45a6a3da21ed3" dependencies = [ "async-compression", - "base64 0.21.5", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -5146,11 +5313,11 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.10", + "rustls 0.21.12", "rustls-native-certs 0.6.3", - "rustls-pemfile 1.0.3", - "serde 1.0.190", - "serde_json 1.0.107", + "rustls-pemfile 1.0.4", + "serde 1.0.203", + "serde_json 1.0.118", "serde_urlencoded", "sync_wrapper", "system-configuration", @@ -5170,16 +5337,17 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.5" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if 1.0.0", "getrandom", "libc", "spin", "untrusted", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -5204,23 +5372,23 @@ dependencies = [ [[package]] name = "rpassword" -version = "7.2.0" +version = "7.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6678cf63ab3491898c0d021b493c94c9b221d91295294a2a5746eacbe5928322" +checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" dependencies = [ "libc", "rtoolbox", - "winapi 0.3.9", + "windows-sys 0.48.0", ] [[package]] name = "rtoolbox" -version = "0.0.1" +version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034e22c514f5c0cb8a10ff341b9b048b5ceb21591f31c8f44c43b960f9b3524a" +checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" dependencies = [ "libc", - "winapi 0.3.9", + "windows-sys 0.48.0", ] [[package]] @@ -5231,7 +5399,7 @@ checksum = "cd70209c27d5b08f5528bdc779ea3ffb418954e28987f9f9775c6eac41003f9c" dependencies = [ "num-complex", "num-integer", - "num-traits 0.2.17", + "num-traits 0.2.19", "realfft", ] @@ -5267,9 +5435,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -5288,7 +5456,7 @@ dependencies = [ [[package]] name = "rustdesk" -version = "1.2.6" +version = "1.2.7" dependencies = [ "android-wakelock", "android_logger", @@ -5300,10 +5468,11 @@ dependencies = [ "cfg-if 1.0.0", "chrono", "cidr-utils", - "clap 4.4.7", + "clap 4.5.8", "clipboard", + "clipboard-master", "cocoa 0.24.1", - "core-foundation 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.9.4", "core-graphics 0.22.3", "cpal", "crossbeam-queue", @@ -5322,13 +5491,13 @@ dependencies = [ "hbb_common", "hex", "hound", - "image", + "image 0.24.9", "impersonate_system", "include_dir", "jni 0.21.1", "keepawake", "lazy_static", - "libloading 0.8.1", + "libloading 0.8.4", "libpulse-binding", "libpulse-simple-binding", "mac_address", @@ -5347,16 +5516,16 @@ dependencies = [ "repng", "reqwest", "ringbuf", - "rpassword 7.2.0", + "rpassword 7.3.1", "rubato", "runas", "rust-pulsectl", "samplerate", "sciter-rs", "scrap", - "serde 1.0.190", + "serde 1.0.203", "serde_derive", - "serde_json 1.0.107", + "serde_json 1.0.118", "serde_repr", "sha2", "shared_memory", @@ -5378,31 +5547,32 @@ dependencies = [ "winreg 0.11.0", "winres", "wol-rs", - "x11-clipboard", + "x11-clipboard 0.8.1", "x11rb 0.12.0", "zip", ] [[package]] name = "rustdesk-portable-packer" -version = "1.2.6" +version = "1.2.7" dependencies = [ "brotli", "dirs 5.0.1", "md5", + "native-windows-gui", "winapi 0.3.9", "winres", ] [[package]] name = "rustfft" -version = "6.1.0" +version = "6.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17d4f6cbdb180c9f4b2a26bbf01c4e647f1e1dea22fe8eb9db54198b32f9434" +checksum = "43806561bc506d0c5d160643ad742e3161049ac01027b5e6d7524091fd401d86" dependencies = [ "num-complex", "num-integer", - "num-traits 0.2.17", + "num-traits 0.2.19", "primal-check", "strength_reduce", "transpose", @@ -5425,22 +5595,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.21" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys 0.4.10", - "windows-sys 0.48.0", + "linux-raw-sys 0.4.14", + "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring", @@ -5450,15 +5620,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.4" +version = "0.23.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c4d6d8ad9f2492485e13453acbb291dd08f64441b6609c491f1c2cd2c6b4fe1" +checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" dependencies = [ "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki 0.102.4", "subtle", "zeroize", ] @@ -5470,7 +5640,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls-pemfile 1.0.3", + "rustls-pemfile 1.0.4", "schannel", "security-framework", ] @@ -5490,11 +5660,11 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", ] [[package]] @@ -5503,34 +5673,34 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" dependencies = [ - "base64 0.22.0", + "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.4.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustls-platform-verifier" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5f0d26fa1ce3c790f9590868f0109289a044acb954525f933e2aa3b871c157d" +checksum = "3e3beb939bcd33c269f4bf946cc829fcd336370267c4a927ac0399c84a3151a1" dependencies = [ - "core-foundation 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation-sys 0.8.4", + "core-foundation 0.9.4", + "core-foundation-sys 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", "jni 0.19.0", "log", "once_cell", - "rustls 0.23.4", + "rustls 0.23.10", "rustls-native-certs 0.7.0", "rustls-platform-verifier-android", - "rustls-webpki 0.102.2", + "rustls-webpki 0.102.4", "security-framework", "security-framework-sys", - "webpki-roots 0.26.1", + "webpki-roots 0.26.3", "winapi 0.3.9", ] @@ -5552,9 +5722,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.2" +version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ "ring", "rustls-pki-types", @@ -5563,21 +5733,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "safemem" -version = "0.3.3" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -5599,11 +5763,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -5647,14 +5811,14 @@ dependencies = [ "jni 0.21.1", "lazy_static", "log", - "ndk", + "ndk 0.7.0", "ndk-context", "num_cpus", "pkg-config", "quest", "repng", - "serde 1.0.190", - "serde_json 1.0.107", + "serde 1.0.203", + "serde_json 1.0.118", "target_build_utils", "tracing", "webm", @@ -5678,8 +5842,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation-sys 0.8.4", + "core-foundation 0.9.4", + "core-foundation-sys 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", "libc", "num-bigint", "security-framework-sys", @@ -5687,19 +5851,19 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ - "core-foundation-sys 0.8.4", + "core-foundation-sys 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", "libc", ] [[package]] name = "semver" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" @@ -5709,22 +5873,22 @@ checksum = "34b623917345a631dc9608d5194cc206b3fe6c3554cd1c75b937e55e285254af" [[package]] name = "serde" -version = "1.0.190" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.190" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] @@ -5741,33 +5905,33 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" dependencies = [ - "itoa 1.0.9", + "itoa 1.0.11", "ryu", - "serde 1.0.190", + "serde 1.0.203", ] [[package]] name = "serde_repr" -version = "0.1.16" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] name = "serde_spanned" -version = "0.6.4" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ - "serde 1.0.190", + "serde 1.0.203", ] [[package]] @@ -5777,9 +5941,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.9", + "itoa 1.0.11", "ryu", - "serde 1.0.190", + "serde 1.0.203", ] [[package]] @@ -5813,8 +5977,8 @@ dependencies = [ "const_format", "git2", "is_debug", - "time 0.3.30", - "tzdb", + "time 0.3.36", + "tzdb 0.5.10", ] [[package]] @@ -5844,9 +6008,9 @@ checksum = "6057adedbec913419c92996f395ba69931acbd50b7d56955394cd3f7bedbfa45" [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -5875,14 +6039,14 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ - "autocfg 1.1.0", + "autocfg 1.3.0", ] [[package]] name = "smallvec" -version = "1.11.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" @@ -5907,12 +6071,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -5924,7 +6088,7 @@ dependencies = [ "ed25519", "libc", "libsodium-sys", - "serde 1.0.190", + "serde 1.0.203", ] [[package]] @@ -5960,6 +6124,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "strum" version = "0.18.0" @@ -5979,8 +6149,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c" dependencies = [ "heck 0.3.3", - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "syn 1.0.109", ] @@ -5991,17 +6161,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "rustversion", "syn 1.0.109", ] [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -6020,19 +6190,19 @@ version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.55" +version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "unicode-ident", ] @@ -6057,7 +6227,7 @@ version = "0.29.10" source = "git+https://github.com/rustdesk-org/sysinfo#f45dcc6510d48c3a1401c5a33eedccc8899f67b2" dependencies = [ "cfg-if 1.0.0", - "core-foundation-sys 0.8.4", + "core-foundation-sys 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", "libc", "ntapi", "once_cell", @@ -6072,7 +6242,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -6082,7 +6252,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" dependencies = [ - "core-foundation-sys 0.8.4", + "core-foundation-sys 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", "libc", ] @@ -6103,15 +6273,15 @@ dependencies = [ [[package]] name = "system-deps" -version = "6.1.2" +version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94af52f9402f94aac4948a2518b43359be8d9ce6cd9efc1c4de3b2f7b7e897d6" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ "cfg-expr", - "heck 0.4.1", + "heck 0.5.0", "pkg-config", - "toml 0.8.6", - "version-compare 0.1.1", + "toml 0.8.2", + "version-compare 0.2.0", ] [[package]] @@ -6132,27 +6302,27 @@ dependencies = [ "bitflags 1.3.2", "cc", "cocoa 0.25.0", - "core-foundation 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "core-graphics 0.23.1 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.9.4", + "core-graphics 0.23.2", "crossbeam-channel", "dispatch", "gdkwayland-sys", "gdkx11-sys", "gtk", - "image", + "image 0.24.9", "instant", "jni 0.21.1", "lazy_static", "libc", "log", - "ndk", + "ndk 0.7.0", "ndk-context", - "ndk-sys", + "ndk-sys 0.4.1+23.1.7779620", "objc", "once_cell", "parking_lot", "png", - "raw-window-handle 0.6.0", + "raw-window-handle 0.6.2", "scopeguard", "tao-macros", "unicode-segmentation", @@ -6169,8 +6339,8 @@ name = "tao-macros" version = "0.1.2" source = "git+https://github.com/rustdesk-org/tao?branch=dev#288c219cb0527e509590c2b2d8e7072aa9feb2d3" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "syn 1.0.109", ] @@ -6182,9 +6352,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "target-lexicon" -version = "0.12.12" +version = "0.12.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" [[package]] name = "target_build_utils" @@ -6203,28 +6373,27 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "006851c9ccefa3c38a7646b8cec804bb429def3da10497bfa977179869c3e8e2" dependencies = [ - "quick-xml", + "quick-xml 0.30.0", "windows 0.51.1", ] [[package]] name = "tempfile" -version = "3.8.1" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if 1.0.0", - "fastrand 2.0.1", - "redox_syscall 0.4.1", - "rustix 0.38.21", - "windows-sys 0.48.0", + "fastrand 2.1.0", + "rustix 0.38.34", + "windows-sys 0.52.0", ] [[package]] name = "termcolor" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] @@ -6261,22 +6430,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] @@ -6290,9 +6459,9 @@ dependencies = [ [[package]] name = "tiff" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" dependencies = [ "flate2", "jpeg-decoder", @@ -6312,16 +6481,17 @@ dependencies = [ [[package]] name = "time" -version = "0.3.30" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", - "itoa 1.0.9", + "itoa 1.0.11", "libc", + "num-conv", "num_threads", "powerfmt", - "serde 1.0.190", + "serde 1.0.203", "time-core", "time-macros", ] @@ -6334,18 +6504,19 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" dependencies = [ "tinyvec_macros", ] @@ -6370,7 +6541,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2 0.5.7", "tokio-macros", "windows-sys 0.48.0", ] @@ -6381,9 +6552,9 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] @@ -6402,7 +6573,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.10", + "rustls 0.21.12", "tokio", ] @@ -6412,7 +6583,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.4", + "rustls 0.23.10", "rustls-pki-types", "tokio", ] @@ -6447,20 +6618,19 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-io", "futures-sink", "futures-util", - "hashbrown 0.14.2", + "hashbrown 0.14.5", "pin-project-lite", "slab", "tokio", - "tracing", ] [[package]] @@ -6469,19 +6639,7 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "serde 1.0.190", -] - -[[package]] -name = "toml" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb9d890e4dc9298b70f740f615f2e05b9db37dce531f6b24fb77ac993f9f217" -dependencies = [ - "serde 1.0.190", - "serde_spanned", - "toml_datetime 0.5.1", - "toml_edit 0.18.1", + "serde 1.0.203", ] [[package]] @@ -6490,53 +6648,31 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ - "serde 1.0.190", + "serde 1.0.203", "serde_spanned", - "toml_datetime 0.6.5", + "toml_datetime", "toml_edit 0.19.15", ] [[package]] name = "toml" -version = "0.8.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ff9e3abce27ee2c9a37f9ad37238c1bdd4e789c84ba37df76aa4d528f5072cc" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" dependencies = [ - "serde 1.0.190", + "serde 1.0.203", "serde_spanned", - "toml_datetime 0.6.5", - "toml_edit 0.20.7", -] - -[[package]] -name = "toml_datetime" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5" -dependencies = [ - "serde 1.0.190", + "toml_datetime", + "toml_edit 0.20.2", ] [[package]] name = "toml_datetime" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" -dependencies = [ - "serde 1.0.190", -] - -[[package]] -name = "toml_edit" -version = "0.18.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c59d8dd7d0dcbc6428bf7aa2f0e823e26e43b3c9aca15bbc9475d23e5fa12b" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" dependencies = [ - "indexmap 1.9.3", - "nom8", - "serde 1.0.190", - "serde_spanned", - "toml_datetime 0.5.1", + "serde 1.0.203", ] [[package]] @@ -6545,31 +6681,31 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.0.2", - "serde 1.0.190", + "indexmap", + "serde 1.0.203", "serde_spanned", - "toml_datetime 0.6.5", + "toml_datetime", "winnow", ] [[package]] name = "toml_edit" -version = "0.20.7" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.0.2", - "serde 1.0.190", + "indexmap", + "serde 1.0.203", "serde_spanned", - "toml_datetime 0.6.5", + "toml_datetime", "winnow", ] [[package]] name = "totp-rs" -version = "5.4.0" +version = "5.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3504f96adf86d28e7eb16fa236a7951ec72c15ee100d1b5318e225944bc8cb" +checksum = "6c4ae9724c5888c0417d2396037ed3b60665925624766416e3e342b6ba5dbd3f" dependencies = [ "base32", "constant_time_eq 0.2.6", @@ -6604,9 +6740,9 @@ version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] @@ -6630,16 +6766,17 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.11.3" -source = "git+https://github.com/tauri-apps/tray-icon#b8dbd42c6f94a29f34b0a0daa619486277185512" +version = "0.14.3" +source = "git+https://github.com/tauri-apps/tray-icon#d4078696edba67b0ab42cef67e6a421a0332c96f" dependencies = [ - "cocoa 0.25.0", - "core-graphics 0.23.1 (registry+https://github.com/rust-lang/crates.io-index)", + "core-graphics 0.23.2", "crossbeam-channel", - "dirs-next", + "dirs 5.0.1", "libappindicator", "muda", - "objc", + "objc2 0.5.2", + "objc2-app-kit", + "objc2-foundation", "once_cell", "png", "thiserror", @@ -6648,13 +6785,13 @@ dependencies = [ [[package]] name = "tree_magic_mini" -version = "3.0.3" +version = "3.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91adfd0607cacf6e4babdb870e9bec4037c1c4b151cfd279ccefc5e0c7feaa6d" +checksum = "469a727cac55b41448315cc10427c069c618ac59bb6a4480283fcd811749bdc2" dependencies = [ - "bytecount", "fnv", - "lazy_static", + "home", + "memchr", "nom", "once_cell", "petgraph", @@ -6683,20 +6820,42 @@ dependencies = [ [[package]] name = "tzdb" -version = "0.5.7" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a18ee5bde3433d683d41859650804a5ad89cad17f153a53f1e6a96e0da2d969" +dependencies = [ + "iana-time-zone", + "tz-rs", + "tzdb 0.6.1", +] + +[[package]] +name = "tzdb" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec758958f2fb5069cd7fae385be95cc8eceb8cdfd270c7d14de6034f0108d99e" +checksum = "1b580f6b365fa89f5767cdb619a55d534d04a4e14c2d7e5b9a31e94598687fb1" dependencies = [ "iana-time-zone", "tz-rs", + "tzdb_data", +] + +[[package]] +name = "tzdb_data" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1889fdffac09d65c1d95c42d5202e9b21ad8c758f426e9fe09088817ea998d6" +dependencies = [ + "tz-rs", ] [[package]] name = "uds_windows" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" dependencies = [ + "memoffset 0.9.1", "tempfile", "winapi 0.3.9", ] @@ -6712,9 +6871,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -6724,24 +6883,24 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" @@ -6763,14 +6922,14 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", "percent-encoding", - "serde 1.0.190", + "serde 1.0.203", ] [[package]] @@ -6816,15 +6975,15 @@ checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" [[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" -version = "1.5.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" +checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" dependencies = [ "getrandom", ] @@ -6849,9 +7008,9 @@ checksum = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1" [[package]] name = "version-compare" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" [[package]] name = "version_check" @@ -6869,15 +7028,15 @@ dependencies = [ [[package]] name = "waker-fn" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -6925,9 +7084,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -6935,24 +7094,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -6962,42 +7121,42 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ - "quote 1.0.35", + "quote 1.0.36", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wayland-backend" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19152ddd73f45f024ed4534d9ca2594e0ef252c1847695255dae47f34df9fbe4" +checksum = "34e9e6b6d4a2bb4e7e69433e0b35c7923b95d4dc8503a84d25ec917a4bbfdf07" dependencies = [ "cc", "downcast-rs", - "nix 0.26.4", + "rustix 0.38.34", "scoped-tls", "smallvec", "wayland-sys", @@ -7005,23 +7164,23 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.1" +version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca7d52347346f5473bf2f56705f360e8440873052e575e55890c4fa57843ed3" +checksum = "1e63801c85358a431f986cffa74ba9599ff571fc5774ac113ed3b490c19a1133" dependencies = [ - "bitflags 2.4.1", - "nix 0.26.4", + "bitflags 2.6.0", + "rustix 0.38.34", "wayland-backend", "wayland-scanner", ] [[package]] name = "wayland-protocols" -version = "0.31.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e253d7107ba913923dc253967f35e8561a3c65f914543e46843c88ddd729e21c" +checksum = "83d0f1056570486e26a3773ec633885124d79ae03827de05ba6c85f79904026c" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -7029,11 +7188,11 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" +checksum = "a7dab47671043d9f5397035975fe1cac639e5bca5cc0b3c32d09f01612e34d24" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7042,20 +7201,20 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.0" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb8e28403665c9f9513202b7e1ed71ec56fde5c107816843fb14057910b2c09c" +checksum = "67da50b9f80159dec0ea4c11c13e24ef9e7574bd6ce24b01860a175010cea565" dependencies = [ - "proc-macro2 1.0.79", - "quick-xml", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quick-xml 0.31.0", + "quote 1.0.36", ] [[package]] name = "wayland-sys" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" +checksum = "105b1842da6554f91526c14a2a2172897b7f745a805d62af4ce698706be79c12" dependencies = [ "dlib", "log", @@ -7064,9 +7223,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -7096,18 +7255,18 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.1" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" dependencies = [ "rustls-pki-types", ] [[package]] name = "weezl" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "which" @@ -7118,14 +7277,14 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.21", + "rustix 0.38.34", ] [[package]] name = "whoami" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fec781d48b41f8163426ed18e8fc2864c12937df9ce54c88ede7bd47270893e" +checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" dependencies = [ "redox_syscall 0.4.1", "wasite", @@ -7134,9 +7293,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "win-sys" @@ -7177,18 +7336,18 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi 0.3.9", + "windows-sys 0.52.0", ] [[package]] name = "winapi-wsapoll" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e" +checksum = "1eafc5f679c576995526e81635d0cf9695841736712b4e892f87abbe6fed3f28" dependencies = [ "winapi 0.3.9", ] @@ -7234,15 +7393,6 @@ dependencies = [ "windows-targets 0.42.2", ] -[[package]] -name = "windows" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows" version = "0.48.0" @@ -7271,7 +7421,17 @@ dependencies = [ "windows-core 0.52.0", "windows-implement", "windows-interface", - "windows-targets 0.52.0", + "windows-targets 0.52.5", +] + +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", + "windows-targets 0.52.5", ] [[package]] @@ -7289,7 +7449,17 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result", + "windows-targets 0.52.5", ] [[package]] @@ -7298,9 +7468,9 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12168c33176773b86799be25e2a2ba07c7aab9968b37541f1094dbd7a60c8946" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] @@ -7309,9 +7479,18 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d8dc32e0095a7eeccebd0e3f09e9509365ecb3fc6ac4d6f5f14a3f6392942d1" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.5", ] [[package]] @@ -7349,7 +7528,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.5", ] [[package]] @@ -7384,26 +7563,36 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] name = "windows-version" -version = "0.1.0" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-win" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75aa004c988e080ad34aff5739c39d0312f4684699d6d71fc8a198d057b8b9b4" +checksum = "58e23e33622b3b52f948049acbec9bcc34bf6e26d74176b88941f213c75cf2dc" dependencies = [ - "windows-targets 0.52.0", + "error-code", ] [[package]] @@ -7420,9 +7609,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -7450,9 +7639,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -7480,9 +7669,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -7510,9 +7705,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -7540,9 +7735,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -7558,9 +7753,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -7588,15 +7783,15 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" -version = "0.5.17" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] @@ -7632,15 +7827,14 @@ dependencies = [ [[package]] name = "wl-clipboard-rs" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57af79e973eadf08627115c73847392e6b766856ab8e3844a59245354b23d2fa" +checksum = "4de22eebb1d1e2bad2d970086e96da0e12cde0b411321e5b0f7b2a1f876aa26f" dependencies = [ - "derive-new", "libc", "log", - "nix 0.26.4", "os_pipe", + "rustix 0.38.34", "tempfile", "thiserror", "tree_magic_mini", @@ -7692,6 +7886,16 @@ dependencies = [ "x11rb 0.12.0", ] +[[package]] +name = "x11-clipboard" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98785a09322d7446e28a13203d2cae1059a0dd3dfb32cb06d0a225f023d8286" +dependencies = [ + "libc", + "x11rb 0.13.1", +] + [[package]] name = "x11-dl" version = "2.21.0" @@ -7718,13 +7922,13 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f25ead8c7e4cba123243a6367da5d3990e0d3affa708ea19dce96356bd9f1a" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "gethostname 0.4.3", - "rustix 0.38.21", - "x11rb-protocol 0.13.0", + "rustix 0.38.34", + "x11rb-protocol 0.13.1", ] [[package]] @@ -7738,31 +7942,31 @@ dependencies = [ [[package]] name = "x11rb-protocol" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e63e71c4b8bd9ffec2c963173a4dc4cbde9ee96961d4fcb4429db9929b606c34" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" [[package]] name = "xdg-home" -version = "1.0.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd" +checksum = "ca91dcf8f93db085f3a0a29358cd0b9d670915468f4290e8b85d118a34211ab8" dependencies = [ - "nix 0.26.4", - "winapi 0.3.9", + "libc", + "windows-sys 0.52.0", ] [[package]] name = "zbus" -version = "3.14.1" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" dependencies = [ "async-broadcast", "async-executor", "async-fs", - "async-io", - "async-lock", + "async-io 1.13.0", + "async-lock 2.8.0", "async-process", "async-recursion", "async-task", @@ -7780,7 +7984,7 @@ dependencies = [ "once_cell", "ordered-stream", "rand 0.8.5", - "serde 1.0.190", + "serde 1.0.203", "serde_repr", "sha1", "static_assertions", @@ -7795,13 +7999,13 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "3.14.1" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "regex", "syn 1.0.109", "zvariant_utils", @@ -7809,11 +8013,11 @@ dependencies = [ [[package]] name = "zbus_names" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9" +checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" dependencies = [ - "serde 1.0.190", + "serde 1.0.203", "static_assertions", "zvariant", ] @@ -7830,11 +8034,11 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ - "zerocopy-derive 0.7.32", + "zerocopy-derive 0.7.34", ] [[package]] @@ -7843,27 +8047,27 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", - "syn 2.0.55", + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.68", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] name = "zip" @@ -7881,7 +8085,7 @@ dependencies = [ "hmac", "pbkdf2", "sha1", - "time 0.3.30", + "time 0.3.36", "zstd 0.11.2+zstd.1.5.2", ] @@ -7896,11 +8100,11 @@ dependencies = [ [[package]] name = "zstd" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" +checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" dependencies = [ - "zstd-safe 7.0.0", + "zstd-safe 7.1.0", ] [[package]] @@ -7915,18 +8119,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.0.0" +version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e" +checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.11+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "75652c55c0b6f3e6f12eb786fe1bc960396bf05a1eb3bf1f3691c3610ac2e6d4" dependencies = [ "cc", "pkg-config", @@ -7943,27 +8147,27 @@ dependencies = [ [[package]] name = "zvariant" -version = "3.15.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" dependencies = [ "byteorder", "enumflags2", "libc", - "serde 1.0.190", + "serde 1.0.203", "static_assertions", "zvariant_derive", ] [[package]] name = "zvariant_derive" -version = "3.15.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "syn 1.0.109", "zvariant_utils", ] @@ -7974,7 +8178,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" dependencies = [ - "proc-macro2 1.0.79", - "quote 1.0.35", + "proc-macro2 1.0.86", + "quote 1.0.36", "syn 1.0.109", ] diff --git a/Cargo.toml b/Cargo.toml index 939d5c3596..0c54897e1c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustdesk" -version = "1.2.6" +version = "1.2.7" authors = ["rustdesk "] edition = "2021" build= "build.rs" @@ -89,7 +89,10 @@ sys-locale = "0.3" enigo = { path = "libs/enigo", features = [ "with_serde" ] } clipboard = { path = "libs/clipboard" } ctrlc = "3.2" -arboard = { git = "https://github.com/fufesou/arboard", branch = "feat/x11_set_conn_timeout", features = ["wayland-data-control"] } +# arboard = { version = "3.4.0", features = ["wayland-data-control"] } +arboard = { git = "https://github.com/rustdesk-org/arboard", features = ["wayland-data-control", "image-data"] } +clipboard-master = { git = "https://github.com/rustdesk-org/clipboard-master" } + system_shutdown = "4.0" qrcode-generator = "4.1" diff --git a/appimage/AppImageBuilder-aarch64.yml b/appimage/AppImageBuilder-aarch64.yml index 86364617de..411d7bb571 100644 --- a/appimage/AppImageBuilder-aarch64.yml +++ b/appimage/AppImageBuilder-aarch64.yml @@ -18,7 +18,7 @@ AppDir: id: rustdesk name: rustdesk icon: rustdesk - version: 1.2.6 + version: 1.2.7 exec: usr/lib/rustdesk/rustdesk exec_args: $@ apt: diff --git a/appimage/AppImageBuilder-x86_64.yml b/appimage/AppImageBuilder-x86_64.yml index cce651b6e1..9c6860dd43 100644 --- a/appimage/AppImageBuilder-x86_64.yml +++ b/appimage/AppImageBuilder-x86_64.yml @@ -18,7 +18,7 @@ AppDir: id: rustdesk name: rustdesk icon: rustdesk - version: 1.2.6 + version: 1.2.7 exec: usr/lib/rustdesk/rustdesk exec_args: $@ apt: diff --git a/build.py b/build.py index b8cff66e72..cd0d2a6798 100755 --- a/build.py +++ b/build.py @@ -25,8 +25,8 @@ skip_cargo = False -def get_arch() -> str: - custom_arch = os.environ.get("ARCH") +def get_deb_arch() -> str: + custom_arch = os.environ.get("DEB_ARCH") if custom_arch is None: return "amd64" return custom_arch @@ -294,7 +294,7 @@ def generate_control_file(version): Depends: libgtk-3-0, libxcb-randr0, libxdo3, libxfixes3, libxcb-shape0, libxcb-xfixes0, libasound2, libsystemd0, curl, libva-drm2, libva-x11-2, libvdpau1, libgstreamer-plugins-base1.0-0, libpam0g, libappindicator3-1, gstreamer1.0-pipewire Description: A remote control software. -""" % (version, get_arch()) +""" % (version, get_deb_arch()) file = open(control_file_path, "w") file.write(content) file.close() diff --git a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt index 47c8f302c4..3fcc72df34 100644 --- a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt +++ b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt @@ -18,7 +18,9 @@ import android.widget.EditText import android.view.accessibility.AccessibilityEvent import android.view.ViewGroup.LayoutParams import android.view.accessibility.AccessibilityNodeInfo +import android.view.KeyEvent as KeyEventAndroid import android.graphics.Rect +import android.media.AudioManager import android.accessibilityservice.AccessibilityServiceInfo import android.accessibilityservice.AccessibilityServiceInfo.FLAG_INPUT_METHOD_EDITOR import android.accessibilityservice.AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS @@ -75,6 +77,8 @@ class InputService : AccessibilityService() { private var fakeEditTextForTextStateCalculation: EditText? = null + private val volumeController: VolumeController by lazy { VolumeController(applicationContext.getSystemService(AUDIO_SERVICE) as AudioManager) } + @RequiresApi(Build.VERSION_CODES.N) fun onMouseInput(mask: Int, _x: Int, _y: Int) { val x = max(0, _x) @@ -294,6 +298,18 @@ class InputService : AccessibilityService() { Log.d(logTag, "onKeyEvent $keyEvent textToCommit:$textToCommit") + var ke: KeyEventAndroid? = null + if (Build.VERSION.SDK_INT < 33 || textToCommit == null) { + ke = KeyEventConverter.toAndroidKeyEvent(keyEvent) + } + ke?.let { event -> + if (tryHandleVolumeKeyEvent(event)) { + return + } else if (tryHandlePowerKeyEvent(event)) { + return + } + } + if (Build.VERSION.SDK_INT >= 33) { getInputMethod()?.let { inputMethod -> inputMethod.getCurrentInputConnection()?.let { inputConnection -> @@ -302,7 +318,7 @@ class InputService : AccessibilityService() { inputConnection.commitText(text, 1, null) } } else { - KeyEventConverter.toAndroidKeyEvent(keyEvent).let { event -> + ke?.let { event -> inputConnection.sendKeyEvent(event) } } @@ -311,7 +327,7 @@ class InputService : AccessibilityService() { } else { val handler = Handler(Looper.getMainLooper()) handler.post { - KeyEventConverter.toAndroidKeyEvent(keyEvent)?.let { event -> + ke?.let { event -> val possibleNodes = possibleAccessibiltyNodes() Log.d(logTag, "possibleNodes:$possibleNodes") for (item in possibleNodes) { @@ -325,6 +341,43 @@ class InputService : AccessibilityService() { } } + private fun tryHandleVolumeKeyEvent(event: KeyEventAndroid): Boolean { + when (event.keyCode) { + KeyEventAndroid.KEYCODE_VOLUME_UP -> { + if (event.action == KeyEventAndroid.ACTION_DOWN) { + volumeController.raiseVolume(null, true, AudioManager.STREAM_SYSTEM) + } + return true + } + KeyEventAndroid.KEYCODE_VOLUME_DOWN -> { + if (event.action == KeyEventAndroid.ACTION_DOWN) { + volumeController.lowerVolume(null, true, AudioManager.STREAM_SYSTEM) + } + return true + } + KeyEventAndroid.KEYCODE_VOLUME_MUTE -> { + if (event.action == KeyEventAndroid.ACTION_DOWN) { + volumeController.toggleMute(true, AudioManager.STREAM_SYSTEM) + } + return true + } + else -> { + return false + } + } + } + + private fun tryHandlePowerKeyEvent(event: KeyEventAndroid): Boolean { + if (event.keyCode == KeyEventAndroid.KEYCODE_POWER) { + // Perform power dialog action when action is up + if (event.action == KeyEventAndroid.ACTION_UP) { + performGlobalAction(GLOBAL_ACTION_POWER_DIALOG); + } + return true + } + return false + } + private fun insertAccessibilityNode(list: LinkedList, node: AccessibilityNodeInfo) { if (node == null) { return @@ -422,7 +475,7 @@ class InputService : AccessibilityService() { return linkedList } - private fun trySendKeyEvent(event: android.view.KeyEvent, node: AccessibilityNodeInfo, textToCommit: String?): Boolean { + private fun trySendKeyEvent(event: KeyEventAndroid, node: AccessibilityNodeInfo, textToCommit: String?): Boolean { node.refresh() this.fakeEditTextForTextStateCalculation?.setSelection(0,0) this.fakeEditTextForTextStateCalculation?.setText(null) @@ -487,10 +540,10 @@ class InputService : AccessibilityService() { it.layout(rect.left, rect.top, rect.right, rect.bottom) it.onPreDraw() - if (event.action == android.view.KeyEvent.ACTION_DOWN) { + if (event.action == KeyEventAndroid.ACTION_DOWN) { val succ = it.onKeyDown(event.getKeyCode(), event) Log.d(logTag, "onKeyDown $succ") - } else if (event.action == android.view.KeyEvent.ACTION_UP) { + } else if (event.action == KeyEventAndroid.ACTION_UP) { val success = it.onKeyUp(event.getKeyCode(), event) Log.d(logTag, "keyup $success") } else {} diff --git a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/KeyboardKeyEventMapper.kt b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/KeyboardKeyEventMapper.kt index effa3b2aa3..1e63df4054 100644 --- a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/KeyboardKeyEventMapper.kt +++ b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/KeyboardKeyEventMapper.kt @@ -37,6 +37,8 @@ object KeyEventConverter { action = KeyEvent.ACTION_UP } + // FIXME: The last parameter is the repeat count, not modifiers ? + // https://developer.android.com/reference/android/view/KeyEvent#KeyEvent(long,%20long,%20int,%20int,%20int) return KeyEvent(0, 0, action, chrValue, 0, modifiers) } @@ -112,6 +114,10 @@ object KeyEventConverter { ControlKey.Delete -> KeyEvent.KEYCODE_FORWARD_DEL ControlKey.Clear -> KeyEvent.KEYCODE_CLEAR ControlKey.Pause -> KeyEvent.KEYCODE_BREAK + ControlKey.VolumeMute -> KeyEvent.KEYCODE_VOLUME_MUTE + ControlKey.VolumeUp -> KeyEvent.KEYCODE_VOLUME_UP + ControlKey.VolumeDown -> KeyEvent.KEYCODE_VOLUME_DOWN + ControlKey.Power -> KeyEvent.KEYCODE_POWER else -> 0 // Default to unknown. } } diff --git a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/VolumeController.kt b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/VolumeController.kt new file mode 100644 index 0000000000..be30b653e0 --- /dev/null +++ b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/VolumeController.kt @@ -0,0 +1,78 @@ +package com.carriez.flutter_hbb + +// Inspired by https://github.com/yosemiteyss/flutter_volume_controller/blob/main/android/src/main/kotlin/com/yosemiteyss/flutter_volume_controller/VolumeController.kt + +import android.media.AudioManager +import android.os.Build +import android.util.Log + +class VolumeController(private val audioManager: AudioManager) { + private val logTag = "volume controller" + + fun getVolume(streamType: Int): Double { + val current = audioManager.getStreamVolume(streamType) + val max = audioManager.getStreamMaxVolume(streamType) + return current.toDouble() / max + } + + fun setVolume(volume: Double, showSystemUI: Boolean, streamType: Int) { + val max = audioManager.getStreamMaxVolume(streamType) + audioManager.setStreamVolume( + streamType, + (max * volume).toInt(), + if (showSystemUI) AudioManager.FLAG_SHOW_UI else 0 + ) + } + + fun raiseVolume(step: Double?, showSystemUI: Boolean, streamType: Int) { + if (step == null) { + audioManager.adjustStreamVolume( + streamType, + AudioManager.ADJUST_RAISE, + if (showSystemUI) AudioManager.FLAG_SHOW_UI else 0 + ) + } else { + val target = getVolume(streamType) + step + setVolume(target, showSystemUI, streamType) + } + } + + fun lowerVolume(step: Double?, showSystemUI: Boolean, streamType: Int) { + if (step == null) { + audioManager.adjustStreamVolume( + streamType, + AudioManager.ADJUST_LOWER, + if (showSystemUI) AudioManager.FLAG_SHOW_UI else 0 + ) + } else { + val target = getVolume(streamType) - step + setVolume(target, showSystemUI, streamType) + } + } + + fun getMute(streamType: Int): Boolean { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + audioManager.isStreamMute(streamType) + } else { + audioManager.getStreamVolume(streamType) == 0 + } + } + + private fun setMute(isMuted: Boolean, showSystemUI: Boolean, streamType: Int) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + audioManager.adjustStreamVolume( + streamType, + if (isMuted) AudioManager.ADJUST_MUTE else AudioManager.ADJUST_UNMUTE, + if (showSystemUI) AudioManager.FLAG_SHOW_UI else 0 + ) + } else { + audioManager.setStreamMute(streamType, isMuted) + } + } + + fun toggleMute(showSystemUI: Boolean, streamType: Int) { + val isMuted = getMute(streamType) + setMute(!isMuted, showSystemUI, streamType) + } +} + diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index cf5c4d1617..5c92752138 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -928,13 +928,9 @@ makeMobileActionsOverlayEntry(VoidCallback? onHide, {FFI? ffi}) { position: draggablePositions.mobileActions, width: overlayW, height: overlayH, - onBackPressed: () => session.inputModel.tap(MouseButtons.right), - onHomePressed: () => session.inputModel.tap(MouseButtons.wheel), - onRecentPressed: () async { - session.inputModel.sendMouse('down', MouseButtons.wheel); - await Future.delayed(const Duration(milliseconds: 500)); - session.inputModel.sendMouse('up', MouseButtons.wheel); - }, + onBackPressed: session.inputModel.onMobileBack, + onHomePressed: session.inputModel.onMobileHome, + onRecentPressed: session.inputModel.onMobileApps, onHidePressed: onHide, ); } @@ -1432,7 +1428,7 @@ Future initGlobalFFI() async { _globalFFI = FFI(null); debugPrint("_globalFFI init end"); // after `put`, can also be globally found by Get.find(); - Get.put(_globalFFI, permanent: true); + Get.put(_globalFFI, permanent: true); } String translate(String name) { diff --git a/flutter/lib/common/shared_state.dart b/flutter/lib/common/shared_state.dart index bd95f1db94..908c98a70e 100644 --- a/flutter/lib/common/shared_state.dart +++ b/flutter/lib/common/shared_state.dart @@ -10,16 +10,16 @@ class PrivacyModeState { static void init(String id) { final key = tag(id); - if (!Get.isRegistered(tag: key)) { + if (!Get.isRegistered(tag: key)) { final RxString state = ''.obs; - Get.put(state, tag: key); + Get.put(state, tag: key); } } static void delete(String id) { final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); + if (Get.isRegistered(tag: key)) { + Get.delete(tag: key); } else { Get.find(tag: key).value = ''; } @@ -33,9 +33,9 @@ class BlockInputState { static void init(String id) { final key = tag(id); - if (!Get.isRegistered(tag: key)) { + if (!Get.isRegistered(tag: key)) { final RxBool state = false.obs; - Get.put(state, tag: key); + Get.put(state, tag: key); } else { Get.find(tag: key).value = false; } @@ -43,8 +43,8 @@ class BlockInputState { static void delete(String id) { final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); + if (Get.isRegistered(tag: key)) { + Get.delete(tag: key); } } @@ -56,9 +56,9 @@ class CurrentDisplayState { static void init(String id) { final key = tag(id); - if (!Get.isRegistered(tag: key)) { + if (!Get.isRegistered(tag: key)) { final RxInt state = RxInt(0); - Get.put(state, tag: key); + Get.put(state, tag: key); } else { Get.find(tag: key).value = 0; } @@ -66,8 +66,8 @@ class CurrentDisplayState { static void delete(String id) { final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); + if (Get.isRegistered(tag: key)) { + Get.delete(tag: key); } } @@ -105,16 +105,16 @@ class ConnectionTypeState { static void init(String id) { final key = tag(id); - if (!Get.isRegistered(tag: key)) { + if (!Get.isRegistered(tag: key)) { final ConnectionType collectionType = ConnectionType(); - Get.put(collectionType, tag: key); + Get.put(collectionType, tag: key); } } static void delete(String id) { final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); + if (Get.isRegistered(tag: key)) { + Get.delete(tag: key); } } @@ -127,9 +127,9 @@ class FingerprintState { static void init(String id) { final key = tag(id); - if (!Get.isRegistered(tag: key)) { + if (!Get.isRegistered(tag: key)) { final RxString state = ''.obs; - Get.put(state, tag: key); + Get.put(state, tag: key); } else { Get.find(tag: key).value = ''; } @@ -137,8 +137,8 @@ class FingerprintState { static void delete(String id) { final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); + if (Get.isRegistered(tag: key)) { + Get.delete(tag: key); } } @@ -150,9 +150,9 @@ class ShowRemoteCursorState { static void init(String id) { final key = tag(id); - if (!Get.isRegistered(tag: key)) { + if (!Get.isRegistered(tag: key)) { final RxBool state = false.obs; - Get.put(state, tag: key); + Get.put(state, tag: key); } else { Get.find(tag: key).value = false; } @@ -160,8 +160,8 @@ class ShowRemoteCursorState { static void delete(String id) { final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); + if (Get.isRegistered(tag: key)) { + Get.delete(tag: key); } } @@ -173,9 +173,9 @@ class ShowRemoteCursorLockState { static void init(String id) { final key = tag(id); - if (!Get.isRegistered(tag: key)) { + if (!Get.isRegistered(tag: key)) { final RxBool state = false.obs; - Get.put(state, tag: key); + Get.put(state, tag: key); } else { Get.find(tag: key).value = false; } @@ -183,8 +183,8 @@ class ShowRemoteCursorLockState { static void delete(String id) { final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); + if (Get.isRegistered(tag: key)) { + Get.delete(tag: key); } } @@ -196,10 +196,10 @@ class KeyboardEnabledState { static void init(String id) { final key = tag(id); - if (!Get.isRegistered(tag: key)) { + if (!Get.isRegistered(tag: key)) { // Server side, default true final RxBool state = true.obs; - Get.put(state, tag: key); + Get.put(state, tag: key); } else { Get.find(tag: key).value = true; } @@ -207,8 +207,8 @@ class KeyboardEnabledState { static void delete(String id) { final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); + if (Get.isRegistered(tag: key)) { + Get.delete(tag: key); } } @@ -220,9 +220,9 @@ class RemoteCursorMovedState { static void init(String id) { final key = tag(id); - if (!Get.isRegistered(tag: key)) { + if (!Get.isRegistered(tag: key)) { final RxBool state = false.obs; - Get.put(state, tag: key); + Get.put(state, tag: key); } else { Get.find(tag: key).value = false; } @@ -230,8 +230,8 @@ class RemoteCursorMovedState { static void delete(String id) { final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); + if (Get.isRegistered(tag: key)) { + Get.delete(tag: key); } } @@ -243,9 +243,9 @@ class RemoteCountState { static void init() { final key = tag(); - if (!Get.isRegistered(tag: key)) { + if (!Get.isRegistered(tag: key)) { final RxInt state = 1.obs; - Get.put(state, tag: key); + Get.put(state, tag: key); } else { Get.find(tag: key).value = 1; } @@ -253,8 +253,8 @@ class RemoteCountState { static void delete() { final key = tag(); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); + if (Get.isRegistered(tag: key)) { + Get.delete(tag: key); } } @@ -266,9 +266,9 @@ class PeerBoolOption { static void init(String id, String opt, bool Function() init_getter) { final key = tag(id, opt); - if (!Get.isRegistered(tag: key)) { + if (!Get.isRegistered(tag: key)) { final RxBool value = RxBool(init_getter()); - Get.put(value, tag: key); + Get.put(value, tag: key); } else { Get.find(tag: key).value = init_getter(); } @@ -276,8 +276,8 @@ class PeerBoolOption { static void delete(String id, String opt) { final key = tag(id, opt); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); + if (Get.isRegistered(tag: key)) { + Get.delete(tag: key); } } @@ -290,9 +290,9 @@ class PeerStringOption { static void init(String id, String opt, String Function() init_getter) { final key = tag(id, opt); - if (!Get.isRegistered(tag: key)) { + if (!Get.isRegistered(tag: key)) { final RxString value = RxString(init_getter()); - Get.put(value, tag: key); + Get.put(value, tag: key); } else { Get.find(tag: key).value = init_getter(); } @@ -300,8 +300,8 @@ class PeerStringOption { static void delete(String id, String opt) { final key = tag(id, opt); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); + if (Get.isRegistered(tag: key)) { + Get.delete(tag: key); } } @@ -314,9 +314,9 @@ class UnreadChatCountState { static void init(String id) { final key = tag(id); - if (!Get.isRegistered(tag: key)) { + if (!Get.isRegistered(tag: key)) { final RxInt state = RxInt(0); - Get.put(state, tag: key); + Get.put(state, tag: key); } else { Get.find(tag: key).value = 0; } @@ -324,8 +324,8 @@ class UnreadChatCountState { static void delete(String id) { final key = tag(id); - if (Get.isRegistered(tag: key)) { - Get.delete(tag: key); + if (Get.isRegistered(tag: key)) { + Get.delete(tag: key); } } diff --git a/flutter/lib/common/widgets/dialog.dart b/flutter/lib/common/widgets/dialog.dart index 1b4839dfc8..f140a68b07 100644 --- a/flutter/lib/common/widgets/dialog.dart +++ b/flutter/lib/common/widgets/dialog.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_hbb/common/shared_state.dart'; import 'package:flutter_hbb/common/widgets/setting_widgets.dart'; import 'package:flutter_hbb/consts.dart'; @@ -218,50 +219,53 @@ void changeWhiteList({Function()? callback}) async { ), actions: [ dialogButton("Cancel", onPressed: close, isOutline: true), - if (!isOptFixed)dialogButton("Clear", onPressed: () async { - await bind.mainSetOption( - key: kOptionWhitelist, value: defaultOptionWhitelist); - callback?.call(); - close(); - }, isOutline: true), - if (!isOptFixed) dialogButton( - "OK", - onPressed: () async { - setState(() { - msg = ""; - isInProgress = true; - }); - newWhiteListField = controller.text.trim(); - var newWhiteList = ""; - if (newWhiteListField.isEmpty) { - // pass - } else { - final ips = newWhiteListField.trim().split(RegExp(r"[\s,;\n]+")); - // test ip - final ipMatch = RegExp( - r"^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)(\/([1-9]|[1-2][0-9]|3[0-2])){0,1}$"); - final ipv6Match = RegExp( - r"^(((?:[0-9A-Fa-f]{1,4}))*((?::[0-9A-Fa-f]{1,4}))*::((?:[0-9A-Fa-f]{1,4}))*((?::[0-9A-Fa-f]{1,4}))*|((?:[0-9A-Fa-f]{1,4}))((?::[0-9A-Fa-f]{1,4})){7})(\/([1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8])){0,1}$"); - for (final ip in ips) { - if (!ipMatch.hasMatch(ip) && !ipv6Match.hasMatch(ip)) { - msg = "${translate("Invalid IP")} $ip"; - setState(() { - isInProgress = false; - }); - return; - } - } - newWhiteList = ips.join(','); - } - if (newWhiteList.trim().isEmpty) { - newWhiteList = defaultOptionWhitelist; - } + if (!isOptFixed) + dialogButton("Clear", onPressed: () async { await bind.mainSetOption( - key: kOptionWhitelist, value: newWhiteList); + key: kOptionWhitelist, value: defaultOptionWhitelist); callback?.call(); close(); - }, - ), + }, isOutline: true), + if (!isOptFixed) + dialogButton( + "OK", + onPressed: () async { + setState(() { + msg = ""; + isInProgress = true; + }); + newWhiteListField = controller.text.trim(); + var newWhiteList = ""; + if (newWhiteListField.isEmpty) { + // pass + } else { + final ips = + newWhiteListField.trim().split(RegExp(r"[\s,;\n]+")); + // test ip + final ipMatch = RegExp( + r"^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)(\/([1-9]|[1-2][0-9]|3[0-2])){0,1}$"); + final ipv6Match = RegExp( + r"^(((?:[0-9A-Fa-f]{1,4}))*((?::[0-9A-Fa-f]{1,4}))*::((?:[0-9A-Fa-f]{1,4}))*((?::[0-9A-Fa-f]{1,4}))*|((?:[0-9A-Fa-f]{1,4}))((?::[0-9A-Fa-f]{1,4})){7})(\/([1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8])){0,1}$"); + for (final ip in ips) { + if (!ipMatch.hasMatch(ip) && !ipv6Match.hasMatch(ip)) { + msg = "${translate("Invalid IP")} $ip"; + setState(() { + isInProgress = false; + }); + return; + } + } + newWhiteList = ips.join(','); + } + if (newWhiteList.trim().isEmpty) { + newWhiteList = defaultOptionWhitelist; + } + await bind.mainSetOption( + key: kOptionWhitelist, value: newWhiteList); + callback?.call(); + close(); + }, + ), ], onCancel: close, ); @@ -1762,6 +1766,66 @@ void renameDialog( }); } +void changeBot({Function()? callback}) async { + if (bind.mainHasValidBotSync()) { + await bind.mainSetOption(key: "bot", value: ""); + callback?.call(); + return; + } + String errorText = ''; + bool loading = false; + final controller = TextEditingController(); + gFFI.dialogManager.show((setState, close, context) { + onVerify() async { + final token = controller.text.trim(); + if (token == "") return; + loading = true; + errorText = ''; + setState(() {}); + final error = await bind.mainVerifyBot(token: token); + if (error == "") { + callback?.call(); + close(); + } else { + errorText = translate(error); + loading = false; + setState(() {}); + } + } + + final codeField = TextField( + autofocus: true, + controller: controller, + decoration: InputDecoration( + hintText: translate('Token'), + ), + ); + + return CustomAlertDialog( + title: Text(translate("Telegram bot")), + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SelectableText(translate("enable-bot-desc"), + style: TextStyle(fontSize: 12)) + .marginOnly(bottom: 12), + Row(children: [Expanded(child: codeField)]), + if (errorText != '') + Text(errorText, style: TextStyle(color: Colors.red)) + .marginOnly(top: 12), + ], + ), + actions: [ + dialogButton("Cancel", onPressed: close, isOutline: true), + loading + ? CircularProgressIndicator() + : dialogButton("OK", onPressed: onVerify), + ], + onCancel: close, + ); + }); +} + void change2fa({Function()? callback}) async { if (bind.mainHasValid2FaSync()) { await bind.mainSetOption(key: "2fa", value: ""); @@ -2124,3 +2188,31 @@ void setSharedAbPasswordDialog(String abName, Peer peer) { ); }); } + +void CommonConfirmDialog(OverlayDialogManager dialogManager, String content, + VoidCallback onConfirm) { + dialogManager.show((setState, close, context) { + submit() { + close(); + onConfirm.call(); + } + + return CustomAlertDialog( + content: Row( + children: [ + Expanded( + child: Text(content, + style: const TextStyle(fontSize: 15), + textAlign: TextAlign.start), + ), + ], + ).marginOnly(bottom: 12), + actions: [ + dialogButton(translate("Cancel"), onPressed: close, isOutline: true), + dialogButton(translate("OK"), onPressed: submit), + ], + onSubmit: submit, + onCancel: close, + ); + }); +} diff --git a/flutter/lib/common/widgets/toolbar.dart b/flutter/lib/common/widgets/toolbar.dart index 0c2494c944..2c2da922ab 100644 --- a/flutter/lib/common/widgets/toolbar.dart +++ b/flutter/lib/common/widgets/toolbar.dart @@ -22,6 +22,20 @@ class TTextMenu { required this.onPressed, this.trailingIcon, this.divider = false}); + + Widget getChild() { + if (trailingIcon != null) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + child, + trailingIcon!, + ], + ); + } else { + return child; + } + } } class TRadioMenu { diff --git a/flutter/lib/consts.dart b/flutter/lib/consts.dart index ba93b7fddc..b78d298e5e 100644 --- a/flutter/lib/consts.dart +++ b/flutter/lib/consts.dart @@ -155,6 +155,8 @@ const int kWindowMainId = 0; const String kPointerEventKindTouch = "touch"; const String kPointerEventKindMouse = "mouse"; +const String kKeyFlutterKey = "flutter_key"; + const String kKeyShowDisplaysAsIndividualWindows = 'displays_as_individual_windows'; const String kKeyUseAllMyDisplaysForTheRemoteSession = diff --git a/flutter/lib/desktop/pages/connection_page.dart b/flutter/lib/desktop/pages/connection_page.dart index d1ecc29f8d..797cafcbec 100644 --- a/flutter/lib/desktop/pages/connection_page.dart +++ b/flutter/lib/desktop/pages/connection_page.dart @@ -340,7 +340,7 @@ class _ConnectionPageState extends State ?.merge(TextStyle(height: 1)), ).marginOnly(right: 4), Tooltip( - waitDuration: Duration(milliseconds: 0), + waitDuration: Duration(milliseconds: 300), message: translate("id_input_tip"), child: Icon( Icons.help_outline_outlined, diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart index 54fae3e99f..1f53172a53 100644 --- a/flutter/lib/desktop/pages/desktop_home_page.dart +++ b/flutter/lib/desktop/pages/desktop_home_page.dart @@ -838,7 +838,7 @@ class _DesktopHomePageState extends State } } -void setPasswordDialog() async { +void setPasswordDialog({VoidCallback? notEmptyCallback}) async { final pw = await bind.mainGetPermanentPassword(); final p0 = TextEditingController(text: pw); final p1 = TextEditingController(text: pw); @@ -878,6 +878,9 @@ void setPasswordDialog() async { return; } bind.mainSetPermanentPassword(password: pass); + if (pass.isNotEmpty) { + notEmptyCallback?.call(); + } close(); } diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index bba586f935..37e4f3e9e9 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -84,8 +84,10 @@ class DesktopSettingPage extends StatefulWidget { } if (Get.isRegistered(tag: _kSettingPageControllerTag)) { DesktopTabPage.onAddSetting(initialPage: page); - PageController controller = Get.find(tag: _kSettingPageControllerTag); - Rx selected = Get.find(tag: _kSettingPageTabKeyTag); + PageController controller = + Get.find(tag: _kSettingPageControllerTag); + Rx selected = + Get.find>(tag: _kSettingPageTabKeyTag); selected.value = page; controller.jumpToPage(index); } else { @@ -679,15 +681,24 @@ class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin { // Simple temp wrapper for PR check tmpWrapper() { RxBool has2fa = bind.mainHasValid2FaSync().obs; + RxBool hasBot = bind.mainHasValidBotSync().obs; update() async { has2fa.value = bind.mainHasValid2FaSync(); + setState(() {}); } onChanged(bool? checked) async { - change2fa(callback: update); + if (checked == false) { + CommonConfirmDialog( + gFFI.dialogManager, translate('cancel-2fa-confirm-tip'), () { + change2fa(callback: update); + }); + } else { + change2fa(callback: update); + } } - return GestureDetector( + final tfa = GestureDetector( child: InkWell( child: Obx(() => Row( children: [ @@ -708,6 +719,52 @@ class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin { onChanged(!has2fa.value); }, ).marginOnly(left: _kCheckBoxLeftMargin); + if (!has2fa.value) { + return tfa; + } + updateBot() async { + hasBot.value = bind.mainHasValidBotSync(); + setState(() {}); + } + + onChangedBot(bool? checked) async { + if (checked == false) { + CommonConfirmDialog( + gFFI.dialogManager, translate('cancel-bot-confirm-tip'), () { + changeBot(callback: updateBot); + }); + } else { + changeBot(callback: updateBot); + } + } + + final bot = GestureDetector( + child: Tooltip( + waitDuration: Duration(milliseconds: 300), + message: translate("enable-bot-tip"), + child: InkWell( + child: Obx(() => Row( + children: [ + Checkbox( + value: hasBot.value, + onChanged: enabled ? onChangedBot : null) + .marginOnly(right: 5), + Expanded( + child: Text( + translate('Telegram bot'), + style: TextStyle( + color: disabledTextColor(context, enabled)), + )) + ], + ))), + ), + onTap: () { + onChangedBot(!hasBot.value); + }, + ).marginOnly(left: _kCheckBoxLeftMargin + 30); + return Column( + children: [tfa, bot], + ); } return tmpWrapper(); @@ -832,12 +889,22 @@ class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin { label: value, onChanged: locked ? null - : ((value) { - () async { + : ((value) async { + callback() async { await model.setVerificationMethod( passwordKeys[passwordValues.indexOf(value)]); await model.updatePasswordModel(); - }(); + } + + if (value == + passwordValues[passwordKeys + .indexOf(kUsePermanentPassword)] && + (await bind.mainGetPermanentPassword()) + .isEmpty) { + setPasswordDialog(notEmptyCallback: callback); + } else { + await callback(); + } }), )) .toList(); diff --git a/flutter/lib/desktop/pages/desktop_tab_page.dart b/flutter/lib/desktop/pages/desktop_tab_page.dart index e611aca44f..0f7e77c810 100644 --- a/flutter/lib/desktop/pages/desktop_tab_page.dart +++ b/flutter/lib/desktop/pages/desktop_tab_page.dart @@ -20,7 +20,7 @@ class DesktopTabPage extends StatefulWidget { static void onAddSetting( {SettingsTabKey initialPage = SettingsTabKey.general}) { try { - DesktopTabController tabController = Get.find(); + DesktopTabController tabController = Get.find(); tabController.add(TabInfo( key: kTabLabelSettingPage, label: kTabLabelSettingPage, diff --git a/flutter/lib/desktop/pages/file_manager_page.dart b/flutter/lib/desktop/pages/file_manager_page.dart index c429fa2456..29ab0f8069 100644 --- a/flutter/lib/desktop/pages/file_manager_page.dart +++ b/flutter/lib/desktop/pages/file_manager_page.dart @@ -92,7 +92,7 @@ class _FileManagerPageState extends State _ffi.dialogManager .showLoading(translate('Connecting...'), onCancel: closeConnection); }); - Get.put(_ffi, tag: 'ft_${widget.id}'); + Get.put(_ffi, tag: 'ft_${widget.id}'); if (!isLinux) { WakelockPlus.enable(); } diff --git a/flutter/lib/desktop/pages/port_forward_page.dart b/flutter/lib/desktop/pages/port_forward_page.dart index b9a3248fac..99f8df3409 100644 --- a/flutter/lib/desktop/pages/port_forward_page.dart +++ b/flutter/lib/desktop/pages/port_forward_page.dart @@ -63,7 +63,7 @@ class _PortForwardPageState extends State isSharedPassword: widget.isSharedPassword, forceRelay: widget.forceRelay, isRdp: widget.isRDP); - Get.put(_ffi, tag: 'pf_${widget.id}'); + Get.put(_ffi, tag: 'pf_${widget.id}'); debugPrint("Port forward page init success with id ${widget.id}"); widget.tabController.onSelected?.call(widget.id); } diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index 8427645e2f..4d61c37389 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -107,7 +107,7 @@ class _RemotePageState extends State super.initState(); _initStates(widget.id); _ffi = FFI(widget.sessionId); - Get.put(_ffi, tag: widget.id); + Get.put(_ffi, tag: widget.id); _ffi.imageModel.addCallbackOnFirstImage((String peerId) { showKBLayoutTypeChooserIfNeeded( _ffi.ffiModel.pi.platform, _ffi.dialogManager); diff --git a/flutter/lib/desktop/pages/server_page.dart b/flutter/lib/desktop/pages/server_page.dart index 2ccad8c329..4af54b9af2 100644 --- a/flutter/lib/desktop/pages/server_page.dart +++ b/flutter/lib/desktop/pages/server_page.dart @@ -36,7 +36,7 @@ class _DesktopServerPageState extends State void initState() { gFFI.ffiModel.updateEventListener(gFFI.sessionId, ""); windowManager.addListener(this); - Get.put(tabController); + Get.put(tabController); tabController.onRemoved = (_, id) { onRemoveId(id); }; diff --git a/flutter/lib/desktop/widgets/remote_toolbar.dart b/flutter/lib/desktop/widgets/remote_toolbar.dart index e75d75c233..53df40fedb 100644 --- a/flutter/lib/desktop/widgets/remote_toolbar.dart +++ b/flutter/lib/desktop/widgets/remote_toolbar.dart @@ -6,6 +6,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_hbb/common/widgets/audio_input.dart'; import 'package:flutter_hbb/common/widgets/toolbar.dart'; import 'package:flutter_hbb/models/chat_model.dart'; +import 'package:flutter_hbb/models/input_model.dart'; import 'package:flutter_hbb/models/state_model.dart'; import 'package:flutter_hbb/consts.dart'; import 'package:flutter_hbb/utils/multi_window_manager.dart'; @@ -1741,6 +1742,7 @@ class _KeyboardMenu extends StatelessWidget { viewMode(), Divider(), ...toolbarToggles(), + ...mobileActions(), ]); } @@ -1877,6 +1879,39 @@ class _KeyboardMenu extends StatelessWidget { ffi: ffi, child: Text(translate('View Mode'))); } + + mobileActions() { + if (pi.platform != kPeerPlatformAndroid) return []; + final enabled = versionCmp(pi.version, '1.2.7') >= 0; + if (!enabled) return []; + return [ + Divider(), + MenuButton( + child: Text(translate('Back')), + onPressed: () => ffi.inputModel.onMobileBack(), + ffi: ffi), + MenuButton( + child: Text(translate('Home')), + onPressed: () => ffi.inputModel.onMobileHome(), + ffi: ffi), + MenuButton( + child: Text(translate('Apps')), + onPressed: () => ffi.inputModel.onMobileApps(), + ffi: ffi), + MenuButton( + child: Text(translate('Volume up')), + onPressed: () => ffi.inputModel.onMobileVolumeUp(), + ffi: ffi), + MenuButton( + child: Text(translate('Volume down')), + onPressed: () => ffi.inputModel.onMobileVolumeDown(), + ffi: ffi), + MenuButton( + child: Text(translate('Power')), + onPressed: () => ffi.inputModel.onMobilePower(), + ffi: ffi), + ]; + } } class _ChatMenu extends StatefulWidget { diff --git a/flutter/lib/mobile/pages/remote_page.dart b/flutter/lib/mobile/pages/remote_page.dart index b47c6b132b..cd5743d0b2 100644 --- a/flutter/lib/mobile/pages/remote_page.dart +++ b/flutter/lib/mobile/pages/remote_page.dart @@ -55,6 +55,9 @@ class _RemotePageState extends State { InputModel get inputModel => gFFI.inputModel; SessionID get sessionId => gFFI.sessionId; + final TextEditingController _textController = + TextEditingController(text: initText); + @override void initState() { super.initState(); @@ -145,37 +148,59 @@ class _RemotePageState extends State { setState(() {}); } - // handle mobile virtual keyboard - void handleSoftKeyboardInput(String newValue) { + void _handleIOSSoftKeyboardInput(String newValue) { var oldValue = _value; _value = newValue; - if (isIOS) { - var i = newValue.length - 1; - for (; i >= 0 && newValue[i] != '\1'; --i) {} - var j = oldValue.length - 1; - for (; j >= 0 && oldValue[j] != '\1'; --j) {} - if (i < j) j = i; - newValue = newValue.substring(j + 1); - oldValue = oldValue.substring(j + 1); - var common = 0; - for (; - common < oldValue.length && - common < newValue.length && - newValue[common] == oldValue[common]; - ++common) {} - for (i = 0; i < oldValue.length - common; ++i) { - inputModel.inputKey('VK_BACK'); - } - if (newValue.length > common) { - var s = newValue.substring(common); - if (s.length > 1) { - bind.sessionInputString(sessionId: sessionId, value: s); - } else { - inputChar(s); - } + var i = newValue.length - 1; + for (; i >= 0 && newValue[i] != '\1'; --i) {} + var j = oldValue.length - 1; + for (; j >= 0 && oldValue[j] != '\1'; --j) {} + if (i < j) j = i; + var subNewValue = newValue.substring(j + 1); + var subOldValue = oldValue.substring(j + 1); + + // get common prefix of subNewValue and subOldValue + var common = 0; + for (; + common < subOldValue.length && + common < subNewValue.length && + subNewValue[common] == subOldValue[common]; + ++common) {} + + // get newStr from subNewValue + var newStr = ""; + if (subNewValue.length > common) { + newStr = subNewValue.substring(common); + } + + // Set the value to the old value and early return if is still composing. (1 && 2) + // 1. The composing range is valid + // 2. The new string is shorter than the composing range. + if (_textController.value.isComposingRangeValid) { + final composingLength = _textController.value.composing.end - + _textController.value.composing.start; + if (composingLength > newStr.length) { + _value = oldValue; + return; } - return; } + + // Delete the different part in the old value. + for (i = 0; i < subOldValue.length - common; ++i) { + inputModel.inputKey('VK_BACK'); + } + + // Input the new string. + if (newStr.length > 1) { + bind.sessionInputString(sessionId: sessionId, value: newStr); + } else { + inputChar(newStr); + } + } + + void _handleNonIOSSoftKeyboardInput(String newValue) { + var oldValue = _value; + _value = newValue; if (oldValue.isNotEmpty && newValue.isNotEmpty && oldValue[0] == '\1' && @@ -214,6 +239,15 @@ class _RemotePageState extends State { } } + // handle mobile virtual keyboard + void handleSoftKeyboardInput(String newValue) { + if (isIOS) { + _handleIOSSoftKeyboardInput(newValue); + } else { + _handleNonIOSSoftKeyboardInput(newValue); + } + } + void inputChar(String char) { if (char == '\n') { char = 'VK_RETURN'; @@ -227,6 +261,7 @@ class _RemotePageState extends State { gFFI.invokeMethod("enable_soft_keyboard", true); // destroy first, so that our _value trick can work _value = initText; + _textController.text = _value; setState(() => _showEdit = false); _timer?.cancel(); _timer = Timer(kMobileDelaySoftKeyboard, () { @@ -491,7 +526,7 @@ class _RemotePageState extends State { autofocus: true, focusNode: _mobileFocusNode, maxLines: null, - initialValue: _value, + controller: _textController, // trick way to make backspace work always keyboardType: TextInputType.multiline, onChanged: handleSoftKeyboardInput, @@ -518,29 +553,64 @@ class _RemotePageState extends State { color: MyTheme.canvasColor, child: Stack(children: paints)); } + List _getMobileActionMenus() { + if (gFFI.ffiModel.pi.platform != kPeerPlatformAndroid || + !gFFI.ffiModel.keyboard) { + return []; + } + final enabled = versionCmp(gFFI.ffiModel.pi.version, '1.2.7') >= 0; + if (!enabled) return []; + return [ + TTextMenu( + child: Text(translate('Back')), + onPressed: () => gFFI.inputModel.onMobileBack(), + ), + TTextMenu( + child: Text(translate('Home')), + onPressed: () => gFFI.inputModel.onMobileHome(), + ), + TTextMenu( + child: Text(translate('Apps')), + onPressed: () => gFFI.inputModel.onMobileApps(), + ), + TTextMenu( + child: Text(translate('Volume up')), + onPressed: () => gFFI.inputModel.onMobileVolumeUp(), + ), + TTextMenu( + child: Text(translate('Volume down')), + onPressed: () => gFFI.inputModel.onMobileVolumeDown(), + ), + TTextMenu( + child: Text(translate('Power')), + onPressed: () => gFFI.inputModel.onMobilePower(), + ), + ]; + } + void showActions(String id) async { final size = MediaQuery.of(context).size; final x = 120.0; final y = size.height; + final mobileActionMenus = _getMobileActionMenus(); final menus = toolbarControls(context, id, gFFI); - getChild(TTextMenu menu) { - if (menu.trailingIcon != null) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - menu.child, - menu.trailingIcon!, - ]); - } else { - return menu.child; - } - } - final more = menus - .asMap() - .entries - .map((e) => PopupMenuItem(child: getChild(e.value), value: e.key)) - .toList(); + final List> more = [ + ...mobileActionMenus + .asMap() + .entries + .map((e) => + PopupMenuItem(child: e.value.getChild(), value: e.key)) + .toList(), + if (mobileActionMenus.isNotEmpty) PopupMenuDivider(), + ...menus + .asMap() + .entries + .map((e) => PopupMenuItem( + child: e.value.getChild(), + value: e.key + mobileActionMenus.length)) + .toList(), + ]; () async { var index = await showMenu( context: context, @@ -548,8 +618,12 @@ class _RemotePageState extends State { items: more, elevation: 8, ); - if (index != null && index < menus.length) { - menus[index].onPressed.call(); + if (index != null) { + if (index < mobileActionMenus.length) { + mobileActionMenus[index].onPressed.call(); + } else if (index < mobileActionMenus.length + more.length) { + menus[index - mobileActionMenus.length].onPressed.call(); + } } }(); } @@ -604,23 +678,11 @@ class _RemotePageState extends State { ), onPressVoiceCall), ]; - getChild(TTextMenu menu) { - if (menu.trailingIcon != null) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - menu.child, - menu.trailingIcon!, - ]); - } else { - return menu.child; - } - } final menuItems = menus .asMap() .entries - .map((e) => PopupMenuItem(child: getChild(e.value), value: e.key)) + .map((e) => PopupMenuItem(child: e.value.getChild(), value: e.key)) .toList(); Future.delayed(Duration.zero, () async { final size = MediaQuery.of(context).size; @@ -892,7 +954,7 @@ class CursorPaint extends StatelessWidget { final m = Provider.of(context); final c = Provider.of(context); final adjust = gFFI.cursorModel.adjustForKeyboard(); - var s = c.scale; + final s = c.scale; double hotx = m.hotx; double hoty = m.hoty; if (m.image == null) { @@ -901,12 +963,26 @@ class CursorPaint extends StatelessWidget { hoty = preDefaultCursor.image!.height / 2; } } + + final image = m.image ?? preDefaultCursor.image; + if (image == null) { + return Offstage(); + } + + final minSize = 12.0; + double mins = + minSize / (image.width > image.height ? image.width : image.height); + double factor = 1.0; + if (s < mins) { + factor = s / mins; + } + final s2 = s < mins ? mins : s; return CustomPaint( painter: ImagePainter( - image: m.image ?? preDefaultCursor.image, - x: m.x * s - hotx + c.x, - y: m.y * s - hoty + c.y - adjust, - scale: 1), + image: image, + x: (m.x - hotx) * factor + c.x / s2, + y: (m.y - hoty) * factor + (c.y - adjust) / s2, + scale: s2), ); } } diff --git a/flutter/lib/mobile/pages/server_page.dart b/flutter/lib/mobile/pages/server_page.dart index 02c416b645..3609564ec1 100644 --- a/flutter/lib/mobile/pages/server_page.dart +++ b/flutter/lib/mobile/pages/server_page.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_hbb/desktop/pages/desktop_home_page.dart'; import 'package:flutter_hbb/mobile/widgets/dialog.dart'; import 'package:flutter_hbb/models/chat_model.dart'; import 'package:get/get.dart'; @@ -101,18 +102,27 @@ class ServerPage extends StatefulWidget implements PageShape { ), ]; }, - onSelected: (value) { + onSelected: (value) async { if (value == "changeID") { changeIdDialog(); } else if (value == "setPermanentPassword") { - setPermanentPasswordDialog(gFFI.dialogManager); + setPasswordDialog(); } else if (value == "setTemporaryPasswordLength") { setTemporaryPasswordLengthDialog(gFFI.dialogManager); } else if (value == kUsePermanentPassword || value == kUseTemporaryPassword || value == kUseBothPasswords) { - bind.mainSetOption(key: kOptionVerificationMethod, value: value); - gFFI.serverModel.updatePasswordModel(); + callback() { + bind.mainSetOption(key: kOptionVerificationMethod, value: value); + gFFI.serverModel.updatePasswordModel(); + } + + if (value == kUsePermanentPassword && + (await bind.mainGetPermanentPassword()).isEmpty) { + setPasswordDialog(notEmptyCallback: callback); + } else { + callback(); + } } else if (value.startsWith("AcceptSessionsVia")) { value = value.substring("AcceptSessionsVia".length); if (value == "Password") { diff --git a/flutter/lib/models/input_model.dart b/flutter/lib/models/input_model.dart index f3c53f5587..dde815789a 100644 --- a/flutter/lib/models/input_model.dart +++ b/flutter/lib/models/input_model.dart @@ -1152,4 +1152,27 @@ class InputModel { platformFFI.stopDesktopWebListener(); } } + + void onMobileBack() => tap(MouseButtons.right); + void onMobileHome() => tap(MouseButtons.wheel); + Future onMobileApps() async { + sendMouse('down', MouseButtons.wheel); + await Future.delayed(const Duration(milliseconds: 500)); + sendMouse('up', MouseButtons.wheel); + } + + // Simulate a key press event. + // `usbHidUsage` is the USB HID usage code of the key. + Future tapHidKey(int usbHidUsage) async { + inputRawKey(kKeyFlutterKey, usbHidUsage, 0, true); + await Future.delayed(Duration(milliseconds: 100)); + inputRawKey(kKeyFlutterKey, usbHidUsage, 0, false); + } + + Future onMobileVolumeUp() async => + await tapHidKey(PhysicalKeyboardKey.audioVolumeUp.usbHidUsage); + Future onMobileVolumeDown() async => + await tapHidKey(PhysicalKeyboardKey.audioVolumeDown.usbHidUsage); + Future onMobilePower() async => + await tapHidKey(PhysicalKeyboardKey.power.usbHidUsage); } diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index e1b024f0d4..2346efcc6a 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -195,7 +195,7 @@ class FfiModel with ChangeNotifier { if (desktopType == DesktopType.remote) { KeyboardEnabledState.find(id).value = _permissions['keyboard'] != false; } - debugPrint('$_permissions'); + debugPrint('updatePermission: $_permissions'); notifyListeners(); } @@ -438,20 +438,6 @@ class FfiModel with ChangeNotifier { _handlePortableServiceRunning(String peerId, Map evt) { final running = evt['running'] == 'true'; parent.target?.elevationModel.onPortableServiceRunning(running); - if (running) { - if (pi.primaryDisplay != kInvalidDisplayIndex) { - if (pi.currentDisplay != pi.primaryDisplay) { - // Notify to switch display - msgBox(sessionId, 'custom-nook-nocancel-hasclose-info', 'Prompt', - 'elevated_switch_display_msg', '', parent.target!.dialogManager); - bind.sessionSwitchDisplay( - isDesktop: isDesktop, - sessionId: sessionId, - value: Int32List.fromList([pi.primaryDisplay]), - ); - } - } - } } handleAliasChanged(Map evt) { diff --git a/flutter/lib/models/server_model.dart b/flutter/lib/models/server_model.dart index fc169c9638..b643a7c209 100644 --- a/flutter/lib/models/server_model.dart +++ b/flutter/lib/models/server_model.dart @@ -177,6 +177,11 @@ class ServerModel with ChangeNotifier { await timerCallback(); }); } + + // Initial keyboard status is off on mobile + if (isMobile) { + bind.mainSetOption(key: kOptionEnableKeyboard, value: 'N'); + } } /// 1. check android permission diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index d4d25d0d74..dce598bc4e 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # 1.1.9-1 works for android, but for ios it becomes 1.1.91, need to set it to 1.1.9-a.1 for iOS, will get 1.1.9.1, but iOS store not allow 4 numbers -version: 1.2.6+44 +version: 1.2.7+46 environment: sdk: '^3.1.0' diff --git a/flutter/windows/runner/win32_window.cpp b/flutter/windows/runner/win32_window.cpp index 5c09f65004..2c25f00dd9 100644 --- a/flutter/windows/runner/win32_window.cpp +++ b/flutter/windows/runner/win32_window.cpp @@ -5,6 +5,9 @@ #include "resource.h" +#include // for getenv and _putenv +#include // for strcmp + namespace { constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; @@ -143,6 +146,25 @@ bool Win32Window::CreateAndShow(const std::wstring& title, return OnCreate(); } +static void trySetWindowForeground(HWND window) { + char* value = nullptr; + size_t size = 0; + // Use _dupenv_s to safely get the environment variable + _dupenv_s(&value, &size, "SET_FOREGROUND_WINDOW"); + + if (value != nullptr) { + // Correctly compare the value with "1" + if (strcmp(value, "1") == 0) { + // Clear the environment variable + _putenv("SET_FOREGROUND_WINDOW="); + // Set the window to foreground + SetForegroundWindow(window); + } + // Free the duplicated string + free(value); + } +} + // static LRESULT CALLBACK Win32Window::WndProc(HWND const window, UINT const message, @@ -156,6 +178,7 @@ LRESULT CALLBACK Win32Window::WndProc(HWND const window, auto that = static_cast(window_struct->lpCreateParams); EnableFullDpiSupportIfAvailable(window); that->window_handle_ = window; + trySetWindowForeground(window); } else if (Win32Window* that = GetThisFromHandle(window)) { return that->MessageHandler(window, message, wparam, lparam); } diff --git a/libs/hbb_common/Cargo.toml b/libs/hbb_common/Cargo.toml index 8ae3ebcd57..7aeb437977 100644 --- a/libs/hbb_common/Cargo.toml +++ b/libs/hbb_common/Cargo.toml @@ -58,7 +58,7 @@ tokio-native-tls ="0.3" protobuf-codegen = { version = "3.4" } [target.'cfg(target_os = "windows")'.dependencies] -winapi = { version = "0.3", features = ["winuser", "synchapi", "pdh", "memoryapi"] } +winapi = { version = "0.3", features = ["winuser", "synchapi", "pdh", "memoryapi", "sysinfoapi"] } [target.'cfg(target_os = "macos")'.dependencies] osascript = "0.3" diff --git a/libs/hbb_common/protos/message.proto b/libs/hbb_common/protos/message.proto index 483e12c134..f346a72288 100644 --- a/libs/hbb_common/protos/message.proto +++ b/libs/hbb_common/protos/message.proto @@ -271,6 +271,10 @@ enum ControlKey { RShift = 73; RControl = 74; RAlt = 75; + VolumeMute = 76; // mainly used on mobile devices as controlled side + VolumeUp = 77; + VolumeDown = 78; + Power = 79; // mainly used on mobile devices as controlled side CtrlAltDel = 100; LockScreen = 101; } @@ -314,6 +318,8 @@ message Hash { message Clipboard { bool compress = 1; bytes content = 2; + int32 width = 3; + int32 height = 4; } enum FileType { diff --git a/libs/hbb_common/src/compress.rs b/libs/hbb_common/src/compress.rs index c52dd93a1d..761d916e4f 100644 --- a/libs/hbb_common/src/compress.rs +++ b/libs/hbb_common/src/compress.rs @@ -1,5 +1,5 @@ use std::{cell::RefCell, io}; -use zstd::bulk::{Compressor, Decompressor}; +use zstd::bulk::Compressor; // The library supports regular compression levels from 1 up to ZSTD_maxCLevel(), // which is currently 22. Levels >= 20 @@ -7,7 +7,6 @@ use zstd::bulk::{Compressor, Decompressor}; // value 0 means default, which is controlled by ZSTD_CLEVEL_DEFAULT thread_local! { static COMPRESSOR: RefCell>> = RefCell::new(Compressor::new(crate::config::COMPRESS_LEVEL)); - static DECOMPRESSOR: RefCell>> = RefCell::new(Decompressor::new()); } pub fn compress(data: &[u8]) -> Vec { @@ -31,27 +30,5 @@ pub fn compress(data: &[u8]) -> Vec { } pub fn decompress(data: &[u8]) -> Vec { - let mut out = Vec::new(); - DECOMPRESSOR.with(|d| { - if let Ok(mut d) = d.try_borrow_mut() { - match &mut *d { - Ok(d) => { - const MAX: usize = 1024 * 1024 * 64; - const MIN: usize = 1024 * 1024; - let mut n = 30 * data.len(); - n = n.clamp(MIN, MAX); - match d.decompress(data, n) { - Ok(res) => out = res, - Err(err) => { - crate::log::debug!("Failed to decompress: {}", err); - } - } - } - Err(err) => { - crate::log::debug!("Failed to get decompressor: {}", err); - } - } - } - }); - out + zstd::decode_all(data).unwrap_or_default() } diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index e1649ddd7b..711d5af37d 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -487,7 +487,19 @@ pub fn load_path(path: PathBuf, cfg: T) -> crate::ResultType<()> { - Ok(confy::store_path(path, cfg)?) + #[cfg(not(windows))] + { + use std::os::unix::fs::PermissionsExt; + Ok(confy::store_path_perms( + path, + cfg, + fs::Permissions::from_mode(0o600), + )?) + } + #[cfg(windows)] + { + Ok(confy::store_path(path, cfg)?) + } } impl Config { @@ -2471,4 +2483,26 @@ mod tests { assert_eq!(cfg, Ok(cfg_to_compare), "Failed to test wrong_field_str"); } } + + #[test] + fn test_store_load() { + let peerconfig_id = "123456789"; + let cfg: PeerConfig = Default::default(); + cfg.store(&peerconfig_id); + assert_eq!(PeerConfig::load(&peerconfig_id), cfg); + + #[cfg(not(windows))] + { + use std::os::unix::fs::PermissionsExt; + assert_eq!( + // ignore file type information by masking with 0o777 (see https://stackoverflow.com/a/50045872) + fs::metadata(PeerConfig::path(&peerconfig_id)) + .expect("reading metadata failed") + .permissions() + .mode() + & 0o777, + 0o600 + ); + } + } } diff --git a/libs/hbb_common/src/platform/windows.rs b/libs/hbb_common/src/platform/windows.rs index c36c384d3a..7481631ace 100644 --- a/libs/hbb_common/src/platform/windows.rs +++ b/libs/hbb_common/src/platform/windows.rs @@ -1,6 +1,5 @@ use std::{ collections::VecDeque, - os::windows::raw::HANDLE, sync::{Arc, Mutex}, time::Instant, }; @@ -17,7 +16,7 @@ use winapi::{ sysinfoapi::VerSetConditionMask, winbase::{VerifyVersionInfoW, INFINITE, WAIT_OBJECT_0}, winnt::{ - OSVERSIONINFOEXW, VER_BUILDNUMBER, VER_GREATER_EQUAL, VER_MAJORVERSION, + HANDLE, OSVERSIONINFOEXW, VER_BUILDNUMBER, VER_GREATER_EQUAL, VER_MAJORVERSION, VER_MINORVERSION, VER_SERVICEPACKMAJOR, VER_SERVICEPACKMINOR, }, }, diff --git a/libs/portable/Cargo.toml b/libs/portable/Cargo.toml index e39762a303..e39212bf28 100644 --- a/libs/portable/Cargo.toml +++ b/libs/portable/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustdesk-portable-packer" -version = "1.2.6" +version = "1.2.7" edition = "2021" description = "RustDesk Remote Desktop" @@ -14,6 +14,9 @@ dirs = "5.0" md5 = "0.7" winapi = { version = "0.3", features = ["winbase"] } +[target.'cfg(target_os = "windows")'.dependencies] +native-windows-gui = {version = "1.0", default-features = false, features = ["animation-timer", "image-decoder"]} + [package.metadata.winres] LegalCopyright = "Copyright © 2024 Purslane Ltd. All rights reserved." ProductName = "RustDesk" diff --git a/libs/portable/src/main.rs b/libs/portable/src/main.rs index 1ffc8aa5dc..7b68d821c8 100644 --- a/libs/portable/src/main.rs +++ b/libs/portable/src/main.rs @@ -8,6 +8,8 @@ use std::{ use bin_reader::BinaryReader; pub mod bin_reader; +#[cfg(windows)] +mod ui; #[cfg(windows)] const APP_METADATA: &[u8] = include_bytes!("../app_metadata.toml"); @@ -17,6 +19,8 @@ const APP_METADATA_CONFIG: &str = "meta.toml"; const META_LINE_PREFIX_TIMESTAMP: &str = "timestamp = "; const APP_PREFIX: &str = "rustdesk"; const APPNAME_RUNTIME_ENV_KEY: &str = "RUSTDESK_APPNAME"; +#[cfg(windows)] +const SET_FOREGROUND_WINDOW_ENV_KEY: &str = "SET_FOREGROUND_WINDOW"; fn is_timestamp_matches(dir: &PathBuf, ts: &mut u64) -> bool { let Ok(app_metadata) = std::str::from_utf8(APP_METADATA) else { @@ -55,7 +59,13 @@ fn write_meta(dir: &PathBuf, ts: u64) { } } -fn setup(reader: BinaryReader, dir: Option, clear: bool) -> Option { +fn setup( + reader: BinaryReader, + dir: Option, + clear: bool, + _args: &Vec, + _ui: &mut bool, +) -> Option { let dir = if let Some(dir) = dir { dir } else { @@ -70,6 +80,11 @@ fn setup(reader: BinaryReader, dir: Option, clear: bool) -> Option, clear: bool) -> Option) { +fn execute(path: PathBuf, args: Vec, _ui: bool) { println!("executing {}", path.display()); // setup env let exe = std::env::current_exe().unwrap_or_default(); @@ -95,13 +110,28 @@ fn execute(path: PathBuf, args: Vec) { { use std::os::windows::process::CommandExt; cmd.creation_flags(winapi::um::winbase::CREATE_NO_WINDOW); + if _ui { + cmd.env(SET_FOREGROUND_WINDOW_ENV_KEY, "1"); + } } - cmd.env(APPNAME_RUNTIME_ENV_KEY, exe_name) + let _child = cmd + .env(APPNAME_RUNTIME_ENV_KEY, exe_name) .stdin(Stdio::inherit()) .stdout(Stdio::inherit()) .stderr(Stdio::inherit()) - .spawn() - .ok(); + .spawn(); + + #[cfg(windows)] + if _ui { + match _child { + Ok(child) => unsafe { + winapi::um::winuser::AllowSetForegroundWindow(child.id() as u32); + }, + Err(e) => { + eprintln!("{:?}", e); + } + } + } } fn main() { @@ -119,18 +149,21 @@ fn main() { let click_setup = args.is_empty() && arg_exe.to_lowercase().ends_with("install.exe"); let quick_support = args.is_empty() && arg_exe.to_lowercase().ends_with("qs.exe"); + let mut ui = false; let reader = BinaryReader::default(); if let Some(exe) = setup( reader, None, click_setup || args.contains(&"--silent-install".to_owned()), + &args, + &mut ui, ) { if click_setup { args = vec!["--install".to_owned()]; } else if quick_support { args = vec!["--quick_support".to_owned()]; } - execute(exe, args); + execute(exe, args, ui); } } diff --git a/libs/portable/src/res/label.png b/libs/portable/src/res/label.png new file mode 100644 index 0000000000..6876c7935a Binary files /dev/null and b/libs/portable/src/res/label.png differ diff --git a/libs/portable/src/res/spin.gif b/libs/portable/src/res/spin.gif new file mode 100644 index 0000000000..44b2e2e62c Binary files /dev/null and b/libs/portable/src/res/spin.gif differ diff --git a/libs/portable/src/ui.rs b/libs/portable/src/ui.rs new file mode 100644 index 0000000000..0a015a2486 --- /dev/null +++ b/libs/portable/src/ui.rs @@ -0,0 +1,232 @@ +use native_windows_gui as nwg; +use nwg::NativeUi; +use std::cell::RefCell; + +const GIF_DATA: &[u8] = include_bytes!("./res/spin.gif"); +const LABEL_DATA: &[u8] = include_bytes!("./res/label.png"); +const GIF_SIZE: i32 = 32; +const BG_COLOR: [u8; 3] = [90, 90, 120]; +const BORDER_COLOR: [u8; 3] = [40, 40, 40]; +const GIF_DELAY: u64 = 30; + +#[derive(Default)] +pub struct BasicApp { + window: nwg::Window, + + border_image: nwg::ImageFrame, + bg_image: nwg::ImageFrame, + gif_image: nwg::ImageFrame, + label_image: nwg::ImageFrame, + + border_layout: nwg::GridLayout, + bg_layout: nwg::GridLayout, + inner_layout: nwg::GridLayout, + + timer: nwg::AnimationTimer, + decoder: nwg::ImageDecoder, + gif_index: RefCell, + gif_images: RefCell>, +} + +impl BasicApp { + fn exit(&self) { + self.timer.stop(); + nwg::stop_thread_dispatch(); + } + + fn load_gif(&self) -> Result<(), nwg::NwgError> { + let image_source = self.decoder.from_stream(GIF_DATA)?; + for frame_index in 0..image_source.frame_count() { + let image_data = image_source.frame(frame_index)?; + let image_data = self + .decoder + .resize_image(&image_data, [GIF_SIZE as u32, GIF_SIZE as u32])?; + let bmp = image_data.as_bitmap()?; + self.gif_images.borrow_mut().push(bmp); + } + Ok(()) + } + + fn update_gif(&self) -> Result<(), nwg::NwgError> { + let images = self.gif_images.borrow(); + if images.len() == 0 { + return Err(nwg::NwgError::ImageDecoderError( + -1, + "no gif images".to_string(), + )); + } + let image_index = *self.gif_index.borrow() % images.len(); + self.gif_image.set_bitmap(Some(&images[image_index])); + *self.gif_index.borrow_mut() = (image_index + 1) % images.len(); + Ok(()) + } + + fn start_timer(&self) { + self.timer.start(); + } +} + +mod basic_app_ui { + use super::*; + use native_windows_gui::{self as nwg, Bitmap}; + use nwg::{Event, GridLayoutItem}; + use std::cell::RefCell; + use std::ops::Deref; + use std::rc::Rc; + + pub struct BasicAppUi { + inner: Rc, + default_handler: RefCell>, + } + + impl nwg::NativeUi for BasicApp { + fn build_ui(mut data: BasicApp) -> Result { + data.decoder = nwg::ImageDecoder::new()?; + let col_cnt: i32 = 7; + let row_cnt: i32 = 3; + let border_width: i32 = 1; + let window_size = ( + GIF_SIZE * col_cnt + 2 * border_width, + GIF_SIZE * row_cnt + 2 * border_width, + ); + + // Controls + nwg::Window::builder() + .flags(nwg::WindowFlags::POPUP | nwg::WindowFlags::VISIBLE) + .size(window_size) + .center(true) + .build(&mut data.window)?; + + nwg::ImageFrame::builder() + .parent(&data.window) + .size(window_size) + .background_color(Some(BORDER_COLOR)) + .build(&mut data.border_image)?; + + nwg::ImageFrame::builder() + .parent(&data.border_image) + .size((row_cnt * GIF_SIZE, col_cnt * GIF_SIZE)) + .background_color(Some(BG_COLOR)) + .build(&mut data.bg_image)?; + + nwg::ImageFrame::builder() + .parent(&data.bg_image) + .size((GIF_SIZE, GIF_SIZE)) + .background_color(Some(BG_COLOR)) + .build(&mut data.gif_image)?; + + nwg::ImageFrame::builder() + .parent(&data.bg_image) + .background_color(Some(BG_COLOR)) + .bitmap(Some(&Bitmap::from_bin(LABEL_DATA)?)) + .build(&mut data.label_image)?; + + nwg::AnimationTimer::builder() + .parent(&data.window) + .interval(std::time::Duration::from_millis(GIF_DELAY)) + .build(&mut data.timer)?; + + // Wrap-up + let ui = BasicAppUi { + inner: Rc::new(data), + default_handler: Default::default(), + }; + + // Layouts + nwg::GridLayout::builder() + .parent(&ui.window) + .spacing(0) + .margin([0, 0, 0, 0]) + .max_column(Some(1)) + .max_row(Some(1)) + .child_item(GridLayoutItem::new(&ui.border_image, 0, 0, 1, 1)) + .build(&ui.border_layout)?; + + nwg::GridLayout::builder() + .parent(&ui.border_image) + .spacing(0) + .margin([ + border_width as _, + border_width as _, + border_width as _, + border_width as _, + ]) + .max_column(Some(1)) + .max_row(Some(1)) + .child_item(GridLayoutItem::new(&ui.bg_image, 0, 0, 1, 1)) + .build(&ui.bg_layout)?; + + nwg::GridLayout::builder() + .parent(&ui.bg_image) + .spacing(0) + .margin([0, 0, 0, 0]) + .max_column(Some(col_cnt as _)) + .max_row(Some(row_cnt as _)) + .child_item(GridLayoutItem::new(&ui.gif_image, 2, 1, 1, 1)) + .child_item(GridLayoutItem::new(&ui.label_image, 3, 1, 3, 1)) + .build(&ui.inner_layout)?; + + // Events + let evt_ui = Rc::downgrade(&ui.inner); + let handle_events = move |evt, _evt_data, _handle| { + if let Some(evt_ui) = evt_ui.upgrade().as_mut() { + match evt { + Event::OnWindowClose => { + evt_ui.exit(); + } + Event::OnTimerTick => { + if let Err(e) = evt_ui.update_gif() { + eprintln!("{:?}", e); + } + } + _ => {} + } + } + }; + + ui.default_handler + .borrow_mut() + .push(nwg::full_bind_event_handler( + &ui.window.handle, + handle_events, + )); + + return Ok(ui); + } + } + + impl Drop for BasicAppUi { + /// To make sure that everything is freed without issues, the default handler must be unbound. + fn drop(&mut self) { + let mut handlers = self.default_handler.borrow_mut(); + for handler in handlers.drain(0..) { + nwg::unbind_event_handler(&handler); + } + } + } + + impl Deref for BasicAppUi { + type Target = BasicApp; + + fn deref(&self) -> &BasicApp { + &self.inner + } + } +} + +fn ui() -> Result<(), nwg::NwgError> { + nwg::init()?; + let app = BasicApp::build_ui(Default::default())?; + app.load_gif()?; + app.start_timer(); + nwg::dispatch_thread_events(); + Ok(()) +} + +pub fn setup() { + std::thread::spawn(move || { + if let Err(e) = ui() { + eprintln!("{:?}", e); + } + }); +} diff --git a/libs/scrap/src/common/codec.rs b/libs/scrap/src/common/codec.rs index 9fbcae2cde..4ef69181ed 100644 --- a/libs/scrap/src/common/codec.rs +++ b/libs/scrap/src/common/codec.rs @@ -21,7 +21,7 @@ use crate::{ use hbb_common::{ anyhow::anyhow, bail, - config::{keys::OPTION_ENABLE_HWCODEC, option2bool, Config, PeerConfig}, + config::{option2bool, Config, PeerConfig}, lazy_static, log, message_proto::{ supported_decoding::PreferCodec, video_frame, Chroma, CodecAbility, EncodedVideoFrames, @@ -836,6 +836,8 @@ impl Decoder { #[cfg(any(feature = "hwcodec", feature = "mediacodec"))] pub fn enable_hwcodec_option() -> bool { + use hbb_common::config::keys::OPTION_ENABLE_HWCODEC; + if cfg!(windows) || cfg!(target_os = "linux") || cfg!(target_os = "android") { return option2bool( OPTION_ENABLE_HWCODEC, @@ -846,6 +848,8 @@ pub fn enable_hwcodec_option() -> bool { } #[cfg(feature = "vram")] pub fn enable_vram_option(encode: bool) -> bool { + use hbb_common::config::keys::OPTION_ENABLE_HWCODEC; + if cfg!(windows) { let enable = option2bool( OPTION_ENABLE_HWCODEC, diff --git a/libs/scrap/src/common/convert.rs b/libs/scrap/src/common/convert.rs index ba246c6949..d388319289 100644 --- a/libs/scrap/src/common/convert.rs +++ b/libs/scrap/src/common/convert.rs @@ -32,13 +32,16 @@ pub fn convert_to_yuv( dst_fmt.h ); } - if src_pixfmt == crate::Pixfmt::BGRA || src_pixfmt == crate::Pixfmt::RGBA { + if src_pixfmt == crate::Pixfmt::BGRA + || src_pixfmt == crate::Pixfmt::RGBA + || src_pixfmt == crate::Pixfmt::RGB565LE + { // stride is calculated, not real, so we need to check it - if src_stride[0] < src_width * 4 { + if src_stride[0] < src_width * src_pixfmt.bytes_per_pixel() { bail!( - "src_stride[0] < src_width * 4: {} < {}", + "src_stride too small: {} < {}", src_stride[0], - src_width * 4 + src_width * src_pixfmt.bytes_per_pixel() ); } if src.len() < src_stride[0] * src_height { @@ -51,19 +54,26 @@ pub fn convert_to_yuv( } } let align = |x: usize| (x + 63) / 64 * 64; + let unsupported = format!( + "unsupported pixfmt conversion: {src_pixfmt:?} -> {:?}", + dst_fmt.pixfmt + ); match (src_pixfmt, dst_fmt.pixfmt) { - (crate::Pixfmt::BGRA, crate::Pixfmt::I420) | (crate::Pixfmt::RGBA, crate::Pixfmt::I420) => { + (crate::Pixfmt::BGRA, crate::Pixfmt::I420) + | (crate::Pixfmt::RGBA, crate::Pixfmt::I420) + | (crate::Pixfmt::RGB565LE, crate::Pixfmt::I420) => { let dst_stride_y = dst_fmt.stride[0]; let dst_stride_uv = dst_fmt.stride[1]; dst.resize(dst_fmt.h * dst_stride_y * 2, 0); // waste some memory to ensure memory safety let dst_y = dst.as_mut_ptr(); let dst_u = dst[dst_fmt.u..].as_mut_ptr(); let dst_v = dst[dst_fmt.v..].as_mut_ptr(); - let f = if src_pixfmt == crate::Pixfmt::BGRA { - ARGBToI420 - } else { - ABGRToI420 + let f = match src_pixfmt { + crate::Pixfmt::BGRA => ARGBToI420, + crate::Pixfmt::RGBA => ABGRToI420, + crate::Pixfmt::RGB565LE => RGB565ToI420, + _ => bail!(unsupported), }; call_yuv!(f( src.as_ptr(), @@ -78,7 +88,9 @@ pub fn convert_to_yuv( src_height as _, )); } - (crate::Pixfmt::BGRA, crate::Pixfmt::NV12) | (crate::Pixfmt::RGBA, crate::Pixfmt::NV12) => { + (crate::Pixfmt::BGRA, crate::Pixfmt::NV12) + | (crate::Pixfmt::RGBA, crate::Pixfmt::NV12) + | (crate::Pixfmt::RGB565LE, crate::Pixfmt::NV12) => { let dst_stride_y = dst_fmt.stride[0]; let dst_stride_uv = dst_fmt.stride[1]; dst.resize( @@ -87,14 +99,33 @@ pub fn convert_to_yuv( ); let dst_y = dst.as_mut_ptr(); let dst_uv = dst[dst_fmt.u..].as_mut_ptr(); - let f = if src_pixfmt == crate::Pixfmt::BGRA { - ARGBToNV12 - } else { - ABGRToNV12 + let (input, input_stride) = match src_pixfmt { + crate::Pixfmt::BGRA => (src.as_ptr(), src_stride[0]), + crate::Pixfmt::RGBA => (src.as_ptr(), src_stride[0]), + crate::Pixfmt::RGB565LE => { + let mid_stride = src_width * 4; + mid_data.resize(mid_stride * src_height, 0); + call_yuv!(RGB565ToARGB( + src.as_ptr(), + src_stride[0] as _, + mid_data.as_mut_ptr(), + mid_stride as _, + src_width as _, + src_height as _, + )); + (mid_data.as_ptr(), mid_stride) + } + _ => bail!(unsupported), + }; + let f = match src_pixfmt { + crate::Pixfmt::BGRA => ARGBToNV12, + crate::Pixfmt::RGBA => ABGRToNV12, + crate::Pixfmt::RGB565LE => ARGBToNV12, + _ => bail!(unsupported), }; call_yuv!(f( - src.as_ptr(), - src_stride[0] as _, + input, + input_stride as _, dst_y, dst_stride_y as _, dst_uv, @@ -103,7 +134,9 @@ pub fn convert_to_yuv( src_height as _, )); } - (crate::Pixfmt::BGRA, crate::Pixfmt::I444) | (crate::Pixfmt::RGBA, crate::Pixfmt::I444) => { + (crate::Pixfmt::BGRA, crate::Pixfmt::I444) + | (crate::Pixfmt::RGBA, crate::Pixfmt::I444) + | (crate::Pixfmt::RGB565LE, crate::Pixfmt::I444) => { let dst_stride_y = dst_fmt.stride[0]; let dst_stride_u = dst_fmt.stride[1]; let dst_stride_v = dst_fmt.stride[2]; @@ -115,23 +148,39 @@ pub fn convert_to_yuv( let dst_y = dst.as_mut_ptr(); let dst_u = dst[dst_fmt.u..].as_mut_ptr(); let dst_v = dst[dst_fmt.v..].as_mut_ptr(); - let src = if src_pixfmt == crate::Pixfmt::BGRA { - src - } else { - mid_data.resize(src.len(), 0); - call_yuv!(ABGRToARGB( - src.as_ptr(), - src_stride[0] as _, - mid_data.as_mut_ptr(), - src_stride[0] as _, - src_width as _, - src_height as _, - )); - mid_data + let (input, input_stride) = match src_pixfmt { + crate::Pixfmt::BGRA => (src.as_ptr(), src_stride[0]), + crate::Pixfmt::RGBA => { + mid_data.resize(src.len(), 0); + call_yuv!(ABGRToARGB( + src.as_ptr(), + src_stride[0] as _, + mid_data.as_mut_ptr(), + src_stride[0] as _, + src_width as _, + src_height as _, + )); + (mid_data.as_ptr(), src_stride[0]) + } + crate::Pixfmt::RGB565LE => { + let mid_stride = src_width * 4; + mid_data.resize(mid_stride * src_height, 0); + call_yuv!(RGB565ToARGB( + src.as_ptr(), + src_stride[0] as _, + mid_data.as_mut_ptr(), + mid_stride as _, + src_width as _, + src_height as _, + )); + (mid_data.as_ptr(), mid_stride) + } + _ => bail!(unsupported), }; + call_yuv!(ARGBToI444( - src.as_ptr(), - src_stride[0] as _, + input, + input_stride as _, dst_y, dst_stride_y as _, dst_u, @@ -143,10 +192,7 @@ pub fn convert_to_yuv( )); } _ => { - bail!( - "convert not support, {src_pixfmt:?} -> {:?}", - dst_fmt.pixfmt - ); + bail!(unsupported); } } Ok(()) diff --git a/libs/scrap/src/common/mod.rs b/libs/scrap/src/common/mod.rs index 085d1e501f..164f7157de 100644 --- a/libs/scrap/src/common/mod.rs +++ b/libs/scrap/src/common/mod.rs @@ -59,6 +59,7 @@ pub enum ImageFormat { ABGR, ARGB, } + #[repr(C)] pub struct ImageRgb { pub raw: Vec, @@ -208,11 +209,27 @@ impl<'a> EncodeInput<'a> { pub enum Pixfmt { BGRA, RGBA, + RGB565LE, I420, NV12, I444, } +impl Pixfmt { + pub fn bpp(&self) -> usize { + match self { + Pixfmt::BGRA | Pixfmt::RGBA => 32, + Pixfmt::RGB565LE => 16, + Pixfmt::I420 | Pixfmt::NV12 => 12, + Pixfmt::I444 => 24, + } + } + + pub fn bytes_per_pixel(&self) -> usize { + (self.bpp() + 7) / 8 + } +} + #[derive(Debug, Clone)] pub struct EncodeYuvFormat { pub pixfmt: Pixfmt, diff --git a/libs/scrap/src/common/x11.rs b/libs/scrap/src/common/x11.rs index 56beaa46ed..2a7c19c47d 100644 --- a/libs/scrap/src/common/x11.rs +++ b/libs/scrap/src/common/x11.rs @@ -23,9 +23,10 @@ impl TraitCapturer for Capturer { fn frame<'a>(&'a mut self, _timeout: Duration) -> io::Result> { let width = self.width(); let height = self.height(); + let pixfmt = self.0.display().pixfmt(); Ok(Frame::PixelBuffer(PixelBuffer::new( self.0.frame()?, - Pixfmt::BGRA, + pixfmt, width, height, ))) diff --git a/libs/scrap/src/x11/capturer.rs b/libs/scrap/src/x11/capturer.rs index 4b0e006044..550bfb346f 100644 --- a/libs/scrap/src/x11/capturer.rs +++ b/libs/scrap/src/x11/capturer.rs @@ -17,7 +17,7 @@ impl Capturer { pub fn new(display: Display) -> io::Result { // Calculate dimensions. - let pixel_width = 4; + let pixel_width = display.pixfmt().bytes_per_pixel(); let rect = display.rect(); let size = (rect.w as usize) * (rect.h as usize) * pixel_width; diff --git a/libs/scrap/src/x11/display.rs b/libs/scrap/src/x11/display.rs index a33903caab..0bc18b3b87 100644 --- a/libs/scrap/src/x11/display.rs +++ b/libs/scrap/src/x11/display.rs @@ -2,6 +2,7 @@ use std::rc::Rc; use super::ffi::*; use super::Server; +use crate::Pixfmt; #[derive(Debug)] pub struct Display { @@ -10,6 +11,7 @@ pub struct Display { rect: Rect, root: xcb_window_t, name: String, + pixfmt: Pixfmt, } #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] @@ -27,6 +29,7 @@ impl Display { rect: Rect, root: xcb_window_t, name: String, + pixfmt: Pixfmt, ) -> Display { Display { server, @@ -34,6 +37,7 @@ impl Display { rect, root, name, + pixfmt, } } @@ -59,4 +63,8 @@ impl Display { pub fn name(&self) -> String { self.name.clone() } + + pub fn pixfmt(&self) -> Pixfmt { + self.pixfmt + } } diff --git a/libs/scrap/src/x11/ffi.rs b/libs/scrap/src/x11/ffi.rs index 3337d6e44f..370ce78b70 100644 --- a/libs/scrap/src/x11/ffi.rs +++ b/libs/scrap/src/x11/ffi.rs @@ -82,12 +82,24 @@ extern "C" { pub fn xcb_get_atom_name_name_length(reply: *const xcb_get_atom_name_reply_t) -> i32; pub fn xcb_shm_query_version(c: *mut xcb_connection_t) -> xcb_shm_query_version_cookie_t; - + pub fn xcb_shm_query_version_reply( c: *mut xcb_connection_t, cookie: xcb_shm_query_version_cookie_t, e: *mut *mut xcb_generic_error_t, ) -> *const xcb_shm_query_version_reply_t; + + pub fn xcb_get_geometry_unchecked( + c: *mut xcb_connection_t, + drawable: xcb_drawable_t, + ) -> xcb_get_geometry_cookie_t; + + pub fn xcb_get_geometry_reply( + c: *mut xcb_connection_t, + cookie: xcb_get_geometry_cookie_t, + e: *mut *mut xcb_generic_error_t, + ) -> *mut xcb_get_geometry_reply_t; + } pub const XCB_IMAGE_FORMAT_Z_PIXMAP: u8 = 2; @@ -195,6 +207,12 @@ pub struct xcb_void_cookie_t { pub sequence: u32, } +#[repr(C)] +#[derive(Clone, Copy)] +pub struct xcb_get_geometry_cookie_t { + pub sequence: u32, +} + #[repr(C)] pub struct xcb_generic_error_t { pub response_type: u8, @@ -248,3 +266,18 @@ pub struct xcb_shm_query_version_reply_t { pub pixmap_format: u8, pub pad0: [u8; 15], } + +#[repr(C)] +pub struct xcb_get_geometry_reply_t { + pub response_type: u8, + pub depth: u8, + pub sequence: u16, + pub length: u32, + pub root: xcb_window_t, + pub x: i16, + pub y: i16, + pub width: u16, + pub height: u16, + pub border_width: u16, + pub pad0: [u8; 2], +} diff --git a/libs/scrap/src/x11/iter.rs b/libs/scrap/src/x11/iter.rs index 387687847a..f800d5aa8a 100644 --- a/libs/scrap/src/x11/iter.rs +++ b/libs/scrap/src/x11/iter.rs @@ -2,6 +2,7 @@ use std::ffi::CString; use std::ptr; use std::rc::Rc; +use crate::Pixfmt; use hbb_common::libc; use super::ffi::*; @@ -66,7 +67,7 @@ impl Iterator for DisplayIter { unsafe { let data = &*inner.data; let name = get_atom_name(self.server.raw(), data.name); - + let pixfmt = get_pixfmt(self.server.raw(), root).unwrap_or(Pixfmt::BGRA); let display = Display::new( self.server.clone(), data.primary != 0, @@ -78,6 +79,7 @@ impl Iterator for DisplayIter { }, root, name, + pixfmt, ); xcb_randr_monitor_info_next(inner); @@ -102,11 +104,7 @@ fn get_atom_name(conn: *mut xcb_connection_t, atom: xcb_atom_t) -> String { } unsafe { let mut e: *mut xcb_generic_error_t = std::ptr::null_mut(); - let reply = xcb_get_atom_name_reply( - conn, - xcb_get_atom_name(conn, atom), - &mut e as _, - ); + let reply = xcb_get_atom_name_reply(conn, xcb_get_atom_name(conn, atom), &mut e as _); if reply == std::ptr::null() { return empty; } @@ -121,3 +119,20 @@ fn get_atom_name(conn: *mut xcb_connection_t, atom: xcb_atom_t) -> String { empty } } + +unsafe fn get_pixfmt(conn: *mut xcb_connection_t, root: xcb_window_t) -> Option { + let geo_cookie = xcb_get_geometry_unchecked(conn, root); + let geo = xcb_get_geometry_reply(conn, geo_cookie, ptr::null_mut()); + if geo.is_null() { + return None; + } + let depth = (*geo).depth; + libc::free(geo as _); + // now only support little endian + // https://github.com/FFmpeg/FFmpeg/blob/a9c05eb657d0d05f3ac79fe9973581a41b265a5e/libavdevice/xcbgrab.c#L519 + match depth { + 16 => Some(Pixfmt::RGB565LE), + 32 => Some(Pixfmt::BGRA), + _ => None, + } +} diff --git a/res/PKGBUILD b/res/PKGBUILD index 784b0a1b3a..6f1b4e6801 100644 --- a/res/PKGBUILD +++ b/res/PKGBUILD @@ -1,5 +1,5 @@ pkgname=rustdesk -pkgver=1.2.6 +pkgver=1.2.7 pkgrel=0 epoch= pkgdesc="" diff --git a/res/rpm-flutter-suse.spec b/res/rpm-flutter-suse.spec index 0475b0dc71..c4fe69e677 100644 --- a/res/rpm-flutter-suse.spec +++ b/res/rpm-flutter-suse.spec @@ -1,5 +1,5 @@ Name: rustdesk -Version: 1.2.6 +Version: 1.2.7 Release: 0 Summary: RPM package License: GPL-3.0 diff --git a/res/rpm-flutter.spec b/res/rpm-flutter.spec index d7768c378e..90e45af9cb 100644 --- a/res/rpm-flutter.spec +++ b/res/rpm-flutter.spec @@ -1,5 +1,5 @@ Name: rustdesk -Version: 1.2.6 +Version: 1.2.7 Release: 0 Summary: RPM package License: GPL-3.0 diff --git a/res/rpm.spec b/res/rpm.spec index 60acd18716..a6d6a956a6 100644 --- a/res/rpm.spec +++ b/res/rpm.spec @@ -1,5 +1,5 @@ Name: rustdesk -Version: 1.2.6 +Version: 1.2.7 Release: 0 Summary: RPM package License: GPL-3.0 diff --git a/res/vcpkg/aom/aom-rename-static.diff b/res/vcpkg/aom/aom-rename-static.diff deleted file mode 100644 index dfb911f21c..0000000000 --- a/res/vcpkg/aom/aom-rename-static.diff +++ /dev/null @@ -1,19 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 8f459f39c4..d8c1bb2b02 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -286,12 +286,12 @@ add_library(aom ${target_objs_aom} $) - - if(BUILD_SHARED_LIBS) - add_library(aom_static STATIC ${target_objs_aom} $) -- set_target_properties(aom_static PROPERTIES OUTPUT_NAME aom) -+ set_target_properties(aom_static PROPERTIES OUTPUT_NAME aom_static) - if(MSVC OR (WIN32 AND NOT MINGW)) - # Fix race condition on the export library file between the two versions. - # Affects MSVC in all three flavors (stock, Clang/CL, LLVM-- the latter sets - # MSVC and MINGW both to FALSE). -- set_target_properties(aom PROPERTIES ARCHIVE_OUTPUT_NAME "aom_dll") -+ set_target_properties(aom PROPERTIES ARCHIVE_OUTPUT_NAME "aom") - endif() - - if(NOT MSVC) diff --git a/res/vcpkg/aom/portfile.cmake b/res/vcpkg/aom/portfile.cmake index 2d05ffac8a..0167a92631 100644 --- a/res/vcpkg/aom/portfile.cmake +++ b/res/vcpkg/aom/portfile.cmake @@ -11,9 +11,8 @@ vcpkg_add_to_path(${PERL_PATH}) vcpkg_from_git( OUT_SOURCE_PATH SOURCE_PATH URL "https://aomedia.googlesource.com/aom" - REF 6054fae218eda6e53e1e3b4f7ef0fff4877c7bf1 # v3.7.0 + REF 8ad484f8a18ed1853c094e7d3a4e023b2a92df28 # 3.9.1 PATCHES - aom-rename-static.diff aom-uninitialized-pointer.diff # Can be dropped when https://bugs.chromium.org/p/aomedia/issues/detail?id=3029 is merged into the upstream aom-install.diff @@ -47,6 +46,13 @@ vcpkg_copy_pdbs() vcpkg_fixup_pkgconfig() +if(VCPKG_TARGET_IS_WINDOWS) + vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/lib/pkgconfig/aom.pc" " -lm" "") + if(NOT VCPKG_BUILD_TYPE) + vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/aom.pc" " -lm" "") + endif() +endif() + # Move cmake configs vcpkg_cmake_config_fixup(CONFIG_PATH lib/cmake/${PORT}) diff --git a/res/vcpkg/aom/vcpkg.json b/res/vcpkg/aom/vcpkg.json index 7fc53a398f..78ccc89890 100644 --- a/res/vcpkg/aom/vcpkg.json +++ b/res/vcpkg/aom/vcpkg.json @@ -1,6 +1,7 @@ { "name": "aom", - "version-semver": "3.7.0", + "version-semver": "3.9.1", + "port-version": 0, "description": "AV1 codec library", "homepage": "https://aomedia.googlesource.com/aom", "license": "BSD-2-Clause", diff --git a/res/vcpkg/libvpx/0003-add-uwp-v142-and-v143-support.patch b/res/vcpkg/libvpx/0003-add-uwp-v142-and-v143-support.patch index 43cebde311..32222238c9 100644 --- a/res/vcpkg/libvpx/0003-add-uwp-v142-and-v143-support.patch +++ b/res/vcpkg/libvpx/0003-add-uwp-v142-and-v143-support.patch @@ -85,19 +85,19 @@ index 58bb66b..b4cad6c 100644 fi fi diff --git a/configure b/configure -index ae289f7..78f5fc1 100644 +index b212e07..1a9fa98 100755 --- a/configure +++ b/configure -@@ -103,6 +103,8 @@ all_platforms="${all_platforms} arm64-darwin20-gcc" - all_platforms="${all_platforms} arm64-darwin21-gcc" +@@ -104,6 +104,8 @@ all_platforms="${all_platforms} arm64-darwin21-gcc" all_platforms="${all_platforms} arm64-darwin22-gcc" + all_platforms="${all_platforms} arm64-darwin23-gcc" all_platforms="${all_platforms} arm64-linux-gcc" +all_platforms="${all_platforms} arm64-uwp-vs16" +all_platforms="${all_platforms} arm64-uwp-vs17" all_platforms="${all_platforms} arm64-win64-gcc" all_platforms="${all_platforms} arm64-win64-vs15" all_platforms="${all_platforms} arm64-win64-vs16" -@@ -112,6 +114,8 @@ all_platforms="${all_platforms} armv7-darwin-gcc" #neon Cortex-A8 +@@ -115,6 +117,8 @@ all_platforms="${all_platforms} armv7-darwin-gcc" #neon Cortex-A8 all_platforms="${all_platforms} armv7-linux-rvct" #neon Cortex-A8 all_platforms="${all_platforms} armv7-linux-gcc" #neon Cortex-A8 all_platforms="${all_platforms} armv7-none-rvct" #neon Cortex-A8 @@ -106,7 +106,7 @@ index ae289f7..78f5fc1 100644 all_platforms="${all_platforms} armv7-win32-gcc" all_platforms="${all_platforms} armv7-win32-vs14" all_platforms="${all_platforms} armv7-win32-vs15" -@@ -143,6 +147,8 @@ all_platforms="${all_platforms} x86-linux-gcc" +@@ -146,6 +150,8 @@ all_platforms="${all_platforms} x86-linux-gcc" all_platforms="${all_platforms} x86-linux-icc" all_platforms="${all_platforms} x86-os2-gcc" all_platforms="${all_platforms} x86-solaris-gcc" @@ -115,7 +115,7 @@ index ae289f7..78f5fc1 100644 all_platforms="${all_platforms} x86-win32-gcc" all_platforms="${all_platforms} x86-win32-vs14" all_platforms="${all_platforms} x86-win32-vs15" -@@ -167,6 +173,8 @@ all_platforms="${all_platforms} x86_64-iphonesimulator-gcc" +@@ -171,6 +177,8 @@ all_platforms="${all_platforms} x86_64-iphonesimulator-gcc" all_platforms="${all_platforms} x86_64-linux-gcc" all_platforms="${all_platforms} x86_64-linux-icc" all_platforms="${all_platforms} x86_64-solaris-gcc" @@ -124,7 +124,7 @@ index ae289f7..78f5fc1 100644 all_platforms="${all_platforms} x86_64-win64-gcc" all_platforms="${all_platforms} x86_64-win64-vs14" all_platforms="${all_platforms} x86_64-win64-vs15" -@@ -491,11 +499,10 @@ process_targets() { +@@ -503,11 +511,10 @@ process_targets() { ! enabled multithread && DIST_DIR="${DIST_DIR}-nomt" ! enabled install_docs && DIST_DIR="${DIST_DIR}-nodocs" DIST_DIR="${DIST_DIR}-${tgt_isa}-${tgt_os}" @@ -140,7 +140,7 @@ index ae289f7..78f5fc1 100644 if [ -f "${source_path}/build/make/version.sh" ]; then ver=`"$source_path/build/make/version.sh" --bare "$source_path"` DIST_DIR="${DIST_DIR}-${ver}" -@@ -584,6 +591,10 @@ process_detect() { +@@ -596,6 +603,10 @@ process_detect() { # Specialize windows and POSIX environments. case $toolchain in diff --git a/res/vcpkg/libvpx/0005-fix-arm64-build.patch b/res/vcpkg/libvpx/0005-fix-arm64-build.patch deleted file mode 100644 index 76c0c8171f..0000000000 --- a/res/vcpkg/libvpx/0005-fix-arm64-build.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/vp9/encoder/arm/neon/vp9_diamond_search_sad_neon.c b/vp9/encoder/arm/neon/vp9_diamond_search_sad_neon.c -index 33753f7..997775a 100644 ---- a/vp9/encoder/arm/neon/vp9_diamond_search_sad_neon.c -+++ b/vp9/encoder/arm/neon/vp9_diamond_search_sad_neon.c -@@ -220,7 +220,7 @@ int vp9_diamond_search_sad_neon(const MACROBLOCK *x, - // Look up the component cost of the residual motion vector - { - uint32_t cost[4]; -- int16_t __attribute__((aligned(16))) rowcol[8]; -+ DECLARE_ALIGNED(16, int16_t, rowcol[8]); - vst1q_s16(rowcol, v_diff_mv_w); - - // Note: This is a use case for gather instruction diff --git a/res/vcpkg/libvpx/portfile.cmake b/res/vcpkg/libvpx/portfile.cmake index 30f7943149..96eab87173 100644 --- a/res/vcpkg/libvpx/portfile.cmake +++ b/res/vcpkg/libvpx/portfile.cmake @@ -4,28 +4,25 @@ vcpkg_from_github( OUT_SOURCE_PATH SOURCE_PATH REPO webmproject/libvpx REF "v${VERSION}" - SHA512 49706838563c92fab7334376848d0f374efcbc1729ef511e967c908fd2ecd40e8d197f1d85da6553b3a7026bdbc17e5a76595319858af26ce58cb9a4c3854897 + SHA512 3e3bfad3d035c0bc3db7cb5a194d56d3c90f5963fb1ad527ae5252054e7c48ce2973de1346c97d94b59f7a95d4801bec44214cce10faf123f92b36fca79a8d1e HEAD_REF master PATCHES 0002-Fix-nasm-debug-format-flag.patch 0003-add-uwp-v142-and-v143-support.patch 0004-remove-library-suffixes.patch - 0005-fix-arm64-build.patch # Upstream commit: https://github.com/webmproject/libvpx/commit/858a8c611f4c965078485860a6820e2135e6611b ) -vcpkg_find_acquire_program(PERL) - -get_filename_component(PERL_EXE_PATH ${PERL} DIRECTORY) - if(CMAKE_HOST_WIN32) - vcpkg_acquire_msys(MSYS_ROOT PACKAGES make) - set(BASH ${MSYS_ROOT}/usr/bin/bash.exe) - set(ENV{PATH} "${MSYS_ROOT}/usr/bin;$ENV{PATH};${PERL_EXE_PATH}") + vcpkg_acquire_msys(MSYS_ROOT PACKAGES make perl) + set(ENV{PATH} "${MSYS_ROOT}/usr/bin;$ENV{PATH}") else() - set(BASH /bin/bash) + vcpkg_find_acquire_program(PERL) + get_filename_component(PERL_EXE_PATH ${PERL} DIRECTORY) set(ENV{PATH} "${MSYS_ROOT}/usr/bin:$ENV{PATH}:${PERL_EXE_PATH}") endif() +find_program(BASH NAME bash HINTS ${MSYS_ROOT}/usr/bin REQUIRED NO_CACHE) + vcpkg_find_acquire_program(NASM) get_filename_component(NASM_EXE_PATH ${NASM} DIRECTORY) vcpkg_add_to_path(${NASM_EXE_PATH}) diff --git a/res/vcpkg/libvpx/vcpkg.json b/res/vcpkg/libvpx/vcpkg.json index 0a11ff7eab..ca4a47d309 100644 --- a/res/vcpkg/libvpx/vcpkg.json +++ b/res/vcpkg/libvpx/vcpkg.json @@ -1,6 +1,7 @@ { "name": "libvpx", - "version": "1.13.1", + "version": "1.14.1", + "port-version": 0, "description": "The reference software implementation for the video coding formats VP8 and VP9.", "homepage": "https://github.com/webmproject/libvpx", "license": "BSD-3-Clause", @@ -12,7 +13,7 @@ { "name": "vcpkg-msbuild", "host": true, - "platform": "windows" + "platform": "windows & !mingw" } ], "features": { diff --git a/res/vcpkg/opus/fix-pkgconfig-version.patch b/res/vcpkg/opus/fix-pkgconfig-version.patch deleted file mode 100644 index ef9f7229c4..0000000000 --- a/res/vcpkg/opus/fix-pkgconfig-version.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/cmake/OpusPackageVersion.cmake b/cmake/OpusPackageVersion.cmake -index 447ce3b..15ebd8e 100644 ---- a/cmake/OpusPackageVersion.cmake -+++ b/cmake/OpusPackageVersion.cmake -@@ -4,7 +4,9 @@ endif() - set(__opus_version INCLUDED) - - function(get_package_version PACKAGE_VERSION PROJECT_VERSION) -- -+ set(PACKAGE_VERSION "0" CACHE STRING "opus package version") -+ set(PROJECT_VERSION "0" CACHE STRING "opus project version") -+ return() - find_package(Git) - if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git") - execute_process(COMMAND ${GIT_EXECUTABLE} diff --git a/res/vcpkg/opus/portfile.cmake b/res/vcpkg/opus/portfile.cmake deleted file mode 100644 index f4fb2ac942..0000000000 --- a/res/vcpkg/opus/portfile.cmake +++ /dev/null @@ -1,58 +0,0 @@ -vcpkg_from_github( - OUT_SOURCE_PATH SOURCE_PATH - REPO xiph/opus - REF "v${VERSION}" - SHA512 86df35cd62ebf3551b2739effb8f818d635656d91d386d7d600a424a92c4c0d6bfbc3986f1ec6cf4950910ac87b28dc9640b9df3b9a6a5a75eb37ae71782b72e - HEAD_REF master - PATCHES fix-pkgconfig-version.patch -) - -vcpkg_check_features(OUT_FEATURE_OPTIONS FEATURE_OPTIONS - FEATURES - avx AVX_SUPPORTED -) - -set(ADDITIONAL_OPUS_OPTIONS "") -if(VCPKG_TARGET_IS_MINGW) - set(STACK_PROTECTOR OFF) - string(APPEND VCPKG_C_FLAGS "-D_FORTIFY_SOURCE=0") - string(APPEND VCPKG_CXX_FLAGS "-D_FORTIFY_SOURCE=0") -elseif(VCPKG_TARGET_IS_EMSCRIPTEN) - set(STACK_PROTECTOR OFF) -else() - set(STACK_PROTECTOR ON) -endif() - -if((VCPKG_TARGET_IS_MINGW AND VCPKG_TARGET_ARCHITECTURE MATCHES "^arm") OR - (VCPKG_TARGET_IS_LINUX AND VCPKG_TARGET_ARCHITECTURE STREQUAL "arm") OR - (VCPKG_TARGET_IS_ANDROID AND VCPKG_TARGET_ARCHITECTURE STREQUAL "arm" AND VCPKG_CMAKE_CONFIGURE_OPTIONS MATCHES "ANDROID_ARM_NEON")) - message(STATUS "Disabling ARM NEON and intrinsics on ${TARGET_TRIPLET}") - list(APPEND ADDITIONAL_OPUS_OPTIONS "-DOPUS_DISABLE_INTRINSICS=ON -DCOMPILER_SUPPORTS_NEON=OFF") # for HEAD (and future Opus release) -endif() - -vcpkg_cmake_configure( - SOURCE_PATH "${SOURCE_PATH}" - OPTIONS ${FEATURE_OPTIONS} - -DPACKAGE_VERSION=${VERSION} - -DOPUS_STACK_PROTECTOR=${STACK_PROTECTOR} - -DOPUS_INSTALL_PKG_CONFIG_MODULE=ON - -DOPUS_INSTALL_CMAKE_CONFIG_MODULE=ON - -DOPUS_BUILD_PROGRAMS=OFF - -DOPUS_BUILD_TESTING=OFF - ${ADDITIONAL_OPUS_OPTIONS} - MAYBE_UNUSED_VARIABLES - OPUS_USE_NEON - OPUS_DISABLE_INTRINSICS -) -vcpkg_cmake_install() -vcpkg_copy_pdbs() - -vcpkg_cmake_config_fixup(CONFIG_PATH lib/cmake/Opus) -vcpkg_fixup_pkgconfig(SYSTEM_LIBRARIES m) - - -file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/lib/cmake" - "${CURRENT_PACKAGES_DIR}/lib/cmake" - "${CURRENT_PACKAGES_DIR}/debug/include") - -file(INSTALL "${SOURCE_PATH}/COPYING" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright) diff --git a/res/vcpkg/opus/vcpkg.json b/res/vcpkg/opus/vcpkg.json deleted file mode 100644 index 1b23ca5375..0000000000 --- a/res/vcpkg/opus/vcpkg.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "opus", - "version": "1.4", - "port-version": 1, - "description": "Totally open, royalty-free, highly versatile audio codec", - "homepage": "https://github.com/xiph/opus", - "license": "BSD-3-Clause", - "dependencies": [ - { - "name": "vcpkg-cmake", - "host": true - }, - { - "name": "vcpkg-cmake-config", - "host": true - } - ], - "features": { - "avx": { - "description": "Builds the library with avx instruction set" - } - } -} diff --git a/src/auth_2fa.rs b/src/auth_2fa.rs index 1ea7733422..6945bf4619 100644 --- a/src/auth_2fa.rs +++ b/src/auth_2fa.rs @@ -1,9 +1,10 @@ use hbb_common::{ + anyhow::anyhow, bail, config::Config, get_time, password_security::{decrypt_vec_or_original, encrypt_vec_or_original}, - ResultType, + tokio, ResultType, }; use serde_derive::{Deserialize, Serialize}; use std::sync::Mutex; @@ -109,3 +110,97 @@ pub fn get_2fa(raw: Option) -> Option { .map(|x| Some(x)) .unwrap_or_default() } + +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +pub struct TelegramBot { + #[serde(skip)] + pub token_str: String, + pub token: Vec, + pub chat_id: String, +} + +impl TelegramBot { + fn into_string(&self) -> ResultType { + let token = encrypt_vec_or_original(self.token_str.as_bytes(), "00", 1024); + let bot = TelegramBot { + token, + ..self.clone() + }; + let s = serde_json::to_string(&bot)?; + Ok(s) + } + + fn save(&self) -> ResultType<()> { + let s = self.into_string()?; + #[cfg(not(any(target_os = "android", target_os = "ios")))] + crate::ipc::set_option("bot", &s); + #[cfg(any(target_os = "android", target_os = "ios"))] + Config::set_option("bot".to_owned(), s); + Ok(()) + } + + pub fn get() -> ResultType> { + let data = Config::get_option("bot"); + if data.is_empty() { + return Ok(None); + } + let mut bot = serde_json::from_str::(&data)?; + let (token, success, _) = decrypt_vec_or_original(&bot.token, "00"); + if success { + bot.token_str = String::from_utf8(token)?; + return Ok(Some(bot)); + } + bail!("decrypt_vec_or_original telegram bot token failed") + } +} + +// https://gist.github.com/dideler/85de4d64f66c1966788c1b2304b9caf1 +pub async fn send_2fa_code_to_telegram(text: &str, bot: TelegramBot) -> ResultType<()> { + let url = format!("https://api.telegram.org/bot{}/sendMessage", bot.token_str); + let params = serde_json::json!({"chat_id": bot.chat_id, "text": text}); + crate::post_request(url, params.to_string(), "").await?; + Ok(()) +} + +pub fn get_chatid_telegram(bot_token: &str) -> ResultType> { + let url = format!("https://api.telegram.org/bot{}/getUpdates", bot_token); + // because caller is in tokio runtime, so we must call post_request_sync in new thread. + let handle = std::thread::spawn(move || { + crate::post_request_sync(url, "".to_owned(), "") + }); + let resp = handle.join().map_err(|_| anyhow!("Thread panicked"))??; + let value = serde_json::from_str::(&resp).map_err(|e| anyhow!(e))?; + + // Check for an error_code in the response + if let Some(error_code) = value.get("error_code").and_then(|code| code.as_i64()) { + // If there's an error_code, try to use the description for the error message + let description = value["description"] + .as_str() + .unwrap_or("Unknown error occurred"); + return Err(anyhow!( + "Telegram API error: {} (error_code: {})", + description, + error_code + )); + } + + let chat_id = &value["result"][0]["message"]["chat"]["id"]; + let chat_id = if let Some(id) = chat_id.as_i64() { + Some(id.to_string()) + } else if let Some(id) = chat_id.as_str() { + Some(id.to_owned()) + } else { + None + }; + + if let Some(chat_id) = chat_id.as_ref() { + let bot = TelegramBot { + token_str: bot_token.to_owned(), + chat_id: chat_id.to_owned(), + ..Default::default() + }; + bot.save()?; + } + + Ok(chat_id) +} diff --git a/src/client.rs b/src/client.rs index 40630bb29a..c3fe10688c 100644 --- a/src/client.rs +++ b/src/client.rs @@ -64,11 +64,11 @@ use crate::{ ui_session_interface::{InvokeUiSession, Session}, }; +#[cfg(not(any(target_os = "android", target_os = "ios")))] +use crate::clipboard::{check_clipboard, CLIPBOARD_INTERVAL}; #[cfg(not(feature = "flutter"))] #[cfg(not(any(target_os = "android", target_os = "ios")))] use crate::ui_session_interface::SessionPermissionConfig; -#[cfg(not(any(target_os = "android", target_os = "ios")))] -use crate::{check_clipboard, CLIPBOARD_INTERVAL}; pub use super::lang::*; @@ -136,7 +136,7 @@ lazy_static::lazy_static! { #[cfg(not(any(target_os = "android", target_os = "ios")))] lazy_static::lazy_static! { static ref ENIGO: Arc> = Arc::new(Mutex::new(enigo::Enigo::new())); - static ref OLD_CLIPBOARD_TEXT: Arc> = Default::default(); + static ref OLD_CLIPBOARD_DATA: Arc> = Default::default(); static ref TEXT_CLIPBOARD_STATE: Arc> = Arc::new(Mutex::new(TextClipboardState::new())); } @@ -144,8 +144,8 @@ const PUBLIC_SERVER: &str = "public"; #[inline] #[cfg(not(any(target_os = "android", target_os = "ios")))] -pub fn get_old_clipboard_text() -> &'static Arc> { - &OLD_CLIPBOARD_TEXT +pub fn get_old_clipboard_text() -> Arc> { + OLD_CLIPBOARD_DATA.clone() } #[cfg(not(any(target_os = "android", target_os = "ios")))] @@ -736,10 +736,11 @@ impl Client { break; } if !TEXT_CLIPBOARD_STATE.lock().unwrap().is_required { + std::thread::sleep(Duration::from_millis(CLIPBOARD_INTERVAL)); continue; } - if let Some(msg) = check_clipboard(&mut ctx, Some(&OLD_CLIPBOARD_TEXT)) { + if let Some(msg) = check_clipboard(&mut ctx, Some(OLD_CLIPBOARD_DATA.clone())) { #[cfg(feature = "flutter")] crate::flutter::send_text_clipboard_msg(msg); #[cfg(not(feature = "flutter"))] @@ -765,12 +766,12 @@ impl Client { #[inline] #[cfg(not(any(target_os = "android", target_os = "ios")))] - fn get_current_text_clipboard_msg() -> Option { - let txt = &*OLD_CLIPBOARD_TEXT.lock().unwrap(); - if txt.is_empty() { + fn get_current_clipboard_msg() -> Option { + let data = &*OLD_CLIPBOARD_DATA.lock().unwrap(); + if data.is_empty() { None } else { - Some(crate::create_clipboard_msg(txt.clone())) + Some(data.create_msg()) } } } @@ -1203,6 +1204,7 @@ pub struct LoginConfigHandler { pub save_ab_password_to_recent: bool, // true: connected with ab password pub other_server: Option<(String, String, String)>, pub custom_fps: Arc>>, + pub last_auto_fps: Option, pub adapter_luid: Option, pub mark_unsupported: Vec, pub selected_windows_session_id: Option, diff --git a/src/client/io_loop.rs b/src/client/io_loop.rs index 33c39f359a..19074bbd1a 100644 --- a/src/client/io_loop.rs +++ b/src/client/io_loop.rs @@ -41,7 +41,7 @@ use crate::client::{ new_voice_call_request, Client, MediaData, MediaSender, QualityStatus, MILLI1, SEC30, }; #[cfg(not(any(target_os = "android", target_os = "ios")))] -use crate::common::{self, update_clipboard}; +use crate::clipboard::{update_clipboard, CLIPBOARD_INTERVAL}; use crate::common::{get_default_sound_input, set_sound_input}; use crate::ui_session_interface::{InvokeUiSession, Session}; #[cfg(not(any(target_os = "ios")))] @@ -1002,8 +1002,9 @@ impl Remote { if limited_fps > custom_fps { limited_fps = custom_fps; } + let last_auto_fps = self.handler.lc.read().unwrap().last_auto_fps.clone(); let should_decrease = (len > 1 - && ctl.last_auto_fps.clone().unwrap_or(custom_fps as _) > limited_fps) + && last_auto_fps.clone().unwrap_or(custom_fps as _) > limited_fps) || len > std::cmp::max(1, limited_fps / 2); // increase judgement @@ -1015,14 +1016,14 @@ impl Remote { ctl.idle_counter = 0; } let mut should_increase = false; - if let Some(last_auto_fps) = ctl.last_auto_fps.clone() { + if let Some(last_auto_fps) = last_auto_fps.clone() { // ever set if last_auto_fps + 3 <= limited_fps && ctl.idle_counter > 3 { // limited_fps is 3 larger than last set, and idle time is more than 3 seconds should_increase = true; } } - if ctl.last_auto_fps.is_none() || should_decrease || should_increase { + if last_auto_fps.is_none() || should_decrease || should_increase { // limited_fps to ensure decoding is faster than encoding let mut auto_fps = limited_fps; if should_decrease && limited_fps < len { @@ -1041,13 +1042,13 @@ impl Remote { self.sender.send(Data::Message(msg)).ok(); log::info!("Set fps to {}", auto_fps); ctl.last_queue_size = len; - ctl.last_auto_fps = Some(auto_fps); + self.handler.lc.write().unwrap().last_auto_fps = Some(auto_fps); } // send refresh for (display, video_queue) in self.video_queue_map.read().unwrap().iter() { let tolerable = std::cmp::min(decode_fps, video_queue.capacity() / 2); if ctl.refresh_times < 20 // enough - && (len > tolerable + && (video_queue.len() > tolerable && (ctl.refresh_times == 0 || ctl.last_refresh_instant.elapsed().as_secs() > 10)) { // Refresh causes client set_display, left frames cause flickering. @@ -1134,16 +1135,16 @@ impl Remote { // To make sure current text clipboard data is updated. #[cfg(not(any(target_os = "android", target_os = "ios")))] if let Some(mut rx) = rx { - timeout(common::CLIPBOARD_INTERVAL, rx.recv()).await.ok(); + timeout(CLIPBOARD_INTERVAL, rx.recv()).await.ok(); } #[cfg(not(any(target_os = "android", target_os = "ios")))] - if let Some(msg_out) = Client::get_current_text_clipboard_msg() { + if let Some(msg_out) = Client::get_current_clipboard_msg() { let sender = self.sender.clone(); let permission_config = self.handler.get_permission_config(); tokio::spawn(async move { // due to clipboard service interval time - sleep(common::CLIPBOARD_INTERVAL as f32 / 1_000.).await; + sleep(CLIPBOARD_INTERVAL as f32 / 1_000.).await; if permission_config.is_text_clipboard_required() { sender.send(Data::Message(msg_out)).ok(); } @@ -1179,7 +1180,7 @@ impl Remote { Some(message::Union::Clipboard(cb)) => { if !self.handler.lc.read().unwrap().disable_clipboard.v { #[cfg(not(any(target_os = "android", target_os = "ios")))] - update_clipboard(cb, Some(&crate::client::get_old_clipboard_text())); + update_clipboard(cb, Some(crate::client::get_old_clipboard_text())); #[cfg(any(target_os = "android", target_os = "ios"))] { let content = if cb.compress { @@ -1858,7 +1859,6 @@ struct FpsControl { last_queue_size: usize, refresh_times: usize, last_refresh_instant: Instant, - last_auto_fps: Option, idle_counter: usize, last_active_time: HashMap, } @@ -1869,7 +1869,6 @@ impl Default for FpsControl { last_queue_size: Default::default(), refresh_times: Default::default(), last_refresh_instant: Instant::now(), - last_auto_fps: Default::default(), idle_counter: 0, last_active_time: Default::default(), } diff --git a/src/clipboard.rs b/src/clipboard.rs new file mode 100644 index 0000000000..973f948f65 --- /dev/null +++ b/src/clipboard.rs @@ -0,0 +1,412 @@ +use std::sync::{ + atomic::{AtomicU64, Ordering}, + Arc, Mutex, +}; + +use clipboard_master::{CallbackResult, ClipboardHandler, Master, Shutdown}; +use hbb_common::{ + allow_err, + compress::{compress as compress_func, decompress}, + log, + message_proto::*, + ResultType, +}; + +pub const CLIPBOARD_NAME: &'static str = "clipboard"; +pub const CLIPBOARD_INTERVAL: u64 = 333; + +lazy_static::lazy_static! { + pub static ref CONTENT: Arc> = Default::default(); + static ref ARBOARD_MTX: Arc> = Arc::new(Mutex::new(())); +} + +#[cfg(all(target_os = "linux", feature = "unix-file-copy-paste"))] +static X11_CLIPBOARD: once_cell::sync::OnceCell = + once_cell::sync::OnceCell::new(); + +#[cfg(all(target_os = "linux", feature = "unix-file-copy-paste"))] +fn get_clipboard() -> Result<&'static x11_clipboard::Clipboard, String> { + X11_CLIPBOARD + .get_or_try_init(|| x11_clipboard::Clipboard::new()) + .map_err(|e| e.to_string()) +} + +#[cfg(all(target_os = "linux", feature = "unix-file-copy-paste"))] +pub struct ClipboardContext { + string_setter: x11rb::protocol::xproto::Atom, + string_getter: x11rb::protocol::xproto::Atom, + text_uri_list: x11rb::protocol::xproto::Atom, + + clip: x11rb::protocol::xproto::Atom, + prop: x11rb::protocol::xproto::Atom, +} + +#[cfg(all(target_os = "linux", feature = "unix-file-copy-paste"))] +fn parse_plain_uri_list(v: Vec) -> Result { + let text = String::from_utf8(v).map_err(|_| "ConversionFailure".to_owned())?; + let mut list = String::new(); + for line in text.lines() { + if !line.starts_with("file://") { + continue; + } + let decoded = percent_encoding::percent_decode_str(line) + .decode_utf8() + .map_err(|_| "ConversionFailure".to_owned())?; + list = list + "\n" + decoded.trim_start_matches("file://"); + } + list = list.trim().to_owned(); + Ok(list) +} + +#[cfg(all(target_os = "linux", feature = "unix-file-copy-paste"))] +impl ClipboardContext { + pub fn new() -> Result { + let clipboard = get_clipboard()?; + let string_getter = clipboard + .getter + .get_atom("UTF8_STRING") + .map_err(|e| e.to_string())?; + let string_setter = clipboard + .setter + .get_atom("UTF8_STRING") + .map_err(|e| e.to_string())?; + let text_uri_list = clipboard + .getter + .get_atom("text/uri-list") + .map_err(|e| e.to_string())?; + let prop = clipboard.getter.atoms.property; + let clip = clipboard.getter.atoms.clipboard; + Ok(Self { + text_uri_list, + string_setter, + string_getter, + clip, + prop, + }) + } + + pub fn get_text(&mut self) -> Result { + let clip = self.clip; + let prop = self.prop; + + const TIMEOUT: std::time::Duration = std::time::Duration::from_millis(120); + + let text_content = get_clipboard()? + .load(clip, self.string_getter, prop, TIMEOUT) + .map_err(|e| e.to_string())?; + + let file_urls = get_clipboard()?.load(clip, self.text_uri_list, prop, TIMEOUT); + + if file_urls.is_err() || file_urls.as_ref().unwrap().is_empty() { + log::trace!("clipboard get text, no file urls"); + return String::from_utf8(text_content).map_err(|e| e.to_string()); + } + + let file_urls = parse_plain_uri_list(file_urls.unwrap())?; + + let text_content = String::from_utf8(text_content).map_err(|e| e.to_string())?; + + if text_content.trim() == file_urls.trim() { + log::trace!("clipboard got text but polluted"); + return Err(String::from("polluted text")); + } + + Ok(text_content) + } + + pub fn set_text(&mut self, content: String) -> Result<(), String> { + let clip = self.clip; + + let value = content.clone().into_bytes(); + get_clipboard()? + .store(clip, self.string_setter, value) + .map_err(|e| e.to_string())?; + Ok(()) + } +} + +pub fn check_clipboard( + ctx: &mut Option, + old: Option>>, +) -> Option { + if ctx.is_none() { + *ctx = ClipboardContext::new(true).ok(); + } + let ctx2 = ctx.as_mut()?; + let side = if old.is_none() { "host" } else { "client" }; + let old = if let Some(old) = old { + old + } else { + CONTENT.clone() + }; + let content = ctx2.get(); + if let Ok(content) = content { + if !content.is_empty() { + let changed = content != *old.lock().unwrap(); + if changed { + log::info!("{} update found on {}", CLIPBOARD_NAME, side); + let msg = content.create_msg(); + *old.lock().unwrap() = content; + return Some(msg); + } + } + } + None +} + +fn update_clipboard_(clipboard: Clipboard, old: Option>>) { + let content = ClipboardData::from_msg(clipboard); + if content.is_empty() { + return; + } + match ClipboardContext::new(false) { + Ok(mut ctx) => { + let side = if old.is_none() { "host" } else { "client" }; + let old = if let Some(old) = old { + old + } else { + CONTENT.clone() + }; + allow_err!(ctx.set(&content)); + *old.lock().unwrap() = content; + log::debug!("{} updated on {}", CLIPBOARD_NAME, side); + } + Err(err) => { + log::error!("Failed to create clipboard context: {}", err); + } + } +} + +pub fn update_clipboard(clipboard: Clipboard, old: Option>>) { + std::thread::spawn(move || { + update_clipboard_(clipboard, old); + }); +} + +#[derive(Clone)] +pub enum ClipboardData { + Text(String), + Image(arboard::ImageData<'static>, u64), + Empty, +} + +impl Default for ClipboardData { + fn default() -> Self { + ClipboardData::Empty + } +} + +impl ClipboardData { + fn image(image: arboard::ImageData<'static>) -> ClipboardData { + let hash = 0; + /* + use std::hash::{DefaultHasher, Hash, Hasher}; + let mut hasher = DefaultHasher::new(); + image.bytes.hash(&mut hasher); + let hash = hasher.finish(); + */ + ClipboardData::Image(image, hash) + } + + pub fn is_empty(&self) -> bool { + match self { + ClipboardData::Empty => true, + ClipboardData::Text(s) => s.is_empty(), + ClipboardData::Image(a, _) => a.bytes.is_empty(), + } + } + + fn from_msg(clipboard: Clipboard) -> Self { + let is_image = clipboard.width > 0 && clipboard.height > 0; + let data = if clipboard.compress { + decompress(&clipboard.content) + } else { + clipboard.content.into() + }; + if is_image { + ClipboardData::Image( + arboard::ImageData { + bytes: data.into(), + width: clipboard.width as _, + height: clipboard.height as _, + }, + 0, + ) + } else { + if let Ok(content) = String::from_utf8(data) { + ClipboardData::Text(content) + } else { + ClipboardData::Empty + } + } + } + + pub fn create_msg(&self) -> Message { + let mut msg = Message::new(); + + match self { + ClipboardData::Text(s) => { + let compressed = compress_func(s.as_bytes()); + let compress = compressed.len() < s.as_bytes().len(); + let content = if compress { + compressed + } else { + s.clone().into_bytes() + }; + msg.set_clipboard(Clipboard { + compress, + content: content.into(), + ..Default::default() + }); + } + ClipboardData::Image(a, _) => { + let compressed = compress_func(&a.bytes); + let compress = compressed.len() < a.bytes.len(); + let content = if compress { + compressed + } else { + a.bytes.to_vec() + }; + msg.set_clipboard(Clipboard { + compress, + content: content.into(), + width: a.width as _, + height: a.height as _, + ..Default::default() + }); + } + _ => {} + } + msg + } +} + +impl PartialEq for ClipboardData { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (ClipboardData::Text(a), ClipboardData::Text(b)) => a == b, + (ClipboardData::Image(a, _), ClipboardData::Image(b, _)) => { + a.width == b.width && a.height == b.height && a.bytes == b.bytes + } + (ClipboardData::Empty, ClipboardData::Empty) => true, + _ => false, + } + } +} + +#[cfg(not(any(all(target_os = "linux", feature = "unix-file-copy-paste"))))] +pub struct ClipboardContext(arboard::Clipboard, (Arc, u64), Option); + +#[cfg(not(any(all(target_os = "linux", feature = "unix-file-copy-paste"))))] +#[allow(unreachable_code)] +impl ClipboardContext { + pub fn new(listen: bool) -> ResultType { + let board; + #[cfg(not(target_os = "linux"))] + { + board = arboard::Clipboard::new()?; + } + #[cfg(target_os = "linux")] + { + let mut i = 1; + loop { + // Try 5 times to create clipboard + // Arboard::new() connect to X server or Wayland compositor, which shoud be ok at most time + // But sometimes, the connection may fail, so we retry here. + match arboard::Clipboard::new() { + Ok(x) => { + board = x; + break; + } + Err(e) => { + if i == 5 { + return Err(e.into()); + } else { + std::thread::sleep(std::time::Duration::from_millis(30 * i)); + } + } + } + i += 1; + } + } + + // starting from 1 so that we can always get initial clipboard data no matter if change + let change_count: Arc = Arc::new(AtomicU64::new(1)); + let mut shutdown = None; + if listen { + struct Handler(Arc); + impl ClipboardHandler for Handler { + fn on_clipboard_change(&mut self) -> CallbackResult { + self.0.fetch_add(1, Ordering::SeqCst); + CallbackResult::Next + } + + fn on_clipboard_error(&mut self, error: std::io::Error) -> CallbackResult { + log::trace!("Error of clipboard listener: {}", error); + CallbackResult::Next + } + } + let change_count_cloned = change_count.clone(); + let (tx, rx) = std::sync::mpsc::channel(); + // https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getmessage#:~:text=The%20window%20must%20belong%20to%20the%20current%20thread. + std::thread::spawn(move || match Master::new(Handler(change_count_cloned)) { + Ok(mut master) => { + tx.send(master.shutdown_channel()).ok(); + log::debug!("Clipboard listener started"); + if let Err(err) = master.run() { + log::error!("Failed to run clipboard listener: {}", err); + } else { + log::debug!("Clipboard listener stopped"); + } + } + Err(err) => { + log::error!("Failed to create clipboard listener: {}", err); + } + }); + if let Ok(st) = rx.recv() { + shutdown = Some(st); + } + } + Ok(ClipboardContext(board, (change_count, 0), shutdown)) + } + + #[inline] + pub fn change_count(&self) -> u64 { + debug_assert!(self.2.is_some()); + self.1 .0.load(Ordering::SeqCst) + } + + pub fn get(&mut self) -> ResultType { + let cn = self.change_count(); + let _lock = ARBOARD_MTX.lock().unwrap(); + // only for image for the time being, + // because I do not want to change behavior of text clipboard for the time being + if cn != self.1 .1 { + self.1 .1 = cn; + if let Ok(image) = self.0.get_image() { + if image.width > 0 && image.height > 0 { + return Ok(ClipboardData::image(image)); + } + } + } + Ok(ClipboardData::Text(self.0.get_text()?)) + } + + fn set(&mut self, data: &ClipboardData) -> ResultType<()> { + let _lock = ARBOARD_MTX.lock().unwrap(); + match data { + ClipboardData::Text(s) => self.0.set_text(s)?, + ClipboardData::Image(a, _) => self.0.set_image(a.clone())?, + _ => {} + } + Ok(()) + } +} + +impl Drop for ClipboardContext { + fn drop(&mut self) { + if let Some(shutdown) = self.2.take() { + let _ = shutdown.signal(); + } + } +} diff --git a/src/common.rs b/src/common.rs index 4da5ab3ff2..9717b248ae 100644 --- a/src/common.rs +++ b/src/common.rs @@ -1,5 +1,4 @@ use std::{ - borrow::Cow, collections::HashMap, future::Future, sync::{Arc, Mutex, RwLock}, @@ -8,141 +7,42 @@ use std::{ use serde_json::Value; -#[derive(Debug, Eq, PartialEq)] -pub enum GrabState { - Ready, - Run, - Wait, - Exit, -} - -use std::sync::mpsc; - -#[cfg(all(target_os = "linux", feature = "unix-file-copy-paste"))] -static X11_CLIPBOARD: once_cell::sync::OnceCell = - once_cell::sync::OnceCell::new(); - -#[cfg(all(target_os = "linux", feature = "unix-file-copy-paste"))] -fn get_clipboard() -> Result<&'static x11_clipboard::Clipboard, String> { - X11_CLIPBOARD - .get_or_try_init(|| x11_clipboard::Clipboard::new()) - .map_err(|e| e.to_string()) -} - -#[cfg(all(target_os = "linux", feature = "unix-file-copy-paste"))] -pub struct ClipboardContext { - string_setter: x11rb::protocol::xproto::Atom, - string_getter: x11rb::protocol::xproto::Atom, - text_uri_list: x11rb::protocol::xproto::Atom, - - clip: x11rb::protocol::xproto::Atom, - prop: x11rb::protocol::xproto::Atom, -} - -#[cfg(all(target_os = "linux", feature = "unix-file-copy-paste"))] -fn parse_plain_uri_list(v: Vec) -> Result { - let text = String::from_utf8(v).map_err(|_| "ConversionFailure".to_owned())?; - let mut list = String::new(); - for line in text.lines() { - if !line.starts_with("file://") { - continue; - } - let decoded = percent_encoding::percent_decode_str(line) - .decode_utf8() - .map_err(|_| "ConversionFailure".to_owned())?; - list = list + "\n" + decoded.trim_start_matches("file://"); - } - list = list.trim().to_owned(); - Ok(list) -} - -#[cfg(all(target_os = "linux", feature = "unix-file-copy-paste"))] -impl ClipboardContext { - pub fn new() -> Result { - let clipboard = get_clipboard()?; - let string_getter = clipboard - .getter - .get_atom("UTF8_STRING") - .map_err(|e| e.to_string())?; - let string_setter = clipboard - .setter - .get_atom("UTF8_STRING") - .map_err(|e| e.to_string())?; - let text_uri_list = clipboard - .getter - .get_atom("text/uri-list") - .map_err(|e| e.to_string())?; - let prop = clipboard.getter.atoms.property; - let clip = clipboard.getter.atoms.clipboard; - Ok(Self { - text_uri_list, - string_setter, - string_getter, - clip, - prop, - }) - } - - pub fn get_text(&mut self) -> Result { - let clip = self.clip; - let prop = self.prop; - - const TIMEOUT: std::time::Duration = std::time::Duration::from_millis(120); - - let text_content = get_clipboard()? - .load(clip, self.string_getter, prop, TIMEOUT) - .map_err(|e| e.to_string())?; - - let file_urls = get_clipboard()?.load(clip, self.text_uri_list, prop, TIMEOUT); - - if file_urls.is_err() || file_urls.as_ref().unwrap().is_empty() { - log::trace!("clipboard get text, no file urls"); - return String::from_utf8(text_content).map_err(|e| e.to_string()); - } - - let file_urls = parse_plain_uri_list(file_urls.unwrap())?; - - let text_content = String::from_utf8(text_content).map_err(|e| e.to_string())?; - - if text_content.trim() == file_urls.trim() { - log::trace!("clipboard got text but polluted"); - return Err(String::from("polluted text")); - } - - Ok(text_content) - } - - pub fn set_text(&mut self, content: String) -> Result<(), String> { - let clip = self.clip; - - let value = content.clone().into_bytes(); - get_clipboard()? - .store(clip, self.string_setter, value) - .map_err(|e| e.to_string())?; - Ok(()) - } -} - -#[cfg(not(any(target_os = "android", target_os = "ios")))] -use hbb_common::compress::decompress; use hbb_common::{ - allow_err, anyhow::{anyhow, Context}, bail, base64, bytes::Bytes, compress::compress as compress_func, config::{self, Config, CONNECT_TIMEOUT, READ_TIMEOUT}, futures_util::future::poll_fn, get_version_number, log, message_proto::*, protobuf::{Enum, Message as _}, proxy::IntoUrl, rendezvous_proto::*, socket_client, sodiumoxide::crypto::{box_, secretbox, sign}, tcp::FramedStream, timeout, tokio::{ + allow_err, + anyhow::{anyhow, Context}, + bail, base64, + bytes::Bytes, + config::{self, Config, CONNECT_TIMEOUT, READ_TIMEOUT, RENDEZVOUS_PORT}, + futures::future::join_all, + futures_util::future::poll_fn, + get_version_number, log, + message_proto::*, + protobuf::{Enum, Message as _}, + rendezvous_proto::*, + socket_client, + sodiumoxide::crypto::{box_, secretbox, sign}, + tcp::FramedStream, + timeout, + tokio::{ self, time::{Duration, Instant, Interval}, }, ResultType }; -// #[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))] -use hbb_common::{config::RENDEZVOUS_PORT, futures::future::join_all}; use crate::{ hbbs_http::create_http_client_async, ui_interface::{get_option, set_option}, }; -pub type NotifyMessageBox = fn(String, String, String, String) -> dyn Future; +#[derive(Debug, Eq, PartialEq)] +pub enum GrabState { + Ready, + Run, + Wait, + Exit, +} -pub const CLIPBOARD_NAME: &'static str = "clipboard"; -pub const CLIPBOARD_INTERVAL: u64 = 333; +pub type NotifyMessageBox = fn(String, String, String, String) -> dyn Future; // the executable name of the portable version pub const PORTABLE_APPNAME_RUNTIME_ENV_KEY: &str = "RUSTDESK_APPNAME"; @@ -169,11 +69,7 @@ pub mod input { } lazy_static::lazy_static! { - pub static ref CONTENT: Arc> = Default::default(); pub static ref SOFTWARE_UPDATE_URL: Arc> = Default::default(); -} - -lazy_static::lazy_static! { pub static ref DEVICE_ID: Arc> = Default::default(); pub static ref DEVICE_NAME: Arc> = Default::default(); } @@ -186,11 +82,6 @@ lazy_static::lazy_static! { static ref IS_MAIN: bool = std::env::args().nth(1).map_or(true, |arg| !arg.starts_with("--")); } -#[cfg(not(any(target_os = "android", target_os = "ios")))] -lazy_static::lazy_static! { - static ref ARBOARD_MTX: Arc> = Arc::new(Mutex::new(())); -} - pub struct SimpleCallOnReturn { pub b: bool, pub f: Box, @@ -259,48 +150,6 @@ pub fn valid_for_numlock(evt: &KeyEvent) -> bool { } } -pub fn create_clipboard_msg(content: String) -> Message { - let bytes = content.into_bytes(); - let compressed = compress_func(&bytes); - let compress = compressed.len() < bytes.len(); - let content = if compress { compressed } else { bytes }; - let mut msg = Message::new(); - msg.set_clipboard(Clipboard { - compress, - content: content.into(), - ..Default::default() - }); - msg -} - -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub fn check_clipboard( - ctx: &mut Option, - old: Option<&Arc>>, -) -> Option { - if ctx.is_none() { - *ctx = ClipboardContext::new().ok(); - } - let ctx2 = ctx.as_mut()?; - let side = if old.is_none() { "host" } else { "client" }; - let old = if let Some(old) = old { old } else { &CONTENT }; - let content = { - let _lock = ARBOARD_MTX.lock().unwrap(); - ctx2.get_text() - }; - if let Ok(content) = content { - if content.len() < 2_000_000 && !content.is_empty() { - let changed = content != *old.lock().unwrap(); - if changed { - log::info!("{} update found on {}", CLIPBOARD_NAME, side); - *old.lock().unwrap() = content.clone(); - return Some(create_clipboard_msg(content)); - } - } - } - None -} - /// Set sound input device. pub fn set_sound_input(device: String) { let prior_device = get_option("audio-input".to_owned()); @@ -349,34 +198,6 @@ pub fn get_default_sound_input() -> Option { None } -#[cfg(not(any(target_os = "android", target_os = "ios")))] -pub fn update_clipboard(clipboard: Clipboard, old: Option<&Arc>>) { - let content = if clipboard.compress { - decompress(&clipboard.content) - } else { - clipboard.content.into() - }; - if let Ok(content) = String::from_utf8(content) { - if content.is_empty() { - // ctx.set_text may crash if content is empty - return; - } - match ClipboardContext::new() { - Ok(mut ctx) => { - let side = if old.is_none() { "host" } else { "client" }; - let old = if let Some(old) = old { old } else { &CONTENT }; - *old.lock().unwrap() = content.clone(); - let _lock = ARBOARD_MTX.lock().unwrap(); - allow_err!(ctx.set_text(content)); - log::debug!("{} updated on {}", CLIPBOARD_NAME, side); - } - Err(err) => { - log::error!("Failed to create clipboard context: {}", err); - } - } - } -} - #[cfg(feature = "use_rubato")] pub fn resample_channels( data: &[f32], @@ -839,7 +660,32 @@ pub fn run_me>(args: Vec) -> std::io::Result>(); + if arg_strs == vec!["--install"] || arg_strs == &["--noinstall"] { + cmd.env(crate::platform::SET_FOREGROUND_WINDOW, "1"); + force_foreground = true; + } + } + let result = cmd.args(&args).spawn(); + match result.as_ref() { + Ok(_child) => + { + #[cfg(windows)] + if force_foreground { + unsafe { winapi::um::winuser::AllowSetForegroundWindow(_child.id() as u32) }; + } + } + Err(err) => log::error!("run_me: {err:?}"), + } + result } #[inline] @@ -1434,7 +1280,7 @@ pub fn using_public_server() -> bool { pub struct ThrottledInterval { interval: Interval, - last_tick: Instant, + next_tick: Instant, min_interval: Duration, } @@ -1443,7 +1289,7 @@ impl ThrottledInterval { let period = i.period(); ThrottledInterval { interval: i, - last_tick: Instant::now() - period * 2, + next_tick: Instant::now(), min_interval: Duration::from_secs_f64(period.as_secs_f64() * 0.9), } } @@ -1456,8 +1302,9 @@ impl ThrottledInterval { pub fn poll_tick(&mut self, cx: &mut std::task::Context<'_>) -> Poll { match self.interval.poll_tick(cx) { Poll::Ready(instant) => { - if self.last_tick.elapsed() >= self.min_interval { - self.last_tick = Instant::now(); + let now = Instant::now(); + if self.next_tick <= now { + self.next_tick = now + self.min_interval; Poll::Ready(instant) } else { // This call is required since tokio 1.27 @@ -1477,78 +1324,6 @@ pub fn rustdesk_interval(i: Interval) -> ThrottledInterval { ThrottledInterval::new(i) } -#[cfg(not(any( - target_os = "android", - target_os = "ios", - all(target_os = "linux", feature = "unix-file-copy-paste") -)))] -pub struct ClipboardContext(arboard::Clipboard); - -#[cfg(not(any( - target_os = "android", - target_os = "ios", - all(target_os = "linux", feature = "unix-file-copy-paste") -)))] -impl ClipboardContext { - #[inline] - #[cfg(any(target_os = "windows", target_os = "macos"))] - pub fn new() -> ResultType { - Ok(ClipboardContext(arboard::Clipboard::new()?)) - } - - #[cfg(target_os = "linux")] - pub fn new() -> ResultType { - let dur = arboard::Clipboard::get_x11_server_conn_timeout(); - let dur_bak = dur; - let _restore_timeout_on_ret = SimpleCallOnReturn { - b: true, - f: Box::new(move || arboard::Clipboard::set_x11_server_conn_timeout(dur_bak)), - }; - - for i in 1..4 { - arboard::Clipboard::set_x11_server_conn_timeout(dur * i); - match arboard::Clipboard::new() { - Ok(c) => return Ok(ClipboardContext(c)), - Err(arboard::Error::X11ServerConnTimeout) => continue, - Err(err) => return Err(err.into()), - } - } - bail!("Failed to create clipboard context, timeout"); - } - - #[inline] - #[cfg(any(target_os = "windows", target_os = "macos"))] - pub fn get_text(&mut self) -> ResultType { - Ok(self.0.get_text()?) - } - - #[cfg(target_os = "linux")] - pub fn get_text(&mut self) -> ResultType { - let dur = arboard::Clipboard::get_x11_server_conn_timeout(); - let dur_bak = dur; - let _restore_timeout_on_ret = SimpleCallOnReturn { - b: true, - f: Box::new(move || arboard::Clipboard::set_x11_server_conn_timeout(dur_bak)), - }; - - for i in 1..4 { - arboard::Clipboard::set_x11_server_conn_timeout(dur * i); - match self.0.get_text() { - Ok(s) => return Ok(s), - Err(arboard::Error::X11ServerConnTimeout) => continue, - Err(err) => return Err(err.into()), - } - } - bail!("Failed to get text, timeout"); - } - - #[inline] - pub fn set_text<'a, T: Into>>(&mut self, text: T) -> ResultType<()> { - self.0.set_text(text)?; - Ok(()) - } -} - pub fn load_custom_client() { #[cfg(debug_assertions)] if let Ok(data) = std::fs::read_to_string("./custom.txt") { @@ -1855,29 +1630,4 @@ mod tests { Duration::from_nanos(0) ); } - - #[tokio::test] - #[cfg(not(any( - target_os = "android", - target_os = "ios", - all(target_os = "linux", feature = "unix-file-copy-paste") - )))] - async fn test_clipboard_context() { - #[cfg(target_os = "linux")] - let dur = { - let dur = Duration::from_micros(500); - arboard::Clipboard::set_x11_server_conn_timeout(dur); - dur - }; - - let _ctx = ClipboardContext::new(); - #[cfg(target_os = "linux")] - { - assert_eq!( - arboard::Clipboard::get_x11_server_conn_timeout(), - dur, - "Failed to restore x11 server conn timeout" - ); - } - } } diff --git a/src/flutter.rs b/src/flutter.rs index 5f50658813..0cce2ae714 100644 --- a/src/flutter.rs +++ b/src/flutter.rs @@ -44,7 +44,7 @@ pub(crate) const APP_TYPE_CM: &str = "main"; pub type FlutterSession = Arc>; lazy_static::lazy_static! { - pub(crate) static ref CUR_SESSION_ID: RwLock = Default::default(); + pub(crate) static ref CUR_SESSION_ID: RwLock = Default::default(); // For desktop only static ref GLOBAL_EVENT_STREAM: RwLock>> = Default::default(); // rust to dart event channel } diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 3e7752ace7..7eb4c2ba24 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -786,6 +786,13 @@ pub fn main_show_option(_key: String) -> SyncReturn { } pub fn main_set_option(key: String, value: String) { + #[cfg(target_os = "android")] + if key.eq(config::keys::OPTION_ENABLE_KEYBOARD) { + crate::ui_cm_interface::notify_input_control(config::option2bool( + config::keys::OPTION_ENABLE_KEYBOARD, + &value, + )); + } if key.eq("custom-rendezvous-server") { set_option(key, value.clone()); #[cfg(target_os = "android")] @@ -2173,6 +2180,14 @@ pub fn main_has_valid_2fa_sync() -> SyncReturn { SyncReturn(has_valid_2fa()) } +pub fn main_verify_bot(token: String) -> String { + verify_bot(token) +} + +pub fn main_has_valid_bot_sync() -> SyncReturn { + SyncReturn(has_valid_bot()) +} + pub fn main_get_hard_option(key: String) -> SyncReturn { SyncReturn(get_hard_option(key)) } diff --git a/src/ipc.rs b/src/ipc.rs index f1141e041d..c344dc54ee 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -189,6 +189,8 @@ pub enum Data { MouseMoveTime(i64), Authorize, Close, + #[cfg(target_os = "android")] + InputControl(bool), #[cfg(windows)] SAS, UserSid(Option), diff --git a/src/lang.rs b/src/lang.rs index c53ac1c4f8..e8096bb244 100644 --- a/src/lang.rs +++ b/src/lang.rs @@ -2,6 +2,7 @@ use hbb_common::regex::Regex; use std::ops::Deref; mod ar; +mod be; mod bg; mod ca; mod cn; @@ -56,6 +57,7 @@ pub const LANGS: &[(&str, &str)] = &[ ("et", "Eesti keel"), ("hu", "Magyar"), ("bg", "Български"), + ("be", "Беларуская"), ("ru", "Русский"), ("sk", "Slovenčina"), ("id", "Indonesia"), @@ -153,6 +155,7 @@ pub fn translate_locale(name: String, locale: &str) -> String { "lv" => lv::T.deref(), "ar" => ar::T.deref(), "bg" => bg::T.deref(), + "be" => be::T.deref(), "he" => he::T.deref(), "hr" => hr::T.deref(), _ => en::T.deref(), diff --git a/src/lang/ar.rs b/src/lang/ar.rs index ab5e6a6291..808535f3ed 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/be.rs b/src/lang/be.rs new file mode 100644 index 0000000000..c76c203324 --- /dev/null +++ b/src/lang/be.rs @@ -0,0 +1,633 @@ +lazy_static::lazy_static! { +pub static ref T: std::collections::HashMap<&'static str, &'static str> = + [ + ("Status", "Статус"), + ("Your Desktop", "Ваш працоўны стол"), + ("desk_tip", "Ваш працоўны стол даступны з гэтым ID і паролем."), + ("Password", "Пароль"), + ("Ready", "Гатовы"), + ("Established", "Усталявана"), + ("connecting_status", "Падключэнне да сеткі RustDesk..."), + ("Enable service", "Уключыць службу"), + ("Start service", "Запусціць службу"), + ("Service is running", "Служба запушчана"), + ("Service is not running", "Служба не запушчана"), + ("not_ready_status", "Не падключана. Праверце злучэнне."), + ("Control Remote Desktop", "Кіраванне выдаленым працоўным сталом"), + ("Transfer file", "Перадаць файлы"), + ("Connect", "Падключыцца"), + ("Recent sessions", "Апошнія сеансы"), + ("Address book", "Адрасная кніга"), + ("Confirmation", "Пацвярджэнне"), + ("TCP tunneling", "TCP-тунэляванне"), + ("Remove", "Выдаліць"), + ("Refresh random password", "Абнавіць выпадковы пароль"), + ("Set your own password", "Усталяваць свой пароль"), + ("Enable keyboard/mouse", "Выкарыстоўваць клавіятуру/мыш"), + ("Enable clipboard", "Выкарыстоўваць буфер абмену"), + ("Enable file transfer", "Выкарыстоўваць перадачу файлаў"), + ("Enable TCP tunneling", "Выкарыстоўваць тунэляванне TCP"), + ("IP Whitelisting", "Спіс дазволеных IP-адрасоў"), + ("ID/Relay Server", "ID/Рэтранслятар"), + ("Import server config", "Імпартаваць канфігурацыю сервера"), + ("Export Server Config", "Экспартаваць канфігурацыю сервера"), + ("Import server configuration successfully", "Канфігурацыя сервера паспяхова імпартавана"), + ("Export server configuration successfully", "Канфігурацыя сервера паспяхова экспартавана"), + ("Invalid server configuration", "Няправільная канфігурацыя сервера"), + ("Clipboard is empty", "Буфер абмену пусты"), + ("Stop service", "Спыніць службу"), + ("Change ID", "Змяніць ID"), + ("Your new ID", "Новы ID"), + ("length %min% to %max%", "даўжыня %min%...%max%"), + ("starts with a letter", "пачынаецца з літары"), + ("allowed characters", "дазволеныя сімвалы"), + ("id_change_tip", "Дапускаюцца толькі сімвалы a-z, A-Z, 0-9 і _ (падкрэсліванне). Першай павінна быць літара a-z, A-Z. Даўжыня ад 6 да 16."), + ("Website", "Сайт"), + ("About", "Пра праграму"), + ("Slogan_tip", "Зроблена з душой у гэтым вар'яцкім свеце!"), + ("Privacy Statement", "Заява аб канфідэнцыяльнасці"), + ("Mute", "Адключыць гук"), + ("Build Date", "Дата зборкі"), + ("Version", "Версія"), + ("Home", "Галоўная"), + ("Audio Input", "Аўдыёўваход"), + ("Enhancements", "Палепшанні"), + ("Hardware Codec", "Апаратны кодэк"), + ("Adaptive bitrate", "Адаптыўны бітрэйт"), + ("ID Server", "Сервер ID"), + ("Relay Server", "Рэтранслятар"), + ("API Server", "Сервер API"), + ("invalid_http", "Адрас павінен пачынацца з http:// або https://"), + ("Invalid IP", "Няправільны IP-адрас"), + ("Invalid format", "Няправільны фармат"), + ("server_not_support", "Пакуль не падтрымліваецца серверам"), + ("Not available", "Недаступна"), + ("Too frequent", "Занадта часта"), + ("Cancel", "Адмяніць"), + ("Skip", "Прапусціць"), + ("Close", "Закрыць"), + ("Retry", "Паўтор"), + ("OK", "ОК"), + ("Password Required", "Патрабуецца пароль"), + ("Please enter your password", "Увядзіце пароль"), + ("Remember password", "Запомніць пароль"), + ("Wrong Password", "Няправільны пароль"), + ("Do you want to enter again?", "Паўтарыць уваход?"), + ("Connection Error", "Памылка падключэння"), + ("Error", "Памылка"), + ("Reset by the peer", "Скінута выдаленым вузлом"), + ("Connecting...", "Падключэнне..."), + ("Connection in progress. Please wait.", "Выконваецца падключэнне. Пачакайце."), + ("Please try 1 minute later", "Паспрабуйце праз хвіліну"), + ("Login Error", "Памылка ўваходу"), + ("Successful", "Паспяхова"), + ("Connected, waiting for image...", "Падключана, чаканне выявы..."), + ("Name", "Імя"), + ("Type", "Тып"), + ("Modified", "Зменена"), + ("Size", "Памер"), + ("Show Hidden Files", "Паказаць схаваныя файлы"), + ("Receive", "Атрымаць"), + ("Send", "Адправіць"), + ("Refresh File", "Абнавіць файл"), + ("Local", "Лакальны"), + ("Remote", "Выдалены"), + ("Remote Computer", "Выдалены камп'ютар"), + ("Local Computer", "Лакальны камп'ютар"), + ("Confirm Delete", "Пацвердзіць выдаленне"), + ("Delete", "Выдаліць"), + ("Properties", "Уласцівасці"), + ("Multi Select", "Шматлікі выбар"), + ("Select All", "Абраць усе"), + ("Unselect All", "Зняць усе"), + ("Empty Directory", "Пустая тэчка"), + ("Not an empty directory", "Тэчка не пустая"), + ("Are you sure you want to delete this file?", "Выдаліць гэты файл?"), + ("Are you sure you want to delete this empty directory?", "Выдаліць пустую тэчку?"), + ("Are you sure you want to delete the file of this directory?", "Выдаліць файл з гэтай тэчкі?"), + ("Do this for all conflicts", "Прымяніць да ўсіх канфліктаў"), + ("This is irreversible!", "Гэта неабаротна!"), + ("Deleting", "Выдаленне"), + ("files", "файлы"), + ("Waiting", "Чаканне"), + ("Finished", "Завершана"), + ("Speed", "Хуткасць"), + ("Custom Image Quality", "Якасць выявы па запыце"), + ("Privacy mode", "Рэжым прыватнасці"), + ("Block user input", "Забараніць ўвод на аддаленай прыладзе"), + ("Unblock user input", "Адблакіраваць ўвод на аддаленай прыладзе"), + ("Adjust Window", "Наладзіць акно"), + ("Original", "Арыгінал"), + ("Shrink", "Сціснуць"), + ("Stretch", "Расцягнуць"), + ("Scrollbar", "Паласа пракруткі"), + ("ScrollAuto", "Аўта-пракрутка"), + ("Good image quality", "Добрая якасць выявы"), + ("Balanced", "Баланс паміж якасцю і адказам"), + ("Optimize reaction time", "Оптымізацыя часу адказу"), + ("Custom", "Зададзена карыстальнікам"), + ("Show remote cursor", "Паказваць аддалены курсор"), + ("Show quality monitor", "Паказваць манітор якасці"), + ("Disable clipboard", "Адключыць буфер абмену"), + ("Lock after session end", "Заблакаваць уліковы запіс пасля сеансу"), + ("Insert", "Уставіць"), + ("Insert Lock", "Заблакаваць уліковы запіс"), + ("Refresh", "Абнавіць"), + ("ID does not exist", "ID не існуе"), + ("Failed to connect to rendezvous server", "Немагчыма падключыцца да паседкавага сервера"), + ("Please try later", "Паспрабуйце пазней"), + ("Remote desktop is offline", "Аддаленая прылада не ў сетцы"), + ("Key mismatch", "Неадпаведнасць ключоў"), + ("Timeout", "Час чакання скончыўся"), + ("Failed to connect to relay server", "Немагчыма падключыцца да рэтранслятара"), + ("Failed to connect via rendezvous server", "Немагчыма падключыцца праз паседкавы сервер"), + ("Failed to connect via relay server", "Немагчыма падключыцца праз рэтранслятар"), + ("Failed to make direct connection to remote desktop", "Не ўдалося ўсталяваць прамое падключэнне да аддаленага працоўнага стала"), + ("Set Password", "Усталяваць пароль"), + ("OS Password", "Пароль ўваходу ў аперацыйную сістэму"), + ("install_tip", "У некаторых выпадках RustDesk можа працаваць няправільна на аддаленым вузле з-за UAC. Каб пазбегнуць магчымых праблем з UAC, націсніце кнопку ніжэй для ўстаноўкі RustDesk у сістэме."), + ("Click to upgrade", "Абнавіць"), + ("Click to download", "Спампаваць"), + ("Click to update", "Абнавіць"), + ("Configure", "Наладзіць"), + ("config_acc", "Каб аддаленна кіраваць сваім працоўным сталом, вам неабходна дазволіць RustDesk правы доступу."), + ("config_screen", "Для аддаленага доступу да працоўнага сталу вам неабходна дазволіць RustDesk правы здымку экрана."), + ("Installing ...", "Ідзе ўстаноўка..."), + ("Install", "Усталяваць"), + ("Installation", "Устаноўка"), + ("Installation Path", "Шлях устаноўкі"), + ("Create start menu shortcuts", "Стварыць ярлыкі ў меню \"Пуск\""), + ("Create desktop icon", "Стварыць значок на працоўным стале"), + ("agreement_tip", "Пачынаючы ўстаноўку, вы прымаеце ўмовы ліцэнзійнага ўгоды."), + ("Accept and Install", "Прыняць і ўсталяваць"), + ("End-user license agreement", "Ліцэнзійная ўгода з канчатковым карыстальнікам"), + ("Generating ...", "Генеруецца..."), + ("Your installation is lower version.", "Ваша ўстаноўка ніжэйшай версіі"), + ("not_close_tcp_tip", "Не зачыняць гэта акно пры выкарыстанні тунэлю."), + ("Listening ...", "Праслухоўванне..."), + ("Remote Host", "Аддалены хост"), + ("Remote Port", "Аддалены порт"), + ("Action", "Дзеянне"), + ("Add", "Дадаць"), + ("Local Port", "Лакальны порт"), + ("Local Address", "Лакальны адрас"), + ("Change Local Port", "Змяніць лакальны порт"), + ("setup_server_tip", "Для хуткага падключэння наладзьце свой сервер."), + ("Too short, at least 6 characters.", "Занадта кароткі, мінімум 6 сімвалаў."), + ("The confirmation is not identical.", "Пацверджанне не супадае."), + ("Permissions", "Дазволы"), + ("Accept", "Прыняць"), + ("Dismiss", "Адхіліць"), + ("Disconnect", "Адключыць"), + ("Enable file copy and paste", "Дазволіць капіраванне і ўстаўку файлаў"), + ("Connected", "Падключана"), + ("Direct and encrypted connection", "Прамое і зашыфраванае падключэнне"), + ("Relayed and encrypted connection", "Рэтрансляванае і зашыфраванае падключэнне"), + ("Direct and unencrypted connection", "Прамое і незашыфраванае падключэнне"), + ("Relayed and unencrypted connection", "Рэтрансляванае і незашыфраванае падключэнне"), + ("Enter Remote ID", "Увядзіце дыстанцыйны ID"), + ("Enter your password", "Увядзіце пароль"), + ("Logging in...", "Уваход..."), + ("Enable RDP session sharing", "Дазволіць абмен сеансамі RDP"), + ("Auto Login", "Аўтаматычны ўваход у ўліковы запіс"), + ("Enable direct IP access", "Дазволіць прамы доступ па IP-адрасе"), + ("Rename", "Перайменаваць"), + ("Space", "Месца"), + ("Create desktop shortcut", "Стварыць ярлык на працоўным стале"), + ("Change Path", "Змяніць шлях"), + ("Create Folder", "Стварыць тэчку"), + ("Please enter the folder name", "Калі ласка, увядзіце імя тэчкі"), + ("Fix it", "Выправіць"), + ("Warning", "Папярэджанне"), + ("Login screen using Wayland is not supported", "Уваход у сістэму з выкарыстаннем Wayland не падтрымліваецца"), + ("Reboot required", "Патрабуецца перазагрузка"), + ("Unsupported display server", "Непадтрымліваемы сервер адлюстравання"), + ("x11 expected", "Чакаецца X11"), + ("Port", "Порт"), + ("Settings", "Налады"), + ("Username", "Імя карыстальніка"), + ("Invalid port", "Няправільны порт"), + ("Closed manually by the peer", "Зачынена аддаленым вузлом уручную"), + ("Enable remote configuration modification", "Дазволіць змену канфігурацыі аддалена"), + ("Run without install", "Запусціць без ўстаноўкі"), + ("Connect via relay", "Падключыцца праз рэтранслятар"), + ("Always connect via relay", "Заўсёды падключацца праз рэтранслятар"), + ("whitelist_tip", "Толькі IP-адрэсы з белага спісу могуць атрымаць доступ да маёй прылады."), + ("Login", "Увайсці"), + ("Verify", "Праверыць"), + ("Remember me", "Запомніць мяне"), + ("Trust this device", "Даверыць гэтую прыладу"), + ("Verification code", "Праверачны код"), + ("verification_tip", "Выяўлена новая прылада, на зарэгістраваны адрас электроннай пошты адпраўлены праверачны код. Увядзіце яго, каб працягнуць уваход у сістэму."), + ("Logout", "Выйсці"), + ("Tags", "Тэгі"), + ("Search ID", "Пошук по ID"), + ("whitelist_sep", "Аддзяліць запятой, коскай з запятой, прабелам ці новым радком."), + ("Add ID", "Дадаць ID"), + ("Add Tag", "Дадаць тэг"), + ("Unselect all tags", "Скасаваць выбар усіх тэгаў"), + ("Network error", "Памылка сеткі"), + ("Username missed", "Адсутнічае імя карыстальніка"), + ("Password missed", "Забыты пароль"), + ("Wrong credentials", "Няправільныя імя ці пароль"), + ("The verification code is incorrect or has expired", "Праверачны код няправільны або скончыўся тэрмін яго дзеяння"), + ("Edit Tag", "Рэдагаваць тэг"), + ("Forget Password", "Забыць пароль"), + ("Favorites", "Абранае"), + ("Add to Favorites", "Дадаць у абранае"), + ("Remove from Favorites", "Выдаліць з абранага"), + ("Empty", "Пуста"), + ("Invalid folder name", "Недапушчальнае імя тэчкі"), + ("Socks5 Proxy", "Socks5-проксі"), + ("Socks5/Http(s) Proxy", "Socks5/Http(s)-проксі"), + ("Discovered", "Знойдзена"), + ("install_daemon_tip", "Для запуску пры загрузцы неабходна ўстанавіць сістэмную службу"), + ("Remote ID", "Аддалены ID"), + ("Paste", "Уставіць"), + ("Paste here?", "Уставіць тут?"), + ("Are you sure to close the connection?", "Ці ўпэўненыя, што жадаеце закрыць падключэнне?"), + ("Download new version", "Спампаваць новую версію"), + ("Touch mode", "Рэжым сэнсарнага экрана"), + ("Mouse mode", "Рэжым мышы/трэкпада"), + ("One-Finger Tap", "Націск адным пальцам"), + ("Left Mouse", "Левая кнопка мышы"), + ("One-Long Tap", "Доўгі націск адным пальцам"), + ("Two-Finger Tap", "Націск двума пальцамі"), + ("Right Mouse", "Правая кнопка мышы"), + ("One-Finger Move", "Перамяшчэнне адным пальцам"), + ("Double Tap & Move", "Двайны націск і перамяшчэнне"), + ("Mouse Drag", "Перацягванне мышшу"), + ("Three-Finger vertically", "Трыма пальцамі па вертыкалі"), + ("Mouse Wheel", "Кола мышы"), + ("Two-Finger Move", "Перамяшчэнне двума пальцамі"), + ("Canvas Move", "Перамяшчэнне палатна"), + ("Pinch to Zoom", "Маштабаванне сціскам"), + ("Canvas Zoom", "Маштаб палатна"), + ("Reset canvas", "Скінуць палатно"), + ("No permission of file transfer", "Няма дазволу на перадачу файлаў"), + ("Note", "Нататка"), + ("Connection", "Падключэнне"), + ("Share Screen", "Дзяліцца экранам"), + ("Chat", "Чат"), + ("Total", "Усяго"), + ("items", "элементы"), + ("Selected", "Выбрана"), + ("Screen Capture", "Захоп экрана"), + ("Input Control", "Кіраванне ўводам"), + ("Audio Capture", "Захоп аўдыё"), + ("File Connection", "Падлучэнне перадачы файлаў"), + ("Screen Connection", "Падлучэнне прагляду/кіравання экранам"), + ("Do you accept?", "Ці вы згодны?"), + ("Open System Setting", "Адкрыць налады сістэмы"), + ("How to get Android input permission?", "Як атрымаць дазвол на ўвод Android?"), + ("android_input_permission_tip1", "Каб аддалёная прылада магла кіраваць вашай Android-прыладай з дапамогай мышы або націсканняў, неабходна дазволіць RustDesk выкарыстоўваць паслугу \"Асаблівыя магчымасці\"."), + ("android_input_permission_tip2", "Зайдзіце на адпаведную старонку сістэмных налад, знайдзіце і ўступіце ў \"Устаноўленыя паслугі\", уключыце паслугу \"RustDesk Input\"."), + ("android_new_connection_tip", "Атрыманы запыт на кіраванне вашай бягучай прыладай."), + ("android_service_will_start_tip", "Уключэнне захопу экрана аўтаматычна запускае службу, дазваляючы іншым прыладам запытаць падлучэнне да гэтай прылады."), + ("android_stop_service_tip", "Закрыццё службы аўтаматычна зачыніць усе ўстаноўленыя падлучэнні."), + ("android_version_audio_tip", "Бягучая версія Android не падтрымлівае захоп звуку, абнавіце яе да Android 10 ці вышэй."), + ("android_start_service_tip", "Націсніце [Запусціць службу] або дазвольце [Захоп экрана], каб запусціць службу дэманстрацыі экрана."), + ("android_permission_may_not_change_tip", "Дазволы для ўстаноўленых падлучэнняў не могуць быць змененыя, неабходна перападключэнне."), + ("Account", "Уліковы запіс"), + ("Overwrite", "Перазапісаць"), + ("This file exists, skip or overwrite this file?", "Файл існуе, прапусціць ці перазапісаць яго?"), + ("Quit", "Выйсці"), + ("Help", "Дапамога"), + ("Failed", "Не ўдалося"), + ("Succeeded", "Выканана"), + ("Someone turns on privacy mode, exit", "Хтосьці ўключыў рэжым прыватнасці, выхад"), + ("Unsupported", "Не падтрымліваецца"), + ("Peer denied", "Адмоўлена аддаленым вузлом"), + ("Please install plugins", "Усталюйце плагіны"), + ("Peer exit", "Аддалены вузел адключаны"), + ("Failed to turn off", "Немагчыма адключыць"), + ("Turned off", "Адключаны"), + ("Language", "Мова"), + ("Keep RustDesk background service", "Захаваць фонавую службу RustDesk"), + ("Ignore Battery Optimizations", "Ігнараваць аптымізацыю патрэблення батарэі"), + ("android_open_battery_optimizations_tip", "Перайдзіце на наступную старонку налад"), + ("Start on boot", "Запускаць пры загрузцы"), + ("Start the screen sharing service on boot, requires special permissions", "Запускаць службу дэманстрацыі экрана пры загрузцы (патрабуюцца спецыяльныя дазволы)"), + ("Connection not allowed", "Падключэнне не дазволена"), + ("Legacy mode", "Стары рэжым"), + ("Map mode", "Рэжым супастаўлення"), + ("Translate mode", "Рэжым перакладу"), + ("Use permanent password", "Выкарыстоўваць пастаянны пароль"), + ("Use both passwords", "Выкарыстоўваць абодва паролі"), + ("Set permanent password", "Устанавіць пастаянны пароль"), + ("Enable remote restart", "Дазволіць аддалены перазапуск"), + ("Restart remote device", "Перазапусціць аддаленую прыладу"), + ("Are you sure you want to restart", "Вы ўпэўненыя, што хочаце перазагрузіць?"), + ("Restarting remote device", "Перазапуск аддаленай прылады"), + ("remote_restarting_tip", "Аддаленая прылада перазапускаецца. Закрыйце гэтае паведамленне і праз некаторы час перападключыцеся, выкарыстоўваючы пастаянны пароль."), + ("Copied", "Скапіравана"), + ("Exit Fullscreen", "Выйсці з поўнаэкраннага рэжыму"), + ("Fullscreen", "Поўнаэкранны рэжым"), + ("Mobile Actions", "Мабільныя дзеянні"), + ("Select Monitor", "Выбраць манітор"), + ("Control Actions", "Дзеянні па кіраванню"), + ("Display Settings", "Налады адлюстравання"), + ("Ratio", "Суадносіны"), + ("Image Quality", "Якасць выявы"), + ("Scroll Style", "Стыль пракруткі"), + ("Show Toolbar", "Паказаць панэль інструментаў"), + ("Hide Toolbar", "Схаваць панэль інструментаў"), + ("Direct Connection", "Прамаое злучэнне"), + ("Relay Connection", "Рэтрансляванае злучэнне"), + ("Secure Connection", "Бяспечнае злучэнне"), + ("Insecure Connection", "Нябяспечнае злучэнне"), + ("Scale original", "Арыгінальны маштаб"), + ("Scale adaptive", "Адаптыўны маштаб"), + ("General", "Агульныя"), + ("Security", "Бяспека"), + ("Theme", "Тэма"), + ("Dark Theme", "Цёмная тэма"), + ("Light Theme", "Светлая тэма"), + ("Dark", "Цёмны"), + ("Light", "Светлы"), + ("Follow System", "Прытрымлівацца сістэмы"), + ("Enable hardware codec", "Уключыць апаратны кодэк"), + ("Unlock Security Settings", "Разблакаваць налады бяспекі"), + ("Enable audio", "Уключыць перадачу гуку"), + ("Unlock Network Settings", "Разблакаваць сеткавыя налады"), + ("Server", "Сервер"), + ("Direct IP Access", "Прамы IP-доступ"), + ("Proxy", "Проксі"), + ("Apply", "Прымяніць"), + ("Disconnect all devices?", "Адключыць усе прылады?"), + ("Clear", "Ачысціць"), + ("Audio Input Device", "Прылада ўводу гуку"), + ("Use IP Whitelisting", "Выкарыстоўваць белы спіс IP"), + ("Network", "Сетка"), + ("Pin Toolbar", "Закрэпіць панэль інструментаў"), + ("Unpin Toolbar", "Адкрэпіць панэль інструментаў"), + ("Recording", "Запіс"), + ("Directory", "Тэчка"), + ("Automatically record incoming sessions", "Аўтаматычна запісваць уваходныя сесіі"), + ("Change", "Змяніць"), + ("Start session recording", "Пачаць запіс сесіі"), + ("Stop session recording", "Спыніць запіс сесіі"), + ("Enable recording session", "Уключыць запіс сесіі"), + ("Enable LAN discovery", "Уключыць выяўленне ў лакальнай сетцы"), + ("Deny LAN discovery", "Забараніць выяўленне ў лакальнай сетцы"), + ("Write a message", "Напісаць паведамленне"), + ("Prompt", "Падказка"), + ("Please wait for confirmation of UAC...", "Дачакайцеся пацверджання UAC..."), + ("elevated_foreground_window_tip", "Бягучае акно аддаленага працоўнага стала патрабуе вышэйшых прывілегій для працы, таму часова немагчыма выкарыстоўваць мыш і клавіятуру. Можна папрасіць аддаленага карыстальніка згорнуць бягучае акно або націснуць кнопку павышэння правоў у акне кіравання падлучэннем. Каб прадухіліць гэтую праблему ў будучыні, рэкамендуецца ўстанавіць праграмнае забеспячэнне на аддаленай прыладзе."), + ("Disconnected", "Адключана"), + ("Other", "Іншае"), + ("Confirm before closing multiple tabs", "Пацвердзіць закрыццё некалькіх ўкладак"), + ("Keyboard Settings", "Налады клавіятуры"), + ("Full Access", "Поўны доступ"), + ("Screen Share", "Дэманстрацыя экрана"), + ("Wayland requires Ubuntu 21.04 or higher version.", "Wayland патрабуе Ubuntu версіі 21.04 або навейшай."), + ("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Для Wayland патрабуецца вышэйшая версія дыстрыбутыву Linux. Карыстайцеся працоўным сталом X11 або зменіце сваю АС."), + ("JumpLink", "Перайсці па спасылцы"), + ("Please Select the screen to be shared(Operate on the peer side).", "Выберыце экран для дэманстрацыі (кіруецца аддаленай стараной)."), + ("Show RustDesk", "Паказаць RustDesk"), + ("This PC", "Гэты кампутар"), + ("or", "або"), + ("Continue with", "Працягнуць з"), + ("Elevate", "Павысіць"), + ("Zoom cursor", "Павялічэнне курсора"), + ("Accept sessions via password", "Прымаць сеансы па паролю"), + ("Accept sessions via click", "Прымаць сеансы націскам кнопкі"), + ("Accept sessions via both", "Прымаць сеансы па паролю і націскам кнопкі"), + ("Please wait for the remote side to accept your session request...", "Дачакайцеся, пакуль аддаленая старана прыме ваш запыт на сеанс..."), + ("One-time Password", "Аднаразовы пароль"), + ("Use one-time password", "Выкарыстоўваць аднаразовы пароль"), + ("One-time password length", "Даўжыня аднагаразовага пароля"), + ("Request access to your device", "Запыт на доступ да вашай прылады"), + ("Hide connection management window", "Схаваць акно кіравання падлучэннямі"), + ("hide_cm_tip", "Дазваляць схаванне акна ў выпадку, калі прымаюцца сесіі па паролю або выкарыстоўваецца пастаянны пароль"), + ("wayland_experiment_tip", "Падтрымка Wayland знаходзіцца на эксперыментальнай стадыі, калі вам неабходны аўтаматычны доступ, выкарыстоўвайце X11."), + ("Right click to select tabs", "Правы клік для выбару ўкладак"), + ("Skipped", "Прапушчана"), + ("Add to address book", "Дадаць у адрасную кнігу"), + ("Group", "Група"), + ("Search", "Пошук"), + ("Closed manually by web console", "Закрыта ўручную праз вэб-кансоль"), + ("Local keyboard type", "Тып лакальнай клавіятуры"), + ("Select local keyboard type", "Выберыце тып лакальнай клавіятуры"), + ("software_render_tip", "Калі ў вас ёсць відэакарта Nvidia і аддаленае акно зачыняецца адразу пасля падлучэння, магчыма, дапаможа ўстаноўка драйвера Nouveau і выбар выкарыстання праграмнай візуалізацыі. Патрабуецца перазагрузка."), + ("Always use software rendering", "Заўсёды выкарыстоўваць праграмную візуалізацыю"), + ("config_input", "Каб кіраваць аддаленым працоўным сталом праз клавіятуру, неабходна дазволіць RustDesk маніторынг уводу."), + ("config_microphone", "Каб размаўляць з аддаленай старонкай, неабходна дазволіць RustDesk запіс аўдыё."), + ("request_elevation_tip", "Таксама можна запытаць павышэнне правоў, калі хто-небудзь знаходзіцца на аддаленай старонцы."), + ("Wait", "Чакайце"), + ("Elevation Error", "Памылка павышэння правоў"), + ("Ask the remote user for authentication", "Запытаць аўтэнтыфікацыю ў аддаленага карыстальніка"), + ("Choose this if the remote account is administrator", "Выберыце гэта, калі аддалены акаўнт з'яўляецца адміністратарам"), + ("Transmit the username and password of administrator", "Перадаць імя карыстальніка і пароль адміністратара"), + ("still_click_uac_tip", "Дагэтуль патрэбна, каб аддалены карыстальнік націснуў \"OK\" ў акне UAC пры запуску RustDesk."), + ("Request Elevation", "Запыт на павышэнне"), + ("wait_accept_uac_tip", "Пачакайце, пакуль аддалены карыстальнік пацвердзіць запыт UAC."), + ("Elevate successfully", "Павышэнне паспяхова выканана"), + ("uppercase", "Вялікія літары"), + ("lowercase", "Малыя літары"), + ("digit", "Лічбы"), + ("special character", "Спецыяльныя сімвалы"), + ("length>=8", "Даўжыня >= 8 сімвалаў"), + ("Weak", "Слабы"), + ("Medium", "Сярэдні"), + ("Strong", "Моцны"), + ("Switch Sides", "Пераключыць бакі"), + ("Please confirm if you want to share your desktop?", "Пацвердзіце, калі хочаце дазволіць паказ вашага працоўнага стала?"), + ("Display", "Адлюстраванне"), + ("Default View Style", "Стыль адлюстравання па змаўчанні"), + ("Default Scroll Style", "Стыль пракруткі па змаўчанні"), + ("Default Image Quality", "Якасць выявы па змаўчанні"), + ("Default Codec", "Кодэк па змаўчанні"), + ("Bitrate", "Бітрэйт"), + ("FPS", "Колькасць кадраў у секунду"), + ("Auto", "Аўта"), + ("Other Default Options", "Іншыя параметры па змаўчанні"), + ("Voice call", "Галасавы выклік"), + ("Text chat", "Тэкставы чат"), + ("Stop voice call", "Спыніць галасавы выклік"), + ("relay_hint_tip", "Непасрэднае падключэнне можа быць немагчымым. У гэтым выпадку можна спрабаваць падключыцца праз рэлей.\nАкрамя таго, калі вы хочаце адразу выкарыстоўваць рэлей, можна дадаць да ідэнтыфікатара суфікс \"/r\" або ўключыць \"Заўсёды падключацца праз рэлей\" ў наладах аддаленага вузла."), + ("Reconnect", "Перападключыць"), + ("Codec", "Кодэк"), + ("Resolution", "Разрознасць"), + ("No transfers in progress", "Перадача не ажыццяўляецца"), + ("Set one-time password length", "Усталяваць даўжыню аднаразовага пароля"), + ("RDP Settings", "Налады RDP"), + ("Sort by", "Сартаваць па"), + ("New Connection", "Новае злучэнне"), + ("Restore", "Аднавіць"), + ("Minimize", "Згарнуць"), + ("Maximize", "Разгарнуць"), + ("Your Device", "Ваша прылада"), + ("empty_recent_tip", "Няма апошніх сеансаў!\nЧас запланаваць новы."), + ("empty_favorite_tip", "Яшчэ няма выбраных аддаленых вузлоў?\nДавайце знойдзем, каго можна дадаць у выбранае."), + ("empty_lan_tip", "Не знойдзены аддаленыя вузлы."), + ("empty_address_book_tip", "У адраснай кнізе няма аддаленых вузлоў."), + ("eg: admin", "напрыклад: admin"), + ("Empty Username", "Пустае імя карыстальніка"), + ("Empty Password", "Пусты пароль"), + ("Me", "Я"), + ("identical_file_tip", "Файл ідэнтычны файлу на аддаленым вузле"), + ("show_monitors_tip", "Паказваць маніторы на панэлі інструментаў"), + ("View Mode", "Рэжым прагляду"), + ("login_linux_tip", "Каб ўключыць сеанс працоўнага стала X, неабходна ўвайсці ў аддалены акаўнт Linux."), + ("verify_rustdesk_password_tip", "Пацвердзіць пароль RustDesk"), + ("remember_account_tip", "Запомніць гэты акаўнт"), + ("os_account_desk_tip", "Гэты акаўнт выкарыстоўваецца для ўваходу ў аддаленую аперацыйную сістэму і ўключэння сеансу працоўнага сталу ў рэжыме headless."), + ("OS Account", "Акаўнт АС"), + ("another_user_login_title_tip", "Іншы карыстальнік ўжо ўвайшоў у сістэму"), + ("another_user_login_text_tip", "Адключыць"), + ("xorg_not_found_title_tip", "Xorg не знойдзены"), + ("xorg_not_found_text_tip", "Усталюйце Xorg"), + ("no_desktop_title_tip", "Няма даступных працоўных сталоў"), + ("no_desktop_text_tip", "Усталюйце GNOME Desktop"), + ("No need to elevate", "Павышэнне правоў не патрабуецца"), + ("System Sound", "Сістэмны гук"), + ("Default", "Па змаўчанні"), + ("New RDP", "Новы RDP"), + ("Fingerprint", "Адбітак"), + ("Copy Fingerprint", "Капіраваць адбітак"), + ("no fingerprints", "адбіткі адсутнічаюць"), + ("Select a peer", "Выберыце аддалены ўзел"), + ("Select peers", "Выберыце аддаленыя ўзлы"), + ("Plugins", "Плагіны"), + ("Uninstall", "Выдаліць"), + ("Update", "Абнавіць"), + ("Enable", "Уключыць"), + ("Disable", "Адключыць"), + ("Options", "Параметры"), + ("resolution_original_tip", "Арыгінальнае разознасць"), + ("resolution_fit_local_tip", "Супадзенне з лакальнай разрознасцю"), + ("resolution_custom_tip", "Карыстацкая разрознасць"), + ("Collapse toolbar", "Згарнуць панэль інструментаў"), + ("Accept and Elevate", "Прыняць і павысіць"), + ("accept_and_elevate_btn_tooltip", "Дазволіць падлучэнне і павысіць правы UAC."), + ("clipboard_wait_response_timeout_tip", "Час чакання адказу капіравання буфера абмену скончыўся"), + ("Incoming connection", "Уваходнае падлучэнне"), + ("Outgoing connection", "Выходнае падлучэнне"), + ("Exit", "Выхад"), + ("Open", "Адкрыць"), + ("logout_tip", "Вы сапраўды жадаеце выйсці?"), + ("Service", "Служба"), + ("Start", "Запусціць"), + ("Stop", "Спыніць"), + ("exceed_max_devices", "Дасягнута максімальная колькасць кіруемых прылад."), + ("Sync with recent sessions", "Сінхранізацыя з апошнімі сеансамі"), + ("Sort tags", "Сартаваць тэгі"), + ("Open connection in new tab", "Адкрыць падлучэнне ў новай ўкладцы"), + ("Move tab to new window", "Перамясціць ўкладку ў новае акно"), + ("Can not be empty", "Ня можа быць пустым"), + ("Already exists", "Ужо існуе"), + ("Change Password", "Змяніць пароль"), + ("Refresh Password", "Абнавіць пароль"), + ("ID", "ID"), + ("Grid View", "Сетка"), + ("List View", "Спіс"), + ("Select", "Выбар"), + ("Toggle Tags", "Пераключыць тэгі"), + ("pull_ab_failed_tip", "Немагчыма абнавіць адрасную кнігу"), + ("push_ab_failed_tip", "Немагчыма сінхранізаваць адрасную кнігу з серверам"), + ("synced_peer_readded_tip", "Прылады, якія былі на апошніх сеансах, будуць сінхранізаваны з адраснай кнігай."), + ("Change Color", "Змяніць колер"), + ("Primary Color", "Асноўны колер"), + ("HSV Color", "Колер HSV"), + ("Installation Successful!", "Інсталяцыя прайшла паспяхова!"), + ("Installation failed!", "Інсталяцыя не ўдалася!"), + ("Reverse mouse wheel", "Рэверс кола мышы"), + ("{} sessions", "{} сеансаў"), + ("scam_title", "Вы можаце быць АБМАНУТЫ!"), + ("scam_text1", "Калі вы размаўляеце па тэлефоне з кімсці, каго вы НЕ ВЕДАЕЦЕ і каму НЕ ДАВЕРАЕЦЕ, і ён просіць вас выкарыстаць RustDesk і запусціць яго службу, не працягвайце і неадкладна адмяніце размову."), + ("scam_text2", "Магчыма, гэта аферыст, які паспрабуе ўкрасць вашыя грошы або іншую асабістую інфармацыю."), + ("Don't show again", "Не паказваць больш"), + ("I Agree", "Я згодны"), + ("Decline", "Адхіліць"), + ("Timeout in minutes", "Час чакання (у хвілінах)"), + ("auto_disconnect_option_tip", "Аўтаматычна зачыняць уваходныя сеансы пры неактыўнасці карыстальніка"), + ("Connection failed due to inactivity", "Падлучэнне не ўдалося з-за неактыўнасці"), + ("Check for software update on startup", "Праверка абнаўленняў праграмы пры запуску"), + ("upgrade_rustdesk_server_pro_to_{}_tip", "Абнавіце RustDesk Server Pro да версіі {} або новейшай!"), + ("pull_group_failed_tip", "Немагчыма абнавіць групу"), + ("Filter by intersection", "Фільтраваць па перасячэнні"), + ("Remove wallpaper during incoming sessions", "Схаваць фон працоўнага стала падчас ўваходнага сеансу"), + ("Test", "Тэст"), + ("display_is_plugged_out_msg", "Дысплей адключаны, пераключыцеся на першы дысплей."), + ("No displays", "Няма дысплеяў"), + ("Open in new window", "Адкрыць у новым акне"), + ("Show displays as individual windows", "Паказваць дысплеі ў асобных акнах"), + ("Use all my displays for the remote session", "Выкарыстоўваць усе мае дысплеі для аддаленага сеансу"), + ("selinux_tip", "На вашай прыладзе ўключаны SELinux, што можа перашкаджаць правільнай працы RustDesk на кіруючым баку."), + ("Change view", "Змяніць выгляд"), + ("Big tiles", "Вялікія пліткі"), + ("Small tiles", "Маленькія пліткі"), + ("List", "Спіс"), + ("Virtual display", "Віртуальны дысплей"), + ("Plug out all", "Адключыць усё"), + ("True color (4:4:4)", "True color (4:4:4)"), + ("Enable blocking user input", "Дазволіць блакаванне ўводу карыстальніка на прыладзе"), + ("id_input_tip", "Можна ўвесці ідэнтыфікатар, просты IP-адрас або дамен з портам (<дамен>:<порт>).\nКаб атрымаць доступ да прылады на іншым серверы, дадайце адрас сервера (@<адрас_сервера>?key=<ключ_значэнне>), напрыклад:\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nКалі неабходна атрымаць доступ да прылады на грамадскім серверы, увядзіце \"@public\", ключ для грамадскага сервера не патрабуецца."), + ("privacy_mode_impl_mag_tip", "Рэжым 1"), + ("privacy_mode_impl_virtual_display_tip", "Рэжым 2"), + ("Enter privacy mode", "Уключыць рэжым канфідэнцыяльнасці"), + ("Exit privacy mode", "Адключыць рэжым канфідэнцыяльнасці"), + ("idd_not_support_under_win10_2004_tip", "Драйвер непрамога адлюстравання не падтрымліваецца. Патрабуецца Windows 10 версіі 2004 ці навейшая."), + ("input_source_1_tip", "Крыніца ўводу 1"), + ("input_source_2_tip", "Крыніца ўводу 2"), + ("Swap control-command key", "Памяняць месцамі значэнні кнопак Ctrl і Command"), + ("swap-left-right-mouse", "Памяняць месцамі значэнні левай і правай кнопак мышы"), + ("2FA code", "Код двухфактарнай аўтэнтыфікацыі"), + ("More", "Яшчэ"), + ("enable-2fa-title", "Выкарыстоўваць двухфактарную аўтэнтыфікацыю"), + ("enable-2fa-desc", "Наладзьце праграму аўтэнтыфікацыі. Выкарыстоўвайце, напрыклад, Authy, Microsoft або Google Authenticator на тэлефоне ці кампутары.\n\nСкануйце QR-код з дапамогай праграмы аўтэнтыфікацыі і ўвядзіце код, які пакажа гэта праграма, каб уключыць двухфактарную аўтэнтыфікацыю."), + ("wrong-2fa-code", "Немагчыма пацвердзіць код. Праверце код і налады мясцовага часу."), + ("enter-2fa-title", "Двухфактарная аутэнтыфікацыя"), + ("Email verification code must be 6 characters.", "Код верыфікацыі па электроннай пошце павінен складацца з 6 сімвалаў."), + ("2FA code must be 6 digits.", "Код двухфактарнай аутэнтыфікацыі павінен складацца з 6 лічбаў."), + ("Multiple Windows sessions found", "Знойдзена некалькі сеансаў Windows"), + ("Please select the session you want to connect to", "Выберыце сеанс, да якога вы жадаеце падключыцца"), + ("powered_by_me", "На аснове RustDesk"), + ("outgoing_only_desk_tip", "Гэта спецыялізаваная версія.\nВы можаце падключацца да іншых прылад, але іншыя прылады не могуць падключацца да вашай."), + ("preset_password_warning", "Гэта спецыялізаваная версія з устаноўленым загадзя паролем. Любы, хто ведае гэты пароль, можа атрымаць поўны кантроль над вашай прыладай. Калі гэта для вас нечакана, адразу выдаліце гэта праграмнае забеспячэнне."), + ("Security Alert", "Папярэджанне аб бяспецы"), + ("My address book", "Мая адрасная кніга"), + ("Personal", "Асабісты"), + ("Owner", "Уладальнік"), + ("Set shared password", "Устанавіць агульны пароль"), + ("Exist in", "Існуе ў"), + ("Read-only", "Толькі для чытання"), + ("Read/Write", "Чытанне і запіс"), + ("Full Control", "Поўны кантроль"), + ("share_warning_tip", "Палі вышэй з'яўляюцца агульнымі і бачнымі іншым."), + ("Everyone", "Усе"), + ("ab_web_console_tip", "Больш у вэб-кансолі"), + ("allow-only-conn-window-open-tip", "Дазволіць толькі падключэнне пры адкрытым акне RustDesk"), + ("no_need_privacy_mode_no_physical_displays_tip", "Фізічныя дысплеі адсутнічаюць, няма патрэбы выкарыстоўваць рэжым канфідэнцыяльнасці."), + ("Follow remote cursor", "Сачыць за аддаленага курсарам"), + ("Follow remote window focus", "Сачыць за фокусам аддаленага акна"), + ("default_proxy_tip", "Пратакол і порт па змаўчанні: Socks5 і 1080"), + ("no_audio_input_device_tip", "Прылада ўваходнага аудыё не знойдзена."), + ("Incoming", "Уваходныя"), + ("Outgoing", "Выходныя"), + ("Clear Wayland screen selection", "Адмяніць выбар экрана Wayland"), + ("clear_Wayland_screen_selection_tip", "Пасля адмены можна зноў выбраць экран для дэманстрацыі."), + ("confirm_clear_Wayland_screen_selection_tip", "Адмяніць выбар экрана Wayland?"), + ("android_new_voice_call_tip", "Атрыман новы запыт на галасавы выклік. Калі вы прымеце яго, гук пераключыцца на галасавае злучэнне."), + ("texture_render_tip", "Выкарыстоўваць візуалізацыю тэкстураў для павышэння каб плаўнасці выявы."), + ("Use texture rendering", "Візуалізацыя тэкстураў"), + ("Floating window", "Плавучае акно"), + ("floating_window_tip", "Дапамагае падтрымліваць фонавую службу RustDesk"), + ("Keep screen on", "Трымаць экран уключаным"), + ("Never", "Ніколі"), + ("During controlled", "Пры кіраванні"), + ("During service is on", "Пры запушчанай службе"), + ("Capture screen using DirectX", "Захоп экрана з выкарыстаннем DirectX"), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), + ].iter().cloned().collect(); +} diff --git a/src/lang/bg.rs b/src/lang/bg.rs index b72b245455..8283a7dbd5 100644 --- a/src/lang/bg.rs +++ b/src/lang/bg.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", "Дисплеят е изключен, превключете на първия монитор."), ("No displays", ""), - ("elevated_switch_display_msg", "Превключете към основния монитор, защото множество монитори не се поддържат в потребителски режим с повишени права."), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", "Индиректен драйвер за дисплей не се поддържа. Изисква се Windows 10, версия 2004 или по-нова."), - ("switch_display_elevated_connections_tip", "Превключването към неосновен дисплей не се поддържа в режим на потребител с повишени права, когато има множество връзки. Моля, опитайте отново след инсталация, ако искате да контролирате няколко дисплея."), ("input_source_1_tip", "Входен източник 1"), ("input_source_2_tip", "Входен източник 2"), - ("capture_display_elevated_connections_tip", "Заснемането на множество дисплеи не се поддържа в потребителския режим с повишени права. Моля, опитайте отново след инсталация, ако искате да контролирате няколко дисплея."), ("Swap control-command key", ""), ("swap-left-right-mouse", "Разменете левия и десния бутон на мишката"), ("2FA code", "Код за Двуфакторна удостоверяване"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index 1a59ae9c73..adf0975a24 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 553a4b27a9..05ccf7fd1b 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "测试"), ("display_is_plugged_out_msg", "显示器被拔出,切换到第一个显示器。"), ("No displays", "没有显示器。"), - ("elevated_switch_display_msg", "切换到主显示器,因为用户提权后,不支持多显示器画面。"), ("Open in new window", "在新的窗口中打开"), ("Show displays as individual windows", "在单个窗口中打开显示器"), ("Use all my displays for the remote session", "将我的所有显示器用于远程会话"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "进入隐私模式"), ("Exit privacy mode", "退出隐私模式"), ("idd_not_support_under_win10_2004_tip", "不支持 Indirect display driver 。需要 Windows 10 版本 2004 及更高的版本。"), - ("switch_display_elevated_connections_tip", "用户提权后,被控有多个连接,不能切换到非主显示器。若要控制多显示器,请安装后再试。"), ("input_source_1_tip", "输入源 1"), ("input_source_2_tip", "输入源 2"), - ("capture_display_elevated_connections_tip", "用户提权后,不能显示多个显示器。若要控制多显示器,请安装后再试。"), ("Swap control-command key", "交换 Control 键和 Command 键"), ("swap-left-right-mouse", "交换鼠标左右键"), ("2FA code", "双重认证代码"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", "被控期间"), ("During service is on", "服务开启期间"), ("Capture screen using DirectX", "使用 DirectX 捕获屏幕"), + ("Back", "回退"), + ("Apps", "应用"), + ("Volume up", "提升音量"), + ("Volume down", "降低音量"), + ("Power", "电源"), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", "确定要取消双重认证吗?"), + ("cancel-bot-confirm-tip", "确定要取消 Telegram 机器人吗?"), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 01cfd92563..be42f514fc 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "Test"), ("display_is_plugged_out_msg", "Obrazovka je odpojena, přepněte na první obrazovku."), ("No displays", "Žádné obrazovky"), - ("elevated_switch_display_msg", "Přepnout na primární obrazovku, protože více obrazovek není podporováno ve zvýšeném režimu."), ("Open in new window", "Otevřít v novém okně"), ("Show displays as individual windows", "Zobrazit obrazovky jako jednotlivá okna"), ("Use all my displays for the remote session", "Použít všechny mé obrazovky pro vzdálenou relaci"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "Vstup do režimu soukromí"), ("Exit privacy mode", "Ukončit režim soukromí"), ("idd_not_support_under_win10_2004_tip", "Ovladač nepřímého zobrazení není podporován. Je vyžadován systém Windows 10, verze 2004 nebo novější."), - ("switch_display_elevated_connections_tip", "Přepnutí na jinou než primární obrazovku není podporováno ve zvýšeném režimu, pokud existuje více připojení. Pokud chcete ovládat více obrazovek, zkuste to po instalaci znovu."), ("input_source_1_tip", "Vstupní zdroj 1"), ("input_source_2_tip", "Vstupní zdroj 2"), - ("capture_display_elevated_connections_tip", "Snímání více displejů není podporováno v uživatelském režimu se zvýšenými oprávněními. Pokud chcete ovládat více displejů, zkuste to znovu po instalaci."), ("Swap control-command key", "Prohození klávesy control-command"), ("swap-left-right-mouse", "Prohodit levé a pravé tlačítko myši"), ("2FA code", "2FA kód"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", "Během řízeného"), ("During service is on", "Během služby je v provozu"), ("Capture screen using DirectX", "Snímání obrazovky pomocí DirectX"), + ("Back", "Zpět"), + ("Apps", "Aplikace"), + ("Volume up", "Zvýšit hlasitost"), + ("Volume down", "Snížit hlasitost"), + ("Power", "Napájení"), + ("Telegram bot", "Telegram bot"), + ("enable-bot-tip", "Pokud tuto funkci povolíte, můžete od svého bota obdržet kód 2FA. Může také fungovat jako oznámení o připojení."), + ("enable-bot-desc", "1, Otevřete chat s @BotFather.\n2, Pošlete příkaz \"/newbot\". Po dokončení tohoto kroku obdržíte token.\n3, Spusťte chat s nově vytvořeným botem. Pro jeho aktivaci odešlete zprávu začínající lomítkem vpřed (\"/\"), například \"/hello\".\n"), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 3e4a673bdd..a68258b2f5 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index 90f4c898b1..ff412e4c20 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "Test"), ("display_is_plugged_out_msg", "Der Bildschirm ist nicht angeschlossen, schalten Sie auf den ersten Bildschirm um."), ("No displays", "Keine Bildschirme"), - ("elevated_switch_display_msg", "Wechseln Sie zum primären Bildschirm, da mehrere Bildschirme im erweiterten Benutzermodus nicht unterstützt werden."), ("Open in new window", "In einem neuen Fenster öffnen"), ("Show displays as individual windows", "Jeden Bildschirm in einem eigenen Fenster anzeigen"), ("Use all my displays for the remote session", "Alle meine Bildschirme für die Fernsitzung verwenden"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "Datenschutzmodus aktivieren"), ("Exit privacy mode", "Datenschutzmodus beenden"), ("idd_not_support_under_win10_2004_tip", "Indirekter Grafiktreiber wird nicht unterstützt. Windows 10, Version 2004 oder neuer ist erforderlich."), - ("switch_display_elevated_connections_tip", "Das Umschalten auf einen sekundären Bildschirm wird mit erhöhten Rechten nicht unterstützt, wenn mehrere Verbindungen bestehen. Bitte versuchen Sie es nach der Installation erneut, wenn Sie mehrere Bildschirme steuern möchten."), ("input_source_1_tip", "Eingangsquelle 1"), ("input_source_2_tip", "Eingangsquelle 2"), - ("capture_display_elevated_connections_tip", "Die Aufnahme von mehreren Bildschirmen wird im erweiterten Benutzermodus nicht unterstützt. Bitte versuchen Sie es nach der Installation erneut, wenn Sie mehrere Bildschirme steuern möchten."), ("Swap control-command key", "Steuerungs- und Befehlstasten tauschen"), ("swap-left-right-mouse", "Linke und rechte Maustaste tauschen"), ("2FA code", "2FA-Code"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", "Wenn kontrolliert"), ("During service is on", "Wenn der Dienst läuft"), ("Capture screen using DirectX", "Bildschirm mit DirectX aufnehmen"), + ("Back", "Zurück"), + ("Apps", "Apps"), + ("Volume up", "Lauter"), + ("Volume down", "Leiser"), + ("Power", "Power"), + ("Telegram bot", "Telegram-Bot"), + ("enable-bot-tip", "Wenn Sie diese Funktion aktivieren, können Sie den 2FA-Code von Ihrem Bot erhalten. Er kann auch als Verbindungsbenachrichtigung dienen."), + ("enable-bot-desc", "1. Öffnen Sie einen Chat mit @BotFather.\n2. Senden Sie den Befehl \"/newbot\". Sie erhalten ein Token, nachdem Sie diesen Schritt abgeschlossen haben.\n3. Starten Sie einen Chat mit Ihrem neu erstellten Bot. Senden Sie eine Nachricht, die mit einem Schrägstrich (\"/\") beginnt, z. B. \"/hello\", um ihn zu aktivieren.\n"), + ("cancel-2fa-confirm-tip", "Sind Sie sicher, dass Sie 2FA abbrechen möchten?"), + ("cancel-bot-confirm-tip", "Sind Sie sicher, dass Sie Telegram-Bot abbrechen möchten?"), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index 69fa86276c..eab1c7c1bc 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "Δοκιμή"), ("display_is_plugged_out_msg", "Η οθόνη έχει αποσυνδεθεί, επιστρέψτε στην κύρια οθόνη προβολής"), ("No displays", "Δεν υπάρχουν οθόνες"), - ("elevated_switch_display_msg", "Δεν επιτρέπονται πολλαπλές οθόνες κατά την σύνδεση με αυξημένα δικαιώματα. Συνδεθείτε στην κύρια οθόνη."), ("Open in new window", "Άνοιγμα σε νέο παράθυρο"), ("Show displays as individual windows", "Εμφάνιση οθονών σε ξεχωριστά παράθυρα"), ("Use all my displays for the remote session", "Χρήση όλων των οθονών της απομακρυσμένης σύνδεσης"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "Ενεργοποίηση λειτουργίας απορρήτου"), ("Exit privacy mode", "Διακοπή λειτουργίας απορρήτου"), ("idd_not_support_under_win10_2004_tip", "Το πρόγραμμα οδήγησης έμμεσης οθόνης δεν υποστηρίζεται. Απαιτείτε λειτουργικό σύστημα Windows 10 έκδοση 2004 ή νεότερο."), - ("switch_display_elevated_connections_tip", "Αλλαγή σε οθόνη πέρα απο την κύρια δεν υποστηρίζεται σε σύνδεση με αυξημένα δικαιώματα. Αν επιθυμείτε την σύνδεση σε πολλαπλές οθόνες, παρακαλώ εγκαταστήστε την εφαρμογή και δοκιμάστε εκ νέου"), ("input_source_1_tip", "Πηγή εισόδου 1"), ("input_source_2_tip", "Πηγή εισόδου 2"), - ("capture_display_elevated_connections_tip", "Η καταγραφή πολλαπλών οθονών δεν υποστηρίζεται σε σύνδεση με αυξημένα δικαιώματα. Αν επιθυμείτε την καταγραφή πολλαπλών οθονών, παρακαλώ εγκαταστήστε την εφαρμογή και δοκιμάστε εκ νέου"), ("Swap control-command key", "Εναλλαγή κουμπιών control-command"), ("swap-left-right-mouse", "Εναλλαγή αριστερό-δεξί κουμπί του ποντικιού"), ("2FA code", "κωδικός 2FA"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/en.rs b/src/lang/en.rs index d8aa388ec9..0205572455 100644 --- a/src/lang/en.rs +++ b/src/lang/en.rs @@ -198,16 +198,13 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("pull_group_failed_tip", "Failed to refresh group"), ("doc_fix_wayland", "https://rustdesk.com/docs/en/client/linux/#x11-required"), ("display_is_plugged_out_msg", "The display is plugged out, switch to the first display."), - ("elevated_switch_display_msg", "Switch to the primary display because multiple displays are not supported in elevated user mode."), ("selinux_tip", "SELinux is enabled on your device, which may prevent RustDesk from running properly as controlled side."), ("id_input_tip", "You can input an ID, a direct IP, or a domain with a port (:).\nIf you want to access a device on another server, please append the server address (@?key=), for example,\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nIf you want to access a device on a public server, please input \"@public\", the key is not needed for public server.\n\nIf you want to force the use of a relay connection on the first connection, add \"/r\" at the end of the ID, for example, \"9123456234/r\"."), ("privacy_mode_impl_mag_tip", "Mode 1"), ("privacy_mode_impl_virtual_display_tip", "Mode 2"), ("idd_not_support_under_win10_2004_tip", "Indirect display driver is not supported. Windows 10, version 2004 or newer is required."), - ("switch_display_elevated_connections_tip", "Switching to non-primary display is not supported in the elevated user mode when there are multiple connections. Please try again after installation if you want to control multiple displays."), ("input_source_1_tip", "Input source 1"), ("input_source_2_tip", "Input source 2"), - ("capture_display_elevated_connections_tip", "Capturing multiple displays is not supported in the elevated user mode. Please try again after installation if you want to control multiple displays."), ("swap-left-right-mouse", "Swap left-right mouse button"), ("2FA code", "2FA code"), ("enable-2fa-title", "Enable two-factor authentication"), @@ -230,5 +227,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "A new voice call request was received. If you accept, the audio will switch to voice communication."), ("texture_render_tip", "Use texture rendering to make the pictures smoother. You could try disabling this option if you encounter rendering issues."), ("floating_window_tip", "It helps to keep RustDesk background service"), + ("enable-bot-tip", "If you enable this feature, you can receive the 2FA code from your bot. It can also function as a connection notification."), + ("enable-bot-desc", "1, Open a chat with @BotFather.\n2, Send the command \"/newbot\". You will receive a token after completing this step.\n3, Start a chat with your newly created bot. Send a message beginning with a forward slash (\"/\") like \"/hello\" to activate it.\n"), + ("cancel-2fa-confirm-tip", "Are you sure you want to cancel 2FA?"), + ("cancel-bot-confirm-tip", "Are you sure you want to cancel Telegram bot?"), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index 1afae08701..733bc80ba7 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index 8fc97a9e9e..ca2d991070 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "Probar"), ("display_is_plugged_out_msg", "La pantalla está desconectada, cambia a la principal."), ("No displays", "No hay pantallas"), - ("elevated_switch_display_msg", "Cambiar a la pantalla principal porque mútliples pantallas no están soportadas en modo elevado."), ("Open in new window", "Abrir en una nueva ventana"), ("Show displays as individual windows", "Mostrar pantallas como ventanas individuales"), ("Use all my displays for the remote session", "Usar todas mis pantallas para la sesión remota"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "Entrar al modo privado"), ("Exit privacy mode", "Salir del modo privado"), ("idd_not_support_under_win10_2004_tip", "El controlador de pantalla indirecto no está soportado. Se necesita Windows 10, versión 2004 o superior."), - ("switch_display_elevated_connections_tip", "Cambiar a una pantalla no principal no está soportado en el modo elevado cuando hay múltiples conexiones. Por favor, inténtalo de nuevo tras la instalación si quieres controlar múltiples pantallas."), ("input_source_1_tip", "Fuente de entrada 1"), ("input_source_2_tip", "Fuente de entrada 2"), - ("capture_display_elevated_connections_tip", "La captura de múltiples pantallas en el modo de usaurio con privilegios elevados no está soportada. Por favor, inténtalo de nuevo tras la instalación si quieres controlar múltiples pantallas."), ("Swap control-command key", "Intercambiar teclas control-comando"), ("swap-left-right-mouse", "Intercambiar botones derecho-izquierdo del ratón"), ("2FA code", "Código 2FA"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", "Mientras está siendo controlado"), ("During service is on", "Mientras el servicio está activo"), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/et.rs b/src/lang/et.rs index f1d04fe274..43afea356e 100644 --- a/src/lang/et.rs +++ b/src/lang/et.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", "See kuvar on välja lülitatud, lülita esmasele kuvarile."), ("No displays", ""), - ("elevated_switch_display_msg", "Lülita ümber esmasele kuvarile, sest kõrgendatud kasutajarežiimis ei toetata mitut kuvarit."), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", "Kaudse kuvari draiver ei ole toetatud. Vajalik on Windows 10, versioon 2004 või uuem."), - ("switch_display_elevated_connections_tip", "Mitme ühenduse korral ei toetata kõrgendatud kasutajarežiimil üleminekut muule kui primaarsele kuvale. Kui soovid juhtida mitut ekraani, palun proovi uuesti pärast paigaldamist."), ("input_source_1_tip", "Sisendallikas 1"), ("input_source_2_tip", "Sisendallikas 2"), - ("capture_display_elevated_connections_tip", "Mitme ekraani jäädvustamine ei ole kõrgendatud kasutajarežiimis toetatud. Kui soovid juhtida mitut ekraani, palun proovi uuesti pärast paigaldamist."), ("Swap control-command key", ""), ("swap-left-right-mouse", "Vaheta vasak ja parem hiirenupp"), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index 189fd4e344..df6fb70668 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "تست"), ("display_is_plugged_out_msg", "صفحه نمایش قطع شده است، به صفحه نمایش اول بروید."), ("No displays", "بدون نمایشگر"), - ("elevated_switch_display_msg", "به صفحه نمایش اصلی بروید زیرا نمایشگرهای متعدد در حالت کاربر زیاد پشتیبانی نمی شوند."), ("Open in new window", "باز کردن در پنجره جدید"), ("Show displays as individual windows", "نمایش نمایشگرها به عنوان پنجره های جداگانه"), ("Use all my displays for the remote session", "از همه نمایشگرهای من برای جلسه راه دور استفاده کنید"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "ورود به حالت حریم خصوصی"), ("Exit privacy mode", "خروج از حالت حریم خصوصی"), ("idd_not_support_under_win10_2004_tip", "درایور نمایش غیر مستقیم پشتیبانی نمی شود. ویندوز 10، نسخه 2004 یا جدیدتر مورد نیاز است"), - ("switch_display_elevated_connections_tip", "هنگامی که چندین اتصال وجود دارد، تغییر به صفحه نمایش غیر اصلی در حالت کاربر با دسنرسی بالا پشتیبانی نمی شود. اگر می‌خواهید چند نمایشگر را کنترل کنید، لطفاً پس از نصب دوباره امتحان کنید."), ("input_source_1_tip", "منبع ورودی 1"), ("input_source_2_tip", "منبع ورودی 2"), - ("capture_display_elevated_connections_tip", "ضبط چندین نمایشگر در حالت کاربر بالا پشتیبانی نمی شود. اگر می‌خواهید چند نمایشگر را کنترل کنید، لطفاً پس از نصب دوباره امتحان کنید."), ("Swap control-command key", "گرفتن چندین نمایشگر در حالت کاربر زیاد پشتیبانی نمی شود. اگر می‌خواهید چند نمایشگر را کنترل کنید، لطفاً پس از نصب دوباره امتحان کنید."), ("swap-left-right-mouse", "دکمه چپ و راست ماوس را عوض کنید"), ("2FA code", "کد ورود 2 مرحله ای"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 0d8525dbf7..8ad0ca28ac 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", "L'écran est débranché, passez au premier écran."), ("No displays", "Aucun affichage"), - ("elevated_switch_display_msg", "Basculez vers l’affichage principal, car plusieurs affichages ne sont pas pris en charge en mode utilisateur avec privilèges."), ("Open in new window", "Ouvrir dans une nouvelle fenêtre"), ("Show displays as individual windows", "Montrer les affichages sous forme de fenêtres individuelles"), ("Use all my displays for the remote session", "Utiliser tous mes écrans pour la session à distance"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "Passer en mode confidentialité"), ("Exit privacy mode", "Quitter le mode confidentialité"), ("idd_not_support_under_win10_2004_tip", "Le pilote d'affichage indirect n'est pas pris en charge. Windows 10, version 2004 ou plus récente est requise."), - ("switch_display_elevated_connections_tip", "Le passage à l'affichage non principal n'est pas pris en charge en mode utilisateur avec privilèges lorsqu'il existe plusieurs connexions. Veuillez réessayer après l'installation si vous souhaitez contrôler plusieurs écrans."), ("input_source_1_tip", "Source entrée 1"), ("input_source_2_tip", "Source entrée 2"), - ("capture_display_elevated_connections_tip", "La capture de plusieurs écrans n'est pas prise en charge en mode utilisateur avec privilièges. Veuillez réessayer après l'installation si vous souhaitez contrôler plusieurs écrans."), ("Swap control-command key", "Échanger la touche de controle-commande"), ("swap-left-right-mouse", "Intervertir le bouton gauche et droit de la souris"), ("2FA code", "code 2FA"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/he.rs b/src/lang/he.rs index 1b415de90e..91a1753bd6 100644 --- a/src/lang/he.rs +++ b/src/lang/he.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", "המסך הופסק, החלף למסך הראשון."), ("No displays", ""), - ("elevated_switch_display_msg", "מעבר למסך הראשי מכיוון שתמיכה במסכים מרובים אינה נתמכת במצב משתמש מוגבה."), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", "נהג התצוגה העקיף אינו נתמך. נדרשת גרסת Windows 10, גרסה 2004 או חדשה יותר."), - ("switch_display_elevated_connections_tip", "מעבר למסך שאינו ראשי אינו נתמך במצב משתמש מוגבה כאשר יש מספר חיבורים. אנא נסה שוב לאחר התקנה אם ברצונך לשלוט במסכים מרובים."), ("input_source_1_tip", "מקור קלט 1"), ("input_source_2_tip", "מקור קלט 2"), - ("capture_display_elevated_connections_tip", "לכידת מסכים מרובים אינה נתמכת במצב משתמש מוגבה. אנא נסה שוב לאחר התקנה אם ברצונך לשלוט במסכים מרובים."), ("Swap control-command key", ""), ("swap-left-right-mouse", "החלף בין כפתור העכבר השמאלי לימני"), ("2FA code", "קוד אימות דו-שלבי"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hr.rs b/src/lang/hr.rs index e919325d40..2cf6edb94e 100644 --- a/src/lang/hr.rs +++ b/src/lang/hr.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "Test"), ("display_is_plugged_out_msg", "Zaslon je isključen, prijeđite na prvi zaslon."), ("No displays", "Nema zaslona"), - ("elevated_switch_display_msg", "Prijeđite na primarni zaslon jer više zaslona nije podržano u povišenom načinu rada."), ("Open in new window", "Otvori u novom prozoru"), ("Show displays as individual windows", "Prikaži zaslone kao pojedinačne prozore"), ("Use all my displays for the remote session", "Koristi sve moje zaslone za udaljenu sesiju"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "Uđite u način privatnosti"), ("Exit privacy mode", "Izađi iz načina privatnosti"), ("idd_not_support_under_win10_2004_tip", "Neizravni upravljački program za zaslon nije podržan. Potreban je Windows 10 verzija 2004 ili novija."), - ("switch_display_elevated_connections_tip", "Prebacivanje na zaslon koji nije primarni nije podržan u povišenom načinu rada kada postoji više veza. Ako želite kontrolirati više zaslona, pokušajte ponovno nakon instalacije."), ("input_source_1_tip", "Ulazni izvor 1"), ("input_source_2_tip", "Ulazni izvor 2"), - ("capture_display_elevated_connections_tip", "Skeniranje na više zaslona nije podržano u korisničkom načinu rada s povišenim pravima. Ako želite kontrolirati više zaslona, pokušajte ponovno nakon instalacije."), ("Swap control-command key", "Zamjena tipki control-command"), ("swap-left-right-mouse", "Zamjena lijeve i desne tipke miša"), ("2FA code", "2FA kôd"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 7bb267a865..1009f24904 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index e77ad45040..f051231b92 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "Tes"), ("display_is_plugged_out_msg", "Layar terputus, pindah ke layar pertama"), ("No displays", "Tidak ada tampilan"), - ("elevated_switch_display_msg", "Pindah ke tampilan utama, pada mode elevasi, pengggunaan lebih dari satu layar tidak diizinkan"), ("Open in new window", "Buka di jendela baru"), ("Show displays as individual windows", "Tampilkan dengan jendela terpisah"), ("Use all my displays for the remote session", "Gunakan semua layar untuk sesi remote"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "Masuk mode privasi"), ("Exit privacy mode", "Keluar mode privasi"), ("idd_not_support_under_win10_2004_tip", "Driver grafis yang Anda gunakan tidak kompatibel dengan versi Windows Anda dan memerlukan Windows 10 versi 2004 atau yang lebih baru"), - ("switch_display_elevated_connections_tip", "Pada mode elevasi, jika terdapat beberapa tampilan yang aktif, maka tidak diizinkan berpindah ke yang bukan tampilan utama, silahkan coba lagi setelah proses instalasi jika kamu ingin melakukan kontrol ke tampilan layar lainnya"), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index 27d8f19a04..626c6f7884 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "Test"), ("display_is_plugged_out_msg", "Lo schermo è scollegato, passo al primo schermo."), ("No displays", "Nessuno schermo"), - ("elevated_switch_display_msg", "Passo allo schermo principale perché in modalità elevata non sono supportati più schermi."), ("Open in new window", "Apri in una nuova finestra"), ("Show displays as individual windows", "Visualizza schermi come finestre individuali"), ("Use all my displays for the remote session", "Usa tutti gli schermi per la sessione remota"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "Entra in modalità privacy"), ("Exit privacy mode", "Esci dalla modalità privacy"), ("idd_not_support_under_win10_2004_tip", "Il driver video indiretto non è supportato. È richiesto Windows 10, versione 2004 o successiva."), - ("switch_display_elevated_connections_tip", "Nella modalità elevata quando sono presenti più connessioni non è supportato il passaggio allo schermo non primario. Se vuoi controllare più schermi riprova dopo l'installazione."), ("input_source_1_tip", "Sorgente ingresso (1)"), ("input_source_2_tip", "Sorgente ingresso (2)"), - ("capture_display_elevated_connections_tip", "La cattura di più display non è supportata nella modalità utente con privilegi elevati. Se vuoi controllare più display riprova dopo l'installazione."), ("Swap control-command key", "Scambia tasto controllo-comando"), ("swap-left-right-mouse", "Scambia pulsante sinistro-destro mouse"), ("2FA code", "Codice 2FA"), @@ -616,11 +613,21 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("texture_render_tip", "Usa il rendering texture per rendere le immagini più fluide. Se riscontri problemi di rendering prova a disabilitare questa opzione."), ("Use texture rendering", "Usa rendering texture"), ("Floating window", "Finestra galleggiante"), - ("floating_window_tip", "Aiuta a mantenere il servizio di RustDesk in background"), + ("floating_window_tip", "It helps to keep RustDesk background service"), ("Keep screen on", "Mantieni schermo acceso"), ("Never", "Mai"), ("During controlled", "Durante il controllo"), ("During service is on", "Quando il servizio è attivo"), ("Capture screen using DirectX", "Cattura schermo usando DirectX"), + ("Back", "Indietro"), + ("Apps", "App"), + ("Volume up", "Volume +"), + ("Volume down", "Volume -"), + ("Power", "Alimentazione"), + ("Telegram bot", "Bot Telgram"), + ("enable-bot-tip", "If you enable this feature, you can receive the 2FA code from your bot. It can also function as a connection notification."), + ("enable-bot-desc", "1, apri una chat con @BotFather.\n2, Invia il comando \"/newbot\", dopo aver completato questo passaggio riceverai un token.\n3, Avvia una chat con il tuo bot appena creato. Per attivarlo Invia un messaggio che inizia con una barra (\"/\") tipo \"/hello\".\n"), + ("cancel-2fa-confirm-tip", "Sei sicuro di voler annullare 2FA?"), + ("cancel-bot-confirm-tip", "Sei sicuro di voler annulare Telegram?"), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index c0bbf70389..33619dce1c 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index c101d15138..56167b968c 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "테스트"), ("display_is_plugged_out_msg", "디스플레이가 연결되어 있지 않습니다. 첫 번째 디스플레이로 전환하세요."), ("No displays", "디스플레이 없음"), - ("elevated_switch_display_msg", "권한 상승된 사용자 모드에서는 다중 디스플레이가 지원되지 않으므로 기본 디스플레이로 전환하세요."), ("Open in new window", "새 창에서 열기"), ("Show displays as individual windows", "디스플레이를 개별 창으로 표시"), ("Use all my displays for the remote session", "원격 세션에 내 디스플레이를 모두 사용"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "개인정보 보호 모드 사용"), ("Exit privacy mode", "개인정보 보호 모드 종료"), ("idd_not_support_under_win10_2004_tip", "간접 디스플레이 드라이버는 지원되지 않습니다. Windows 10 버전 2004 이상이 필요합니다."), - ("switch_display_elevated_connections_tip", "여러 연결이 있는 경우 권한 상승된 사용자 모드에서는 기본이 아닌 디스플레이로 전환이 지원되지 않습니다. 다중 디스플레이를 제어하려면 설치 후 재시도하세요."), ("input_source_1_tip", "입력소스 1"), ("input_source_2_tip", "입력소스 2"), - ("capture_display_elevated_connections_tip", "권한 상승된 사용자 모드에서는 다중 디스플레이 캡처가 지원되지 않습니다. 다중 디스플레이를 제어하려면 설치 후 재시도하세요."), ("Swap control-command key", "Control 및 Command 키 교체"), ("swap-left-right-mouse", "마우스 왼쪽 버튼과 오른쪽 버튼 바꾸기"), ("2FA code", "2단계 인증 코드"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index 8d5a214dde..f12bbf56a8 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index ab2dde495b..2d902966c2 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lv.rs b/src/lang/lv.rs index 1b00e7de2e..65384bc932 100644 --- a/src/lang/lv.rs +++ b/src/lang/lv.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "Pārbaudīt"), ("display_is_plugged_out_msg", "Displejs ir atvienots, pārslēdzieties uz pirmo displeju."), ("No displays", "Nav displeju"), - ("elevated_switch_display_msg", "Pārslēdzieties uz primāro displeju, jo paaugstinātajā režīmā netiek atbalstīti vairāki displeji."), ("Open in new window", "Atvērt jaunā logā"), ("Show displays as individual windows", "Rādīt displejus kā atsevišķus logus"), ("Use all my displays for the remote session", "Izmantot visus manus displejus attālajai sesijai"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "Ieiet privātuma režīmā"), ("Exit privacy mode", "Iziet no privātuma režīma"), ("idd_not_support_under_win10_2004_tip", "Netiešā displeja draiveris netiek atbalstīts. Nepieciešama operētājsistēma Windows 10, versija 2004 vai jaunāka."), - ("switch_display_elevated_connections_tip", "Pārslēgšanās uz ne primāro displeju netiek atbalstīta paaugstinātā lietotāja režīmā, ja ir vairāki savienojumi. Lūdzu, mēģiniet vēlreiz pēc instalēšanas, ja vēlaties kontrolēt vairākus displejus."), ("input_source_1_tip", "Ievades avots 1"), ("input_source_2_tip", "Ievades avots 2"), - ("capture_display_elevated_connections_tip", "Vairāku displeju uzņemšana netiek atbalstīta paaugstinātā lietotāja režīmā. Lūdzu, mēģiniet vēlreiz pēc instalēšanas, ja vēlaties kontrolēt vairākus displejus."), ("Swap control-command key", "Apmainīt vadības un komandas taustiņu"), ("swap-left-right-mouse", "Apmainīt kreiso un labo peles pogu"), ("2FA code", "2FA kods"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", "Lietošanas laikā"), ("During service is on", "Kamēr pakalpojums ir ieslēgts"), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nb.rs b/src/lang/nb.rs index edebfc7af8..4efdd3416d 100644 --- a/src/lang/nb.rs +++ b/src/lang/nb.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index 85d1d63a59..fce7668a02 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "Test"), ("display_is_plugged_out_msg", "Beeldscherm is uitgeschakeld, schakel over naar het primaire beeldscherm."), ("No displays", "Geen beeldschermen"), - ("elevated_switch_display_msg", "Schakel over naar het primaire beeldscherm, aangezien meerdere beeldschermen niet worden ondersteund in de modus met verhoogde rechten."), ("Open in new window", "Open in een nieuw venster"), ("Show displays as individual windows", "Beeldschermen weergeven als afzonderlijke vensters"), ("Use all my displays for the remote session", "Gebruik al mijn beeldschermen voor de externe sessie"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "Privacymodus openen"), ("Exit privacy mode", "Privacymodus afsluiten"), ("idd_not_support_under_win10_2004_tip", "Het indirecte displaystuurprogramma wordt niet ondersteund. Windows 10 versie 2004 of later is vereist."), - ("switch_display_elevated_connections_tip", "Overschakelen naar een niet-hoofdbeeldscherm wordt niet ondersteund in de verhoogde modus wanneer er meerdere verbindingen zijn. Probeer het opnieuw na de installatie als je meerdere schermen wilt beheren."), ("input_source_1_tip", "Invoerbron 1"), ("input_source_2_tip", "Invoerbron 2"), - ("capture_display_elevated_connections_tip", "Scannen van meerdere schermen wordt niet ondersteund in de bevoorrechte gebruikersmodus. Als je meerdere schermen wilt bedienen, probeer het dan opnieuw na de installatie."), ("Swap control-command key", "Wissel controle-commando toets"), ("swap-left-right-mouse", "wissel-links-rechts-muis"), ("2FA code", "2FA-code"), @@ -615,12 +612,22 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("android_new_voice_call_tip", "Er is een nieuwe spraakoproep ontvangen. Als u het aanvaardt, schakelt de audio over naar spraakcommunicatie."), ("texture_render_tip", "Pas textuurrendering toe om afbeeldingen vloeiender te maken."), ("Use texture rendering", "Textuurrendering gebruiken"), - ("Floating window", ""), - ("floating_window_tip", ""), - ("Keep screen on", ""), - ("Never", ""), - ("During controlled", ""), - ("During service is on", ""), - ("Capture screen using DirectX", ""), + ("Floating window", "Zwevend venster"), + ("floating_window_tip", "Helpt RustDesk op de achtergrond actief te houden"), + ("Keep screen on", "Scherm ingeschakeld laten"), + ("Never", "Nooit"), + ("During controlled", "Tijdens gecontroleerde"), + ("During service is on", "Tijdens actieve service"), + ("Capture screen using DirectX", "Scherm opnemen via DirectX"), + ("Back", "Terug"), + ("Apps", "Apps"), + ("Volume up", "Volume verhogen"), + ("Volume down", "Volume verlagen"), + ("Power", "Stroom"), + ("Telegram bot", "Telegram bot"), + ("enable-bot-tip", "Als u deze functie inschakelt, kunt u een 2FA-code ontvangen van uw bot. Het kan ook fungeren als een verbindingsmelding."), + ("enable-bot-desc", "1, Open een chat met @BotFather.\n2, Verzend het commando \"/newbot\". Als deze stap voltooid is, ontvang je een token.\n3, Start een chat met de nieuw aangemaakte bot. Om hem te activeren stuurt u een bericht dat begint met een schuine streep (\"/\"), bijvoorbeeld \"/hello\".\n"), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index 0f4707ddb9..71ec07e739 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "Test"), ("display_is_plugged_out_msg", "Ekran został odłączony, przełącz się na pierwszy ekran."), ("No displays", "Brak ekranów"), - ("elevated_switch_display_msg", "Przełącz się na ekran główny, ponieważ wyświetlanie kilku ekranów nie jest obsługiwane przy podniesionych uprawnieniach."), ("Open in new window", "Otwórz w nowym oknie"), ("Show displays as individual windows", "Pokaż ekrany w osobnych oknach"), ("Use all my displays for the remote session", "Użyj wszystkich moich ekranów do zdalnej sesji"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "Wejdź w tryb prywatności"), ("Exit privacy mode", "Wyjdź z trybu prywatności"), ("idd_not_support_under_win10_2004_tip", "Pośredni sterownik ekranu nie jest obsługiwany. Wymagany jest system Windows 10 w wersji 2004 lub nowszej."), - ("switch_display_elevated_connections_tip", "Przełączanie na ekran inny niż główny nie jest obsługiwane przy podniesionych uprawnieniach, gdy istnieje wiele połączeń. Jeśli chcesz sterować wieloma ekranami, należy zainstalować program."), ("input_source_1_tip", "Wejście źródła 1"), ("input_source_2_tip", "Wejście źródła 2"), - ("capture_display_elevated_connections_tip", "Przechwytywanie wielu ekranów nie jest obsługiwane w trybie użytkownika z podwyższonym poziomem uprawnień. Jeśli chcesz sterować wieloma wyświetlaczami, spróbuj ponownie po instalacji."), ("Swap control-command key", "Zamiana przycisków sterujących myszki"), ("swap-left-right-mouse", "Zamień przyciski myszki (LPM - RPM)"), ("2FA code", "Kod 2FA"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index e5b53e5593..3266ad2f69 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index 072426ff26..313296bed7 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "Teste"), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index acdd4a987b..371c0ed63c 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index aabbadf02b..d05145cd2a 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -239,7 +239,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Empty", "Пусто"), ("Invalid folder name", "Недопустимое имя папки"), ("Socks5 Proxy", "SOCKS5-прокси"), - ("Socks5/Http(s) Proxy", "Socks5/Http(s)-прокси"), + ("Socks5/Http(s) Proxy", "SOCKS5/HTTP(S)-прокси"), ("Discovered", "Найдено"), ("install_daemon_tip", "Для запуска при загрузке необходимо установить системную службу"), ("Remote ID", "Удалённый ID"), @@ -315,7 +315,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Use permanent password", "Использовать постоянный пароль"), ("Use both passwords", "Использовать оба пароля"), ("Set permanent password", "Установить постоянный пароль"), - ("Enable remote restart", "Разшешить удалённую перезагрузку"), + ("Enable remote restart", "Разрешить удалённую перезагрузку"), ("Restart remote device", "Перезапустить удалённое устройство"), ("Are you sure you want to restart", "Вы уверены, что хотите выполнить перезагрузку?"), ("Restarting remote device", "Перезагрузка удалённого устройства"), @@ -445,7 +445,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Voice call", "Голосовой вызов"), ("Text chat", "Текстовый чат"), ("Stop voice call", "Завершить голосовой вызов"), - ("relay_hint_tip", "Прямое подключение может оказаться невозможным. В этом случае можно попытаться подключиться через ретранслятор. \nКроме того, если вы хотите сразу использовать ретранслятор, можно добавить к ID суффикс \"/r\" или включить \"Всегда подключаться через ретранслятор\" в настройках удалённого узла."), + ("relay_hint_tip", "Прямое подключение может оказаться невозможным. В этом случае можно попытаться подключиться через ретранслятор.\nКроме того, если вы хотите сразу использовать ретранслятор, можно добавить к ID суффикс \"/r\" или включить \"Всегда подключаться через ретранслятор\" в настройках удалённого узла."), ("Reconnect", "Переподключить"), ("Codec", "Кодек"), ("Resolution", "Разрешение"), @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "Тест"), ("display_is_plugged_out_msg", "Дисплей отключён, переключитесь на первый дисплей."), ("No displays", "Нет дисплеев"), - ("elevated_switch_display_msg", "Переключитесь на основной дисплей, поскольку в режиме повышенных прав несколько дисплеев не поддерживаются."), ("Open in new window", "Открыть в новом окне"), ("Show displays as individual windows", "Показывать дисплеи в отдельных окнах"), ("Use all my displays for the remote session", "Использовать все мои дисплеи для удалённого сеанса"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "Включить режим конфиденциальности"), ("Exit privacy mode", "Отключить режим конфиденциальности"), ("idd_not_support_under_win10_2004_tip", "Драйвер непрямого отображения не поддерживается. Требуется Windows 10 версии 2004 или новее."), - ("switch_display_elevated_connections_tip", "Переключение на неосновной дисплей не поддерживается в режиме повышенных прав при наличии нескольких подключений. Повторите попытку после установки, если хотите управлять несколькими дисплеями."), ("input_source_1_tip", "Источник ввода 1"), ("input_source_2_tip", "Источник ввода 2"), - ("capture_display_elevated_connections_tip", "Захват экрана нескольких дисплеев не поддерживается в режиме повышенных прав. Повторите попытку после установки, если хотите управлять несколькими дисплеями."), ("Swap control-command key", "Поменять местами значения кнопок Ctrl и Command"), ("swap-left-right-mouse", "Поменять местами значения левой и правой кнопок мыши"), ("2FA code", "Код двухфакторной аутентификации"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", "При управлении"), ("During service is on", "При запущенной службе"), ("Capture screen using DirectX", "Захват экрана с помощью DirectX"), + ("Back", "Назад"), + ("Apps", "Приложения"), + ("Volume up", "Громкость+"), + ("Volume down", "Громкость-"), + ("Power", "Питание"), + ("Telegram bot", "Telegram-бот"), + ("enable-bot-tip", "Если включено, можно получать код двухфакторной аутентификации от бота. Он также может выполнять функцию уведомления о подключении."), + ("enable-bot-desc", "1) Откройте чат с @BotFather.\n2) Отправьте команду \"/newbot\". После выполнения этого шага вы получите токен.\n3) Начните чат с вашим только что созданным ботом. Отправьте сообщение, начинающееся с прямой косой черты (\"/\"), например, \"/hello\", чтобы его активировать.\n"), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 137a9bea3d..c7da584333 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "Test"), ("display_is_plugged_out_msg", "Obrazovka je odpojená, prepnite na prvú obrazovku."), ("No displays", "Žiadne obrazovky"), - ("elevated_switch_display_msg", "Prepnite na primárnu obrazovku, pretože viacero obrazoviek nie je podporovaných vo zvýšenom režime."), ("Open in new window", "Otvoriť v novom okne"), ("Show displays as individual windows", "Zobraziť obrazovky ako jednotlivé okná"), ("Use all my displays for the remote session", "Použiť všetky moje obrazovky pre vzdialenú reláciu"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "Vstup do režimu súkromia"), ("Exit privacy mode", "Ukončiť režim súkromia"), ("idd_not_support_under_win10_2004_tip", "Ovládač nepriameho zobrazenia nie je podporovaný. Vyžaduje sa systém Windows 10, verzia 2004 alebo novšia."), - ("switch_display_elevated_connections_tip", "Prepínanie na inú ako primárnu obrazovku nie je podporované vo zvýšenom režime, ak existuje viacero pripojení. Ak chcete ovládať viacero obrazoviek, skúste to po inštalácii znova."), ("input_source_1_tip", "Vstupný zdroj 1"), ("input_source_2_tip", "Vstupný zdroj 2"), - ("capture_display_elevated_connections_tip", "Snímanie viacerých displejov nie je podporované v režime privilegovaného používateľa. Ak chcete ovládať viac displejov, skúste to po inštalácii znova."), ("Swap control-command key", "Vymeniť kláves ovládania a príkazu"), ("swap-left-right-mouse", "Prehodiť ľavé a pravé tlačidlo myši"), ("2FA code", "2FA kód"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", "Počas kontrolovaného"), ("During service is on", "Počas služby je v prevádzke"), ("Capture screen using DirectX", "Snímanie obrazovky pomocou DirectX"), + ("Back", "Naspäť"), + ("Apps", "Aplikácie"), + ("Volume up", "Zvýšiť hlasitosť"), + ("Volume down", "Znížiť hlasitosť"), + ("Power", "Napájanie"), + ("Telegram bot", "Telegram bot"), + ("enable-bot-tip", "Ak túto funkciu povolíte, kód 2FA môžete dostať od svojho bota. Môže fungovať aj ako upozornenie na pripojenie."), + ("enable-bot-desc", "1, Otvorte chat s @BotFather.\n2, Odošlite príkaz \"/newbot\". Po dokončení tohto kroku dostanete token.\n3, Spustite chat s novo vytvoreným botom. Odošlite správu začínajúcu lomítkom vpred (\"/\"), napríklad \"/hello\", aby ste ho aktivovali.\n"), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index dcf5192d9b..6eda0b9448 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index d7abb5b4a6..3767b20dde 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 8c3cea8b69..aee79c3651 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index 2aceeba286..6bbee4b196 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 3166f91949..787cadc016 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index 2c4e32aaaf..05bab55ee1 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index 47a7a133a9..e7aab8d1af 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index a1046ed009..d2bb51b7f2 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "測試"), ("display_is_plugged_out_msg", "螢幕已被拔除,切換到第一個螢幕。"), ("No displays", "沒有已連結的螢幕"), - ("elevated_switch_display_msg", "由於權限提升模式不支援多螢幕,所以切換至主螢幕"), ("Open in new window", "在新視窗中開啟"), ("Show displays as individual windows", "在各別的視窗開啟螢幕畫面"), ("Use all my displays for the remote session", "使用所有的螢幕用於遠端連線"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "進入隱私模式"), ("Exit privacy mode", "退出隱私模式"), ("idd_not_support_under_win10_2004_tip", "不支援 Indirect display driver。 需要 Windows 10 版本 2004 或更新的版本。"), - ("switch_display_elevated_connections_tip", "在有多個連線時,切換到非主螢幕在權限提升模式下不支援。如果您想要控制多個螢幕,請在安裝後再試一次。"), ("input_source_1_tip", "輸入源 1"), ("input_source_2_tip", "輸入源 2"), - ("capture_display_elevated_connections_tip", "不支援在權限提升模式下擷取多個螢幕畫面,如果您想要控制多個螢幕,請安裝後再試。"), ("Swap control-command key", "交換 Control 和 Command 按鍵"), ("swap-left-right-mouse", "交換滑鼠左右鍵"), ("2FA code", "二步驟驗證碼"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", "被控期間"), ("During service is on", "服務開啟期間"), ("Capture screen using DirectX", "使用 DirectX 擷取螢幕"), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ua.rs b/src/lang/ua.rs index a393d5123e..b08afc4b9b 100644 --- a/src/lang/ua.rs +++ b/src/lang/ua.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", "Тест"), ("display_is_plugged_out_msg", "Дисплей відключено, перемкніться на перший дисплей"), ("No displays", "Відсутні дисплеї"), - ("elevated_switch_display_msg", "Перемкніться на основний дисплей, оскільки в режимі розширених прав одночасне використання декілька дисплеїв не підтримуються."), ("Open in new window", "Відкрити в новому вікні"), ("Show displays as individual windows", "Показувати дисплеї в окремих вікнах"), ("Use all my displays for the remote session", "Використовувати всі мої дисплеї для віддаленого сеансу"), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", "Увійти в режим конфіденційності"), ("Exit privacy mode", "Вийти з режиму конфіденційності"), ("idd_not_support_under_win10_2004_tip", "Драйвер непрямого відображення не підтримується. Потрібна Windows 10 версії 2004 або новіше."), - ("switch_display_elevated_connections_tip", "В режимі розширених прав, коли є декілька підключень, не підтримується перемикання на неосновний дисплей. Якщо ви хочете керувати декількома дисплеями, будь ласка, спробуйте це після встановлення."), ("input_source_1_tip", "Джерело введення 1"), ("input_source_2_tip", "Джерело введення 2"), - ("capture_display_elevated_connections_tip", "В режимі розширених прав захоплення декількох дисплеїв не підтримується. Якщо ви хочете керувати декількома дисплеями, будь ласка, спробуйте це після встановлення."), ("Swap control-command key", "Поміняти місцями клавіші Control та Command"), ("swap-left-right-mouse", "Поміняти місцями ліву та праву кнопки миші"), ("2FA code", "Код двофакторної автентифікації"), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", "Коли керується"), ("During service is on", "Коли запущена служба"), ("Capture screen using DirectX", "Захоплення екрана з використанням DirectX"), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index acefe2fa56..daa0171bb8 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -551,7 +551,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Test", ""), ("display_is_plugged_out_msg", ""), ("No displays", ""), - ("elevated_switch_display_msg", ""), ("Open in new window", ""), ("Show displays as individual windows", ""), ("Use all my displays for the remote session", ""), @@ -570,10 +569,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Enter privacy mode", ""), ("Exit privacy mode", ""), ("idd_not_support_under_win10_2004_tip", ""), - ("switch_display_elevated_connections_tip", ""), ("input_source_1_tip", ""), ("input_source_2_tip", ""), - ("capture_display_elevated_connections_tip", ""), ("Swap control-command key", ""), ("swap-left-right-mouse", ""), ("2FA code", ""), @@ -622,5 +619,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("During controlled", ""), ("During service is on", ""), ("Capture screen using DirectX", ""), + ("Back", ""), + ("Apps", ""), + ("Volume up", ""), + ("Volume down", ""), + ("Power", ""), + ("Telegram bot", ""), + ("enable-bot-tip", ""), + ("enable-bot-desc", ""), + ("cancel-2fa-confirm-tip", ""), + ("cancel-bot-confirm-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lib.rs b/src/lib.rs index 1794dff9da..f8d917a518 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -47,6 +47,8 @@ mod custom_server; mod lang; #[cfg(not(any(target_os = "android", target_os = "ios")))] mod port_forward; +#[cfg(not(any(target_os = "android", target_os = "ios")))] +mod clipboard; #[cfg(all(feature = "flutter", feature = "plugin_framework"))] #[cfg(not(any(target_os = "android", target_os = "ios")))] diff --git a/src/platform/mod.rs b/src/platform/mod.rs index 65d047cff1..fe66e50dc6 100644 --- a/src/platform/mod.rs +++ b/src/platform/mod.rs @@ -104,8 +104,11 @@ pub fn get_wakelock(_display: bool) -> WakeLock { hbb_common::log::info!("new wakelock, require display on: {_display}"); #[cfg(target_os = "android")] return crate::platform::WakeLock::new("server"); + // display: keep screen on + // idle: keep cpu on + // sleep: prevent system from sleeping, even manually #[cfg(not(target_os = "android"))] - return crate::platform::WakeLock::new(_display, true, true); + return crate::platform::WakeLock::new(_display, true, false); } pub(crate) struct InstallingService; // please use new diff --git a/src/platform/windows.rs b/src/platform/windows.rs index c3cd5567fe..93b209839f 100644 --- a/src/platform/windows.rs +++ b/src/platform/windows.rs @@ -68,6 +68,7 @@ use winreg::RegKey; pub const FLUTTER_RUNNER_WIN32_WINDOW_CLASS: &'static str = "FLUTTER_RUNNER_WIN32_WINDOW"; // main window, install window pub const EXPLORER_EXE: &'static str = "explorer.exe"; +pub const SET_FOREGROUND_WINDOW: &'static str = "SET_FOREGROUND_WINDOW"; pub fn get_focused_display(displays: Vec) -> Option { unsafe { @@ -461,8 +462,18 @@ const SERVICE_TYPE: ServiceType = ServiceType::OWN_PROCESS; extern "C" { fn get_current_session(rdp: BOOL) -> DWORD; - fn LaunchProcessWin(cmd: *const u16, session_id: DWORD, as_user: BOOL, token_pid: &mut DWORD) -> HANDLE; - fn GetSessionUserTokenWin(lphUserToken: LPHANDLE, dwSessionId: DWORD, as_user: BOOL, token_pid: &mut DWORD) -> BOOL; + fn LaunchProcessWin( + cmd: *const u16, + session_id: DWORD, + as_user: BOOL, + token_pid: &mut DWORD, + ) -> HANDLE; + fn GetSessionUserTokenWin( + lphUserToken: LPHANDLE, + dwSessionId: DWORD, + as_user: BOOL, + token_pid: &mut DWORD, + ) -> BOOL; fn selectInputDesktop() -> BOOL; fn inputDesktopSelected() -> BOOL; fn is_windows_server() -> BOOL; @@ -2517,3 +2528,15 @@ fn nt_terminate_process(process_id: DWORD) -> ResultType<()> { } } } + +pub fn try_set_window_foreground(window: HWND) { + let env_key = SET_FOREGROUND_WINDOW; + if let Ok(value) = std::env::var(env_key) { + if value == "1" { + unsafe { + SetForegroundWindow(window); + } + std::env::remove_var(env_key); + } + } +} diff --git a/src/privacy_mode/win_virtual_display.rs b/src/privacy_mode/win_virtual_display.rs index 04a9d776cd..fd562c8e7a 100644 --- a/src/privacy_mode/win_virtual_display.rs +++ b/src/privacy_mode/win_virtual_display.rs @@ -34,7 +34,7 @@ const CONFIG_KEY_REG_RECOVERY: &str = "reg_recovery"; struct Display { dm: DEVMODEW, name: [WCHAR; 32], - primary: bool, + _primary: bool, } pub struct PrivacyModeImpl { @@ -135,7 +135,7 @@ impl PrivacyModeImpl { let display = Display { dm, name: dd.DeviceName, - primary, + _primary: primary, }; let ds = virtual_display_manager::get_cur_device_string(); @@ -149,38 +149,11 @@ impl PrivacyModeImpl { } } - fn restore(&mut self) { - Self::restore_displays(&self.displays); - Self::restore_displays(&self.virtual_displays); - allow_err!(Self::commit_change_display(0)); - self.restore_plug_out_monitor(); - } - fn restore_plug_out_monitor(&mut self) { let _ = virtual_display_manager::plug_out_monitor_indices(&self.virtual_displays_added); self.virtual_displays_added.clear(); } - fn restore_displays(displays: &[Display]) { - for display in displays { - unsafe { - let mut dm = display.dm.clone(); - let flags = if display.primary { - CDS_NORESET | CDS_UPDATEREGISTRY | CDS_SET_PRIMARY - } else { - CDS_NORESET | CDS_UPDATEREGISTRY - }; - ChangeDisplaySettingsExW( - display.name.as_ptr(), - &mut dm, - std::ptr::null_mut(), - flags, - std::ptr::null_mut(), - ); - } - } - } - fn set_primary_display(&mut self) -> ResultType<()> { let display = &self.virtual_displays[0]; @@ -431,7 +404,7 @@ impl PrivacyMode for PrivacyModeImpl { ) -> ResultType<()> { self.check_off_conn_id(conn_id)?; super::win_input::unhook()?; - self.restore(); + self.restore_plug_out_monitor(); restore_reg_connectivity(false); if self.conn_id != INVALID_PRIVACY_MODE_CONN_ID { diff --git a/src/server/clipboard_service.rs b/src/server/clipboard_service.rs index 34e1635eb8..eeeea4999c 100644 --- a/src/server/clipboard_service.rs +++ b/src/server/clipboard_service.rs @@ -1,29 +1,29 @@ use super::*; -pub use crate::common::{ +pub use crate::clipboard::{ check_clipboard, ClipboardContext, CLIPBOARD_INTERVAL as INTERVAL, CLIPBOARD_NAME as NAME, CONTENT, }; +#[derive(Default)] struct State { ctx: Option, } -impl Default for State { - fn default() -> Self { - let ctx = match ClipboardContext::new() { +impl super::service::Reset for State { + fn reset(&mut self) { + *CONTENT.lock().unwrap() = Default::default(); + self.ctx = None; + } + + fn init(&mut self) { + let ctx = match ClipboardContext::new(true) { Ok(ctx) => Some(ctx), Err(err) => { log::error!("Failed to start {}: {}", NAME, err); None } }; - Self { ctx } - } -} - -impl super::service::Reset for State { - fn reset(&mut self) { - *CONTENT.lock().unwrap() = Default::default(); + self.ctx = ctx; } } @@ -38,9 +38,9 @@ fn run(sp: EmptyExtraFieldService, state: &mut State) -> ResultType<()> { sp.send(msg); } sp.snapshot(|sps| { - let txt = crate::CONTENT.lock().unwrap().clone(); - if !txt.is_empty() { - let msg_out = crate::create_clipboard_msg(txt); + let data = CONTENT.lock().unwrap().clone(); + if !data.is_empty() { + let msg_out = data.create_msg(); sps.send_shared(Arc::new(msg_out)); } Ok(()) diff --git a/src/server/connection.rs b/src/server/connection.rs index c2a754d068..5fac698a11 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -1,8 +1,8 @@ use super::{input_service::*, *}; +#[cfg(not(any(target_os = "android", target_os = "ios")))] +use crate::clipboard::update_clipboard; #[cfg(any(target_os = "windows", target_os = "linux", target_os = "macos"))] use crate::clipboard_file::*; -#[cfg(not(any(target_os = "android", target_os = "ios")))] -use crate::common::update_clipboard; #[cfg(target_os = "android")] use crate::keyboard::client::map_key_to_control_key; #[cfg(target_os = "linux")] @@ -400,6 +400,10 @@ impl Connection { } #[cfg(target_os = "android")] start_channel(rx_to_cm, tx_from_cm); + #[cfg(target_os = "android")] + conn.send_permission(Permission::Keyboard, conn.keyboard) + .await; + #[cfg(not(target_os = "android"))] if !conn.keyboard { conn.send_permission(Permission::Keyboard, false).await; } @@ -457,6 +461,11 @@ impl Connection { conn.on_close("connection manager", true).await; break; } + #[cfg(target_os = "android")] + ipc::Data::InputControl(v) => { + conn.keyboard = v; + conn.send_permission(Permission::Keyboard, v).await; + } ipc::Data::CmErr(e) => { if e != "expected" { // cm closed before connection @@ -1071,6 +1080,33 @@ impl Connection { return; } if self.require_2fa.is_some() && !self.is_recent_session(true) && !self.from_switch { + self.require_2fa.as_ref().map(|totp| { + let bot = crate::auth_2fa::TelegramBot::get(); + let bot = match bot { + Ok(Some(bot)) => bot, + Err(err) => { + log::error!("Failed to get telegram bot: {}", err); + return; + } + _ => return, + }; + let code = totp.generate_current(); + if let Ok(code) = code { + let text = format!( + "2FA code: {}\n\nA new connection has been established to your device with ID {}. The source IP address is {}.", + code, + Config::get_id(), + self.ip, + ); + tokio::spawn(async move { + if let Err(err) = + crate::auth_2fa::send_2fa_code_to_telegram(&text, bot).await + { + log::error!("Failed to send 2fa code to telegram bot: {}", err); + } + }); + } + }); self.send_login_error(crate::client::REQUIRE_2FA).await; return; } @@ -1709,11 +1745,6 @@ impl Connection { .await; } return true; - } else if password::approve_mode() == ApproveMode::Password - && !password::has_valid_password() - { - self.send_login_error("Connection not allowed").await; - return false; } else if self.is_recent_session(false) { if err_msg.is_empty() { #[cfg(target_os = "linux")] @@ -2470,25 +2501,6 @@ impl Connection { } async fn handle_switch_display(&mut self, s: SwitchDisplay) { - #[cfg(windows)] - if portable_client::running() - && *CONN_COUNT.lock().unwrap() > 1 - && s.display != (*display_service::PRIMARY_DISPLAY_IDX as i32) - { - log::info!("Switch to non-primary display is not supported in the elevated mode when there are multiple connections."); - let mut msg_out = Message::new(); - let res = MessageBox { - msgtype: "nook-nocancel-hasclose".to_owned(), - title: "Prompt".to_owned(), - text: "switch_display_elevated_connections_tip".to_owned(), - link: "".to_owned(), - ..Default::default() - }; - msg_out.set_message_box(res); - self.send(msg_out).await; - return; - } - let display_idx = s.display as usize; if self.display_idx != display_idx { if let Some(server) = self.server.upgrade() { @@ -2558,22 +2570,6 @@ impl Connection { } async fn capture_displays(&mut self, add: &[usize], sub: &[usize], set: &[usize]) { - #[cfg(windows)] - if portable_client::running() && (add.len() > 0 || set.len() > 1) { - log::info!("Capturing multiple displays is not supported in the elevated mode."); - let mut msg_out = Message::new(); - let res = MessageBox { - msgtype: "nook-nocancel-hasclose".to_owned(), - title: "Prompt".to_owned(), - text: "capture_display_elevated_connections_tip".to_owned(), - link: "".to_owned(), - ..Default::default() - }; - msg_out.set_message_box(res); - self.send(msg_out).await; - return; - } - if let Some(sever) = self.server.upgrade() { let mut lock = sever.write().unwrap(); for display in add.iter() { @@ -3149,6 +3145,7 @@ impl Connection { .map(|t| t.0 = Instant::now()); } + #[cfg(feature = "hwcodec")] fn update_supported_encoding(&mut self) { let Some(last) = &self.last_supported_encoding else { return; diff --git a/src/server/portable_service.rs b/src/server/portable_service.rs index e181ac7feb..ca86e48e79 100644 --- a/src/server/portable_service.rs +++ b/src/server/portable_service.rs @@ -186,9 +186,10 @@ mod utils { let rptr = counter.add(size_of::()); let iw = ptr_to_i32(counter); let ir = ptr_to_i32(counter); - let v = i32_to_vec(iw + 1); + let iw_plus1 = if iw == i32::MAX { 0 } else { iw + 1 }; + let v = i32_to_vec(iw_plus1); std::ptr::copy_nonoverlapping(v.as_ptr(), wptr, size_of::()); - if ir == iw + 1 { + if ir == iw_plus1 { let v = i32_to_vec(iw); std::ptr::copy_nonoverlapping(v.as_ptr(), rptr, size_of::()); } @@ -404,15 +405,15 @@ pub mod server { } }, Some(Err(e)) => { + if crate::platform::windows::desktop_changed() { + crate::platform::try_change_desktop(); + c = None; + std::thread::sleep(spf); + continue; + } if e.kind() != std::io::ErrorKind::WouldBlock { // DXGI_ERROR_INVALID_CALL after each success on Microsoft GPU driver // log::error!("capture frame failed: {:?}", e); - if crate::platform::windows::desktop_changed() { - crate::platform::try_change_desktop(); - c = None; - std::thread::sleep(spf); - continue; - } if c.as_ref().map(|c| c.is_gdi()) == Some(false) { // nog gdi dxgi_failed_times += 1; @@ -548,9 +549,13 @@ pub mod client { let mut max_pixel = 0; let align = 64; for d in displays { - let pixel = utils::align(d.width(), align) * utils::align(d.height(), align); - if max_pixel < pixel { - max_pixel = pixel; + let resolutions = crate::platform::resolutions(&d.name()); + for r in resolutions { + let pixel = + utils::align(r.width as _, align) * utils::align(r.height as _, align); + if max_pixel < pixel { + max_pixel = pixel; + } } } let shmem_size = utils::align(ADDR_CAPTURE_FRAME + max_pixel * 4, align); @@ -895,7 +900,7 @@ pub mod client { if portable_service_running != RUNNING.lock().unwrap().clone() { log::info!("portable service status mismatch"); } - if portable_service_running { + if portable_service_running && display.is_primary() { log::info!("Create shared memory capturer"); return Ok(Box::new(CapturerPortable::new(current_display))); } else { diff --git a/src/server/service.rs b/src/server/service.rs index 63c5a89d91..dac975478c 100644 --- a/src/server/service.rs +++ b/src/server/service.rs @@ -35,6 +35,7 @@ pub struct ServiceInner> { pub trait Reset { fn reset(&mut self); + fn init(&mut self) {} } pub struct ServiceTmpl>(Arc>>); @@ -266,15 +267,16 @@ impl> ServiceTmpl { while sp.active() { let now = time::Instant::now(); if sp.has_subscribes() { + if !may_reset { + may_reset = true; + state.init(); + } if let Err(err) = callback(sp.clone(), &mut state) { log::error!("Error of {} service: {}", sp.name(), err); thread::sleep(time::Duration::from_millis(MAX_ERROR_TIMEOUT)); #[cfg(windows)] crate::platform::windows::try_change_desktop(); } - if !may_reset { - may_reset = true; - } } else if may_reset { state.reset(); may_reset = false; diff --git a/src/tray.rs b/src/tray.rs index 8251d2505c..01f91dbdc1 100644 --- a/src/tray.rs +++ b/src/tray.rs @@ -137,14 +137,23 @@ pub fn make_tray() -> hbb_common::ResultType<()> { if let Ok(_event) = tray_channel.try_recv() { #[cfg(target_os = "windows")] - if _event.click_type == tray_icon::ClickType::Left - || _event.click_type == tray_icon::ClickType::Double - { - if last_click.elapsed() < std::time::Duration::from_secs(1) { - return; + match _event { + TrayEvent::Click { + button, + button_state, + .. + } => { + if button == tray_icon::MouseButton::Left + && button_state == tray_icon::MouseButtonState::Up + { + if last_click.elapsed() < std::time::Duration::from_secs(1) { + return; + } + open_func(); + last_click = std::time::Instant::now(); + } } - open_func(); - last_click = std::time::Instant::now(); + _ => {} } } diff --git a/src/ui.rs b/src/ui.rs index 813f6d7d1f..aa36fc578e 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -87,6 +87,8 @@ pub fn start(args: &mut [String]) { frame.set_title(&crate::get_app_name()); #[cfg(target_os = "macos")] crate::platform::delegate::make_menubar(frame.get_host(), args.is_empty()); + #[cfg(windows)] + crate::platform::try_set_window_foreground(frame.get_hwnd() as _); let page; if args.len() > 1 && args[0] == "--play" { args[0] = "--connect".to_owned(); diff --git a/src/ui/index.tis b/src/ui/index.tis index 71def3fe7f..d76cae5831 100644 --- a/src/ui/index.tis +++ b/src/ui/index.tis @@ -1208,7 +1208,7 @@ function self.onMouse(evt) { } function check_if_overlay() { - if (handler.get_option('allow-remote-config-modification') == 'Y') { + if (handler.get_option('allow-remote-config-modification') != 'Y') { var time0 = getTime(); handler.check_mouse_time(); self.timer(120ms, function() { diff --git a/src/ui_cm_interface.rs b/src/ui_cm_interface.rs index 38bfc72b55..8b4a31f3dd 100644 --- a/src/ui_cm_interface.rs +++ b/src/ui_cm_interface.rs @@ -279,6 +279,15 @@ pub fn close(id: i32) { }; } +#[inline] +#[cfg(target_os = "android")] +pub fn notify_input_control(v: bool) { + for (_, mut client) in CLIENTS.write().unwrap().iter_mut() { + client.keyboard = v; + allow_err!(client.tx.send(Data::InputControl(v))); + } +} + #[inline] pub fn remove(id: i32) { CLIENTS.write().unwrap().remove(&id); diff --git a/src/ui_interface.rs b/src/ui_interface.rs index 6c95d4c4ab..c05f720a7c 100644 --- a/src/ui_interface.rs +++ b/src/ui_interface.rs @@ -1392,6 +1392,20 @@ pub fn verify2fa(code: String) -> bool { res } +pub fn has_valid_bot() -> bool { + crate::auth_2fa::TelegramBot::get().map_or(false, |bot| bot.is_some()) +} + +pub fn verify_bot(token: String) -> String { + match crate::auth_2fa::get_chatid_telegram(&token) { + Err(err) => err.to_string(), + Ok(None) => { + "To activate the bot, simply send a message beginning with a forward slash (\"/\") like \"/hello\" to its chat.".to_owned() + } + _ => "".to_owned(), + } +} + pub fn check_hwcodec() { #[cfg(feature = "hwcodec")] #[cfg(any(target_os = "windows", target_os = "linux"))] diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index b60711a0c5..38144d5db7 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -410,9 +410,12 @@ impl Session { self.send(Data::Message(msg)); } if value != "custom" { - // non custom quality use 30 fps - let msg = self.lc.write().unwrap().set_custom_fps(30, false); - self.send(Data::Message(msg)); + let last_auto_fps = self.lc.read().unwrap().last_auto_fps; + if last_auto_fps.unwrap_or(usize::MAX) >= 30 { + // non custom quality use 30 fps + let msg = self.lc.write().unwrap().set_custom_fps(30, false); + self.send(Data::Message(msg)); + } } } @@ -801,7 +804,54 @@ impl Session { pub fn handle_flutter_key_event( &self, keyboard_mode: &str, - _name: &str, + name: &str, + platform_code: i32, + position_code: i32, + lock_modes: i32, + down_or_up: bool, + ) { + if name == "flutter_key" { + self._handle_key_flutter_simulation(keyboard_mode, platform_code, down_or_up); + } else { + self._handle_key_non_flutter_simulation( + keyboard_mode, + platform_code, + position_code, + lock_modes, + down_or_up, + ); + } + } + + #[cfg(not(any(target_os = "ios")))] + fn _handle_key_flutter_simulation( + &self, + _keyboard_mode: &str, + platform_code: i32, + down_or_up: bool, + ) { + // https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/services/keyboard_key.g.dart#L4356 + let ctrl_key = match platform_code { + 0x0007007f => Some(ControlKey::VolumeMute), + 0x00070080 => Some(ControlKey::VolumeUp), + 0x00070081 => Some(ControlKey::VolumeDown), + 0x00070066 => Some(ControlKey::Power), + _ => None, + }; + let Some(ctrl_key) = ctrl_key else { return }; + let mut key_event = KeyEvent { + mode: KeyboardMode::Translate.into(), + down: down_or_up, + ..Default::default() + }; + key_event.set_control_key(ctrl_key); + self.send_key_event(&key_event); + } + + #[cfg(not(any(target_os = "ios")))] + fn _handle_key_non_flutter_simulation( + &self, + keyboard_mode: &str, platform_code: i32, position_code: i32, lock_modes: i32,