mirror of
https://github.com/weyne85/rustdesk.git
synced 2025-10-29 17:00:05 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
d6544e74ff
418
.github/workflows/flutter-nightly.yml
vendored
418
.github/workflows/flutter-nightly.yml
vendored
@ -10,7 +10,9 @@ env:
|
|||||||
LLVM_VERSION: "10.0"
|
LLVM_VERSION: "10.0"
|
||||||
FLUTTER_VERSION: "3.0.5"
|
FLUTTER_VERSION: "3.0.5"
|
||||||
TAG_NAME: "nightly"
|
TAG_NAME: "nightly"
|
||||||
VCPKG_COMMIT_ID: '6ca56aeb457f033d344a7106cb3f9f1abf8f4e98'
|
# vcpkg version: 2022.05.10
|
||||||
|
# for multiarch gcc compatibility
|
||||||
|
VCPKG_COMMIT_ID: "14e7bb4ae24616ec54ff6b2f6ef4e8659434ea44"
|
||||||
VERSION: "1.2.0"
|
VERSION: "1.2.0"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@ -23,7 +25,7 @@ jobs:
|
|||||||
job:
|
job:
|
||||||
# - { target: i686-pc-windows-msvc , os: windows-2019 }
|
# - { target: i686-pc-windows-msvc , os: windows-2019 }
|
||||||
# - { target: x86_64-pc-windows-gnu , os: windows-2019 }
|
# - { target: x86_64-pc-windows-gnu , os: windows-2019 }
|
||||||
- { target: x86_64-pc-windows-msvc , os: windows-2019 }
|
- { target: x86_64-pc-windows-msvc, os: windows-2019 }
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout source code
|
- name: Checkout source code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
@ -36,9 +38,9 @@ jobs:
|
|||||||
- name: Install flutter
|
- name: Install flutter
|
||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
channel: 'stable'
|
channel: "stable"
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||||
|
|
||||||
- name: Replace engine with rustdesk custom flutter engine
|
- name: Replace engine with rustdesk custom flutter engine
|
||||||
run: |
|
run: |
|
||||||
flutter doctor -v
|
flutter doctor -v
|
||||||
@ -100,38 +102,30 @@ jobs:
|
|||||||
files: |
|
files: |
|
||||||
rustdesk-*.exe
|
rustdesk-*.exe
|
||||||
|
|
||||||
build-for-linux:
|
build-for-macOS:
|
||||||
name: ${{ matrix.job.target }} (${{ matrix.job.os }},${{ matrix.job.extra-build-args }})
|
name: ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-args }}]
|
||||||
runs-on: ${{ matrix.job.os }}
|
runs-on: ${{ matrix.job.os }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
job:
|
job:
|
||||||
# - { target: aarch64-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
|
- {
|
||||||
# - { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04, use-cross: true }
|
target: x86_64-apple-darwin,
|
||||||
# - { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, use-cross: true }
|
os: macos-10.15,
|
||||||
# - { target: i686-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
|
extra-build-args: "",
|
||||||
# - { target: i686-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
|
}
|
||||||
# - { target: x86_64-apple-darwin , os: macos-10.15 }
|
|
||||||
- { target: x86_64-unknown-linux-gnu , os: ubuntu-18.04, extra-build-args: ""}
|
|
||||||
- { target: x86_64-unknown-linux-gnu , os: ubuntu-18.04, extra-build-args: "--flatpak"}
|
|
||||||
# - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout source code
|
- name: Checkout source code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install prerequisites
|
- name: Install build runtime
|
||||||
run: |
|
run: |
|
||||||
case ${{ matrix.job.target }} in
|
brew install llvm create-dmg nasm yasm cmake gcc wget ninja
|
||||||
x86_64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake libclang-dev ninja-build libappindicator3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libvdpau-dev libva-dev libclang-dev llvm-dev libclang-10-dev llvm-10-dev;;
|
|
||||||
# arm-unknown-linux-*) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;;
|
|
||||||
# aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
- name: Install flutter
|
- name: Install flutter
|
||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
channel: 'stable'
|
channel: "stable"
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||||
|
|
||||||
- name: Install Rust toolchain
|
- name: Install Rust toolchain
|
||||||
@ -165,16 +159,15 @@ jobs:
|
|||||||
- name: Install vcpkg dependencies
|
- name: Install vcpkg dependencies
|
||||||
run: |
|
run: |
|
||||||
$VCPKG_ROOT/vcpkg install libvpx libyuv opus
|
$VCPKG_ROOT/vcpkg install libvpx libyuv opus
|
||||||
shell: bash
|
|
||||||
|
|
||||||
- name: Install cargo bundle tools
|
- name: Install cargo bundle tools
|
||||||
run: |
|
run: |
|
||||||
cargo install cargo-bundle
|
cargo install cargo-bundle
|
||||||
|
|
||||||
- name: Show version information (Rust, cargo, GCC)
|
- name: Show version information (Rust, cargo, Clang)
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
gcc --version || true
|
clang --version || true
|
||||||
rustup -V
|
rustup -V
|
||||||
rustup toolchain list
|
rustup toolchain list
|
||||||
rustup default
|
rustup default
|
||||||
@ -182,7 +175,318 @@ jobs:
|
|||||||
rustc -V
|
rustc -V
|
||||||
|
|
||||||
- name: Build rustdesk
|
- name: Build rustdesk
|
||||||
run: ./build.py --flutter --hwcodec ${{ matrix.job.extra-build-args }}
|
run: |
|
||||||
|
# --hwcodec not supported on macos yet
|
||||||
|
./build.py --flutter ${{ matrix.job.extra-build-args }}
|
||||||
|
|
||||||
|
- name: Rename rustdesk
|
||||||
|
run: |
|
||||||
|
for name in rustdesk*??.dmg; do
|
||||||
|
mv "$name" "${name%%.dmg}-untested-${{ matrix.job.target }}.dmg"
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: Publish DMG package
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
with:
|
||||||
|
prerelease: true
|
||||||
|
tag_name: ${{ env.TAG_NAME }}
|
||||||
|
files: |
|
||||||
|
rustdesk*-${{ matrix.job.target }}.dmg
|
||||||
|
|
||||||
|
build-vcpkg-deps-linux:
|
||||||
|
runs-on: ${{ matrix.job.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
job:
|
||||||
|
# - { arch: armv7 , os: ubuntu-18.04}
|
||||||
|
- { arch: x86_64, os: ubuntu-18.04 }
|
||||||
|
# - { arch: aarch64 , os: ubuntu-18.04}
|
||||||
|
steps:
|
||||||
|
- name: Create vcpkg artifacts folder
|
||||||
|
run: mkdir -p /opt/artifacts
|
||||||
|
|
||||||
|
- name: Cache Vcpkg
|
||||||
|
id: cache-vcpkg
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: /opt/artifacts
|
||||||
|
key: vcpkg-${{ matrix.job.arch }}
|
||||||
|
|
||||||
|
- uses: Kingtous/run-on-arch-action@amd64-support
|
||||||
|
name: Run vcpkg install on ${{ matrix.job.arch }}
|
||||||
|
id: vcpkg
|
||||||
|
with:
|
||||||
|
arch: ${{ matrix.job.arch }}
|
||||||
|
distro: ubuntu18.04
|
||||||
|
githubToken: ${{ github.token }}
|
||||||
|
setup: |
|
||||||
|
ls -l "/opt/artifacts"
|
||||||
|
dockerRunArgs: |
|
||||||
|
--volume "/opt/artifacts:/artifacts"
|
||||||
|
shell: /bin/bash
|
||||||
|
install: |
|
||||||
|
apt update -y
|
||||||
|
# CMake 3.15+
|
||||||
|
apt install -y gpg wget ca-certificates
|
||||||
|
echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ bionic main' | tee /etc/apt/sources.list.d/kitware.list >/dev/null
|
||||||
|
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null
|
||||||
|
apt update -y
|
||||||
|
apt install -y curl zip unzip tar git cmake g++ gcc build-essential pkg-config wget nasm yasm ninja-build
|
||||||
|
cmake --version
|
||||||
|
gcc -v
|
||||||
|
run: |
|
||||||
|
export VCPKG_FORCE_SYSTEM_BINARIES=1
|
||||||
|
pushd /artifacts
|
||||||
|
git clone https://github.com/microsoft/vcpkg.git || true
|
||||||
|
git config --global --add safe.directory /artifacts/vcpkg || true
|
||||||
|
pushd vcpkg
|
||||||
|
git reset --hard ${{ env.VCPKG_COMMIT_ID }}
|
||||||
|
./bootstrap-vcpkg.sh
|
||||||
|
./vcpkg install libvpx libyuv opus
|
||||||
|
|
||||||
|
- name: Upload artifacts
|
||||||
|
uses: actions/upload-artifact@master
|
||||||
|
with:
|
||||||
|
name: vcpkg-artifact-${{ matrix.job.arch }}
|
||||||
|
path: |
|
||||||
|
/opt/artifacts/vcpkg/installed
|
||||||
|
|
||||||
|
generate-bridge-linux:
|
||||||
|
name: generate bridge
|
||||||
|
runs-on: ${{ matrix.job.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
job:
|
||||||
|
- {
|
||||||
|
target: x86_64-unknown-linux-gnu,
|
||||||
|
os: ubuntu-18.04,
|
||||||
|
extra-build-args: "",
|
||||||
|
}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Install prerequisites
|
||||||
|
run: |
|
||||||
|
sudo apt update -y
|
||||||
|
sudo apt install -y g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake libclang-dev ninja-build libappindicator3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libvdpau-dev libva-dev libclang-dev llvm-dev libclang-10-dev llvm-10-dev pkg-config
|
||||||
|
|
||||||
|
- name: Install Rust toolchain
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
target: ${{ matrix.job.target }}
|
||||||
|
override: true
|
||||||
|
profile: minimal # minimal component installation (ie, no documentation)
|
||||||
|
|
||||||
|
- uses: Swatinem/rust-cache@v2
|
||||||
|
with:
|
||||||
|
prefix-key: bridge-${{ matrix.job.os }}
|
||||||
|
|
||||||
|
- name: Cache Bridge
|
||||||
|
id: cache-bridge
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: /tmp/flutter_rust_bridge
|
||||||
|
key: vcpkg-${{ matrix.job.arch }}
|
||||||
|
|
||||||
|
- name: Install flutter
|
||||||
|
uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
channel: "stable"
|
||||||
|
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||||
|
|
||||||
|
- name: Install ffigen
|
||||||
|
run: |
|
||||||
|
dart pub global activate ffigen --version 5.0.1
|
||||||
|
|
||||||
|
- name: Install flutter rust bridge deps
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
pushd /tmp && git clone https://github.com/SoLongAndThanksForAllThePizza/flutter_rust_bridge --depth=1 || true && popd
|
||||||
|
pushd /tmp/flutter_rust_bridge/frb_codegen && cargo install --path . && popd
|
||||||
|
pushd flutter && flutter pub get && popd
|
||||||
|
|
||||||
|
- name: Run flutter rust bridge
|
||||||
|
run: |
|
||||||
|
~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart
|
||||||
|
|
||||||
|
- name: Upload Artifcat
|
||||||
|
uses: actions/upload-artifact@master
|
||||||
|
with:
|
||||||
|
name: bridge-artifact
|
||||||
|
path: |
|
||||||
|
./src/bridge_generated.rs
|
||||||
|
./flutter/lib/generated_bridge.dart
|
||||||
|
./flutter/lib/generated_bridge.freezed.dart
|
||||||
|
|
||||||
|
build-rustdesk-lib-linux:
|
||||||
|
needs: [generate-bridge-linux, build-vcpkg-deps-linux]
|
||||||
|
name: build-rust-lib ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-features }}]
|
||||||
|
runs-on: ${{ matrix.job.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
job:
|
||||||
|
# - { arch: aarch64, target: aarch64-unknown-linux-gnu , os: ubuntu-18.04, use-cross: true, extra-build-features: "" }
|
||||||
|
# - { arch: aarch64, target: aarch64-unknown-linux-gnu , os: ubuntu-18.04, use-cross: true, extra-build-features: "flatpak" }
|
||||||
|
# - { arch: armv7, target: arm-unknown-linux-gnueabihf , os: ubuntu-18.04, use-cross: true, extra-build-features: "" }
|
||||||
|
# - { arch: armv7, target: arm-unknown-linux-gnueabihf , os: ubuntu-18.04, use-cross: true, extra-build-features: "flatpak" }
|
||||||
|
# - { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, use-cross: true }
|
||||||
|
# - { target: i686-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
|
||||||
|
# - { target: i686-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
|
||||||
|
- {
|
||||||
|
arch: x86_64,
|
||||||
|
target: x86_64-unknown-linux-gnu,
|
||||||
|
os: ubuntu-18.04,
|
||||||
|
extra-build-features: "",
|
||||||
|
}
|
||||||
|
- {
|
||||||
|
arch: x86_64,
|
||||||
|
target: x86_64-unknown-linux-gnu,
|
||||||
|
os: ubuntu-18.04,
|
||||||
|
extra-build-features: "flatpak",
|
||||||
|
}
|
||||||
|
# - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Install Rust toolchain
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
target: ${{ matrix.job.target }}
|
||||||
|
override: true
|
||||||
|
profile: minimal # minimal component installation (ie, no documentation)
|
||||||
|
|
||||||
|
- uses: Swatinem/rust-cache@v2
|
||||||
|
with:
|
||||||
|
prefix-key: bridge-${{ matrix.job.os }}
|
||||||
|
|
||||||
|
- name: Disable rust bridge build
|
||||||
|
run: |
|
||||||
|
sed -i "s/gen_flutter_rust_bridge();/\/\//g" build.rs
|
||||||
|
|
||||||
|
- name: Restore bridge files
|
||||||
|
uses: actions/download-artifact@master
|
||||||
|
with:
|
||||||
|
name: bridge-artifact
|
||||||
|
path: ./
|
||||||
|
|
||||||
|
- name: Restore vcpkg files
|
||||||
|
uses: actions/download-artifact@master
|
||||||
|
with:
|
||||||
|
name: vcpkg-artifact-${{ matrix.job.arch }}
|
||||||
|
path: /opt/artifacts/vcpkg/installed
|
||||||
|
|
||||||
|
- name: Output devs
|
||||||
|
run: |
|
||||||
|
ls -l ./
|
||||||
|
tree -L 3 /opt/artifacts/vcpkg/installed
|
||||||
|
|
||||||
|
- name: Install prerequisites
|
||||||
|
run: |
|
||||||
|
sudo apt update -y
|
||||||
|
case ${{ matrix.job.target }} in
|
||||||
|
x86_64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt install -y g++ gcc;;
|
||||||
|
arm-unknown-linux-*) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;;
|
||||||
|
aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;;
|
||||||
|
esac
|
||||||
|
# common package
|
||||||
|
sudo apt install -y git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake libclang-dev ninja-build libappindicator3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libvdpau-dev libva-dev libclang-dev llvm-dev libclang-10-dev llvm-10-dev pkg-config tree
|
||||||
|
|
||||||
|
- name: Build rustdesk lib
|
||||||
|
run: |
|
||||||
|
export VCPKG_ROOT=/opt/artifacts/vcpkg
|
||||||
|
cargo build --lib --features hwcodec,flutter,${{ matrix.job.extra-build-features }} --release
|
||||||
|
|
||||||
|
- name: Upload Artifacts
|
||||||
|
uses: actions/upload-artifact@master
|
||||||
|
with:
|
||||||
|
name: librustdesk-${{ matrix.job.arch }}-${{ matrix.job.extra-build-features }}.so
|
||||||
|
path: target/release/liblibrustdesk.so
|
||||||
|
|
||||||
|
build-rustdesk-linux:
|
||||||
|
needs: [build-rustdesk-lib-linux]
|
||||||
|
name: build-rustdesk ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-args }}]
|
||||||
|
runs-on: ${{ matrix.job.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
job:
|
||||||
|
# - { arch: aarch64, target: aarch64-unknown-linux-gnu , os: ubuntu-18.04, use-cross: true, extra-build-features: "" }
|
||||||
|
# - { arch: aarch64, target: aarch64-unknown-linux-gnu , os: ubuntu-18.04, use-cross: true, extra-build-features: "flatpak" }
|
||||||
|
# - { arch: armv7, target: arm-unknown-linux-gnueabihf , os: ubuntu-18.04, use-cross: true, extra-build-features: "" }
|
||||||
|
# - { arch: armv7, target: arm-unknown-linux-gnueabihf , os: ubuntu-18.04, use-cross: true, extra-build-features: "flatpak" }
|
||||||
|
# - { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, use-cross: true }
|
||||||
|
# - { target: i686-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
|
||||||
|
# - { target: i686-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
|
||||||
|
- {
|
||||||
|
arch: x86_64,
|
||||||
|
target: x86_64-unknown-linux-gnu,
|
||||||
|
os: ubuntu-18.04,
|
||||||
|
extra-build-features: "",
|
||||||
|
}
|
||||||
|
- {
|
||||||
|
arch: x86_64,
|
||||||
|
target: x86_64-unknown-linux-gnu,
|
||||||
|
os: ubuntu-18.04,
|
||||||
|
extra-build-features: "flatpak",
|
||||||
|
}
|
||||||
|
# - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Restore bridge files
|
||||||
|
uses: actions/download-artifact@master
|
||||||
|
with:
|
||||||
|
name: bridge-artifact
|
||||||
|
path: ./
|
||||||
|
|
||||||
|
- name: Prepare env
|
||||||
|
run: |
|
||||||
|
sudo apt update -y
|
||||||
|
sudo apt install -y git curl wget nasm yasm libgtk-3-dev
|
||||||
|
mkdir -p ./target/release/
|
||||||
|
|
||||||
|
- name: Restore the rustdesk lib file
|
||||||
|
uses: actions/download-artifact@master
|
||||||
|
with:
|
||||||
|
name: librustdesk-${{ matrix.job.arch }}-${{ matrix.job.extra-build-features }}.so
|
||||||
|
path: ./target/release/
|
||||||
|
|
||||||
|
- uses: Kingtous/run-on-arch-action@amd64-support
|
||||||
|
name: Build rustdesk binary for ${{ matrix.job.arch }}
|
||||||
|
id: vcpkg
|
||||||
|
with:
|
||||||
|
arch: ${{ matrix.job.arch }}
|
||||||
|
distro: ubuntu18.04
|
||||||
|
githubToken: ${{ github.token }}
|
||||||
|
setup: |
|
||||||
|
ls -l "${PWD}"
|
||||||
|
dockerRunArgs: |
|
||||||
|
--volume "${PWD}:/workspace"
|
||||||
|
--volume "/opt/artifacts:/opt/artifacts"
|
||||||
|
shell: /bin/bash
|
||||||
|
install: |
|
||||||
|
apt update -y
|
||||||
|
apt install -y git cmake g++ gcc build-essential nasm yasm curl unzip xz-utils python3 wget pkg-config ninja-build pkg-config libgtk-3-dev liblzma-dev clang libappindicator3-dev
|
||||||
|
run: |
|
||||||
|
# disable git safe.directory
|
||||||
|
git config --global --add safe.directory "*"
|
||||||
|
# Setup Flutter
|
||||||
|
pushd /opt
|
||||||
|
wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz
|
||||||
|
tar xf flutter_linux_${{ env.FLUTTER_VERSION }}-stable.tar.xz
|
||||||
|
ls -l .
|
||||||
|
export PATH=/opt/flutter/bin:$PATH
|
||||||
|
flutter doctor -v
|
||||||
|
pushd /workspace
|
||||||
|
python3 ./build.py --flutter --hwcodec --skip-cargo
|
||||||
|
|
||||||
- name: Rename rustdesk
|
- name: Rename rustdesk
|
||||||
shell: bash
|
shell: bash
|
||||||
@ -198,16 +502,21 @@ jobs:
|
|||||||
tag_name: ${{ env.TAG_NAME }}
|
tag_name: ${{ env.TAG_NAME }}
|
||||||
files: |
|
files: |
|
||||||
rustdesk-${{ env.VERSION }}-${{ matrix.job.target }}-${{ matrix.job.os }}.deb
|
rustdesk-${{ env.VERSION }}-${{ matrix.job.target }}-${{ matrix.job.os }}.deb
|
||||||
|
|
||||||
- name: Upload Artifcat
|
- name: Upload Artifcat
|
||||||
uses: actions/upload-artifact@master
|
uses: actions/upload-artifact@master
|
||||||
if: ${{ contains(matrix.job.extra-build-args, 'flatpak') }}
|
if: ${{ contains(matrix.job.extra-build-features, 'flatpak') }}
|
||||||
with:
|
with:
|
||||||
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.target }}-${{ matrix.job.os }}.deb
|
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.target }}-${{ matrix.job.os }}.deb
|
||||||
path: rustdesk-${{ env.VERSION }}-${{ matrix.job.target }}-${{ matrix.job.os }}.deb
|
path: rustdesk-${{ env.VERSION }}-${{ matrix.job.target }}-${{ matrix.job.os }}.deb
|
||||||
|
|
||||||
|
- name: Patch archlinux PKGBUILD
|
||||||
|
if: ${{ matrix.job.extra-build-features == '' }}
|
||||||
|
run: |
|
||||||
|
sed -i "s/arch=('x86_64')/arch=('${{ matrix.job.arch }}')/g" res/PKGBUILD
|
||||||
|
|
||||||
- name: Build archlinux package
|
- name: Build archlinux package
|
||||||
if: ${{ matrix.job.extra-build-args == '' }}
|
if: ${{ matrix.job.extra-build-features == '' }}
|
||||||
uses: vufa/arch-makepkg-action@master
|
uses: vufa/arch-makepkg-action@master
|
||||||
with:
|
with:
|
||||||
packages: >
|
packages: >
|
||||||
@ -242,7 +551,7 @@ jobs:
|
|||||||
cd res && HBB=`pwd`/.. FLUTTER=1 makepkg -f
|
cd res && HBB=`pwd`/.. FLUTTER=1 makepkg -f
|
||||||
|
|
||||||
- name: Publish archlinux package
|
- name: Publish archlinux package
|
||||||
if: ${{ matrix.job.extra-build-args == '' }}
|
if: ${{ matrix.job.extra-build-features == '' }}
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
with:
|
with:
|
||||||
prerelease: true
|
prerelease: true
|
||||||
@ -250,36 +559,36 @@ jobs:
|
|||||||
files: |
|
files: |
|
||||||
res/rustdesk*.zst
|
res/rustdesk*.zst
|
||||||
|
|
||||||
# - name: build RPM package
|
- name: Make RPM package
|
||||||
# id: rpm
|
shell: bash
|
||||||
# uses: Kingtous/rustdesk-rpmbuild@master
|
if: ${{ matrix.job.extra-build-features == '' }}
|
||||||
# with:
|
run: |
|
||||||
# spec_file: "res/rpm-flutter.spec"
|
sudo apt install -y rpm
|
||||||
|
HBB=`pwd` rpmbuild ./res/rpm-flutter.spec -bb
|
||||||
|
pushd ~/rpmbuild/RPMS/${{ matrix.job.arch }}
|
||||||
|
for name in rustdesk*??.rpm; do
|
||||||
|
mv "$name" "${name%%.rpm}-fedora28-centos8.rpm"
|
||||||
|
done
|
||||||
|
|
||||||
# - name: Publish fedora28/centos8 package
|
- name: Publish fedora28/centos8 package
|
||||||
# uses: softprops/action-gh-release@v1
|
if: ${{ matrix.job.extra-build-features == '' }}
|
||||||
# with:
|
uses: softprops/action-gh-release@v1
|
||||||
# prerelease: true
|
with:
|
||||||
# tag_name: ${{ env.TAG_NAME }}
|
prerelease: true
|
||||||
# files: |
|
tag_name: ${{ env.TAG_NAME }}
|
||||||
# ${{ steps.rpm.outputs.rpm_dir_path }}/*
|
files: |
|
||||||
|
/home/runner/rpmbuild/RPMS/${{ matrix.job.arch }}/*.rpm
|
||||||
|
|
||||||
build-flatpak:
|
build-flatpak:
|
||||||
name: Build Flatpak
|
name: Build Flatpak
|
||||||
needs: [build-for-linux]
|
needs: [build-rustdesk-linux]
|
||||||
runs-on: ${{ matrix.job.os }}
|
runs-on: ${{ matrix.job.os }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
job:
|
job:
|
||||||
# - { target: aarch64-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
|
# - { target: aarch64-unknown-linux-gnu , os: ubuntu-18.04, use-cross: true, arch: arm64 }
|
||||||
# - { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04, use-cross: true }
|
- { target: x86_64-unknown-linux-gnu, os: ubuntu-18.04, arch: x86_64 }
|
||||||
# - { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, use-cross: true }
|
|
||||||
# - { target: i686-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
|
|
||||||
# - { target: i686-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
|
|
||||||
# - { target: x86_64-apple-darwin , os: macos-10.15 }
|
|
||||||
- { target: x86_64-unknown-linux-gnu , os: ubuntu-18.04, arch: x86_64}
|
|
||||||
# - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout source code
|
- name: Checkout source code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
@ -294,11 +603,11 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.target }}-${{ matrix.job.os }}.deb
|
name: rustdesk-${{ env.VERSION }}-${{ matrix.job.target }}-${{ matrix.job.os }}.deb
|
||||||
path: .
|
path: .
|
||||||
|
|
||||||
- name: Rename Binary
|
- name: Rename Binary
|
||||||
run: |
|
run: |
|
||||||
mv rustdesk-${{ env.VERSION }}-${{ matrix.job.target }}-${{ matrix.job.os }}.deb rustdesk-${{ env.VERSION }}.deb
|
mv rustdesk-${{ env.VERSION }}-${{ matrix.job.target }}-${{ matrix.job.os }}.deb rustdesk-${{ env.VERSION }}.deb
|
||||||
|
|
||||||
- name: Install Flatpak deps
|
- name: Install Flatpak deps
|
||||||
run: |
|
run: |
|
||||||
flatpak --user remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
flatpak --user remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||||
@ -319,4 +628,3 @@ jobs:
|
|||||||
tag_name: ${{ env.TAG_NAME }}
|
tag_name: ${{ env.TAG_NAME }}
|
||||||
files: |
|
files: |
|
||||||
flatpak/rustdesk-${{ env.VERSION }}-${{ matrix.job.target }}.flatpak
|
flatpak/rustdesk-${{ env.VERSION }}-${{ matrix.job.target }}.flatpak
|
||||||
|
|
||||||
|
|||||||
130
Cargo.lock
generated
130
Cargo.lock
generated
@ -620,9 +620,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "chrono"
|
name = "chrono"
|
||||||
version = "0.4.22"
|
version = "0.4.23"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1"
|
checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"iana-time-zone",
|
"iana-time-zone",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
@ -633,6 +633,19 @@ dependencies = [
|
|||||||
"winapi 0.3.9",
|
"winapi 0.3.9",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cidr-utils"
|
||||||
|
version = "0.5.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "355d5b5df67e58b523953d0c1a8d3d2c05f5af51f1332b0199b9c92263614ed0"
|
||||||
|
dependencies = [
|
||||||
|
"debug-helper",
|
||||||
|
"num-bigint",
|
||||||
|
"num-traits 0.2.15",
|
||||||
|
"once_cell",
|
||||||
|
"regex",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clang-sys"
|
name = "clang-sys"
|
||||||
version = "1.3.3"
|
version = "1.3.3"
|
||||||
@ -1244,6 +1257,12 @@ version = "0.3.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7046468a81e6a002061c01e6a7c83139daf91b11c30e66795b13217c2d885c8b"
|
checksum = "7046468a81e6a002061c01e6a7c83139daf91b11c30e66795b13217c2d885c8b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "debug-helper"
|
||||||
|
version = "0.3.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "default-net"
|
name = "default-net"
|
||||||
version = "0.11.0"
|
version = "0.11.0"
|
||||||
@ -1253,7 +1272,7 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
"memalloc",
|
"memalloc",
|
||||||
"system-configuration",
|
"system-configuration",
|
||||||
"windows",
|
"windows 0.30.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1392,6 +1411,18 @@ version = "0.4.8"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
|
checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dylib_virtual_display"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
"hbb_common",
|
||||||
|
"lazy_static",
|
||||||
|
"serde 1.0.144",
|
||||||
|
"serde_derive",
|
||||||
|
"thiserror",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ed25519"
|
name = "ed25519"
|
||||||
version = "1.5.2"
|
version = "1.5.2"
|
||||||
@ -2463,7 +2494,7 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "hwcodec"
|
name = "hwcodec"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/21pages/hwcodec#bf73e8e650abca3e004e96a245086b3647b9d84a"
|
source = "git+https://github.com/21pages/hwcodec#f54d69b35251ade110373403ddefcb8b49c87305"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bindgen",
|
"bindgen",
|
||||||
"cc",
|
"cc",
|
||||||
@ -3279,6 +3310,17 @@ dependencies = [
|
|||||||
"winapi 0.3.9",
|
"winapi 0.3.9",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-bigint"
|
||||||
|
version = "0.4.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg 1.1.0",
|
||||||
|
"num-integer",
|
||||||
|
"num-traits 0.2.15",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-complex"
|
name = "num-complex"
|
||||||
version = "0.4.2"
|
version = "0.4.2"
|
||||||
@ -4362,6 +4404,8 @@ dependencies = [
|
|||||||
"bytes",
|
"bytes",
|
||||||
"cc",
|
"cc",
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
|
"chrono",
|
||||||
|
"cidr-utils",
|
||||||
"clap 3.2.17",
|
"clap 3.2.17",
|
||||||
"clipboard",
|
"clipboard",
|
||||||
"cocoa",
|
"cocoa",
|
||||||
@ -4413,6 +4457,8 @@ dependencies = [
|
|||||||
"serde_derive",
|
"serde_derive",
|
||||||
"serde_json 1.0.85",
|
"serde_json 1.0.85",
|
||||||
"sha2",
|
"sha2",
|
||||||
|
"shared_memory",
|
||||||
|
"shutdown_hooks",
|
||||||
"simple_rc",
|
"simple_rc",
|
||||||
"sys-locale",
|
"sys-locale",
|
||||||
"sysinfo",
|
"sysinfo",
|
||||||
@ -4761,12 +4807,31 @@ dependencies = [
|
|||||||
"digest",
|
"digest",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "shared_memory"
|
||||||
|
version = "0.12.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ba8593196da75d9dc4f69349682bd4c2099f8cde114257d1ef7ef1b33d1aba54"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if 1.0.0",
|
||||||
|
"libc",
|
||||||
|
"nix 0.23.1",
|
||||||
|
"rand 0.8.5",
|
||||||
|
"win-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "shlex"
|
name = "shlex"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
|
checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "shutdown_hooks"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6057adedbec913419c92996f395ba69931acbd50b7d56955394cd3f7bedbfa45"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "signal-hook"
|
name = "signal-hook"
|
||||||
version = "0.3.14"
|
version = "0.3.14"
|
||||||
@ -5533,12 +5598,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
|
|||||||
name = "virtual_display"
|
name = "virtual_display"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
|
||||||
"hbb_common",
|
"hbb_common",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"serde 1.0.144",
|
"libloading",
|
||||||
"serde_derive",
|
|
||||||
"thiserror",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -5844,6 +5906,15 @@ version = "1.0.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8"
|
checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "win-sys"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5b7b128a98c1cfa201b09eb49ba285887deb3cbe7466a98850eb1adabb452be5"
|
||||||
|
dependencies = [
|
||||||
|
"windows 0.34.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi"
|
name = "winapi"
|
||||||
version = "0.2.8"
|
version = "0.2.8"
|
||||||
@ -5909,6 +5980,19 @@ dependencies = [
|
|||||||
"windows_x86_64_msvc 0.30.0",
|
"windows_x86_64_msvc 0.30.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows"
|
||||||
|
version = "0.34.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f"
|
||||||
|
dependencies = [
|
||||||
|
"windows_aarch64_msvc 0.34.0",
|
||||||
|
"windows_i686_gnu 0.34.0",
|
||||||
|
"windows_i686_msvc 0.34.0",
|
||||||
|
"windows_x86_64_gnu 0.34.0",
|
||||||
|
"windows_x86_64_msvc 0.34.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-service"
|
name = "windows-service"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
@ -5959,6 +6043,12 @@ version = "0.30.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "29277a4435d642f775f63c7d1faeb927adba532886ce0287bd985bffb16b6bca"
|
checksum = "29277a4435d642f775f63c7d1faeb927adba532886ce0287bd985bffb16b6bca"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_aarch64_msvc"
|
||||||
|
version = "0.34.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_aarch64_msvc"
|
name = "windows_aarch64_msvc"
|
||||||
version = "0.36.1"
|
version = "0.36.1"
|
||||||
@ -5977,6 +6067,12 @@ version = "0.30.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1145e1989da93956c68d1864f32fb97c8f561a8f89a5125f6a2b7ea75524e4b8"
|
checksum = "1145e1989da93956c68d1864f32fb97c8f561a8f89a5125f6a2b7ea75524e4b8"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_gnu"
|
||||||
|
version = "0.34.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_i686_gnu"
|
name = "windows_i686_gnu"
|
||||||
version = "0.36.1"
|
version = "0.36.1"
|
||||||
@ -5995,6 +6091,12 @@ version = "0.30.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d4a09e3a0d4753b73019db171c1339cd4362c8c44baf1bcea336235e955954a6"
|
checksum = "d4a09e3a0d4753b73019db171c1339cd4362c8c44baf1bcea336235e955954a6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_msvc"
|
||||||
|
version = "0.34.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_i686_msvc"
|
name = "windows_i686_msvc"
|
||||||
version = "0.36.1"
|
version = "0.36.1"
|
||||||
@ -6013,6 +6115,12 @@ version = "0.30.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8ca64fcb0220d58db4c119e050e7af03c69e6f4f415ef69ec1773d9aab422d5a"
|
checksum = "8ca64fcb0220d58db4c119e050e7af03c69e6f4f415ef69ec1773d9aab422d5a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnu"
|
||||||
|
version = "0.34.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_x86_64_gnu"
|
name = "windows_x86_64_gnu"
|
||||||
version = "0.36.1"
|
version = "0.36.1"
|
||||||
@ -6031,6 +6139,12 @@ version = "0.30.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "08cabc9f0066848fef4bc6a1c1668e6efce38b661d2aeec75d18d8617eebb5f1"
|
checksum = "08cabc9f0066848fef4bc6a1c1668e6efce38b661d2aeec75d18d8617eebb5f1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_msvc"
|
||||||
|
version = "0.34.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_x86_64_msvc"
|
name = "windows_x86_64_msvc"
|
||||||
version = "0.36.1"
|
version = "0.36.1"
|
||||||
|
|||||||
@ -67,6 +67,8 @@ rdev = { git = "https://github.com/asur4s/rdev" }
|
|||||||
url = { version = "2.1", features = ["serde"] }
|
url = { version = "2.1", features = ["serde"] }
|
||||||
|
|
||||||
reqwest = { version = "0.11", features = ["blocking", "json", "rustls-tls"], default-features=false }
|
reqwest = { version = "0.11", features = ["blocking", "json", "rustls-tls"], default-features=false }
|
||||||
|
chrono = "0.4.23"
|
||||||
|
cidr-utils = "0.5.9"
|
||||||
|
|
||||||
[target.'cfg(not(any(target_os = "android", target_os = "linux")))'.dependencies]
|
[target.'cfg(not(any(target_os = "android", target_os = "linux")))'.dependencies]
|
||||||
cpal = "0.13.5"
|
cpal = "0.13.5"
|
||||||
@ -92,6 +94,8 @@ winreg = "0.10"
|
|||||||
windows-service = "0.4"
|
windows-service = "0.4"
|
||||||
virtual_display = { path = "libs/virtual_display" }
|
virtual_display = { path = "libs/virtual_display" }
|
||||||
impersonate_system = { git = "https://github.com/21pages/impersonate-system" }
|
impersonate_system = { git = "https://github.com/21pages/impersonate-system" }
|
||||||
|
shared_memory = "0.12.4"
|
||||||
|
shutdown_hooks = "0.1.0"
|
||||||
|
|
||||||
[target.'cfg(target_os = "macos")'.dependencies]
|
[target.'cfg(target_os = "macos")'.dependencies]
|
||||||
objc = "0.2"
|
objc = "0.2"
|
||||||
@ -123,7 +127,7 @@ jni = "0.19"
|
|||||||
flutter_rust_bridge = { git = "https://github.com/SoLongAndThanksForAllThePizza/flutter_rust_bridge" }
|
flutter_rust_bridge = { git = "https://github.com/SoLongAndThanksForAllThePizza/flutter_rust_bridge" }
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
members = ["libs/scrap", "libs/hbb_common", "libs/enigo", "libs/clipboard", "libs/virtual_display", "libs/simple_rc", "libs/portable"]
|
members = ["libs/scrap", "libs/hbb_common", "libs/enigo", "libs/clipboard", "libs/virtual_display", "libs/virtual_display/dylib", "libs/simple_rc", "libs/portable"]
|
||||||
|
|
||||||
[package.metadata.winres]
|
[package.metadata.winres]
|
||||||
LegalCopyright = "Copyright © 2022 Purslane, Inc."
|
LegalCopyright = "Copyright © 2022 Purslane, Inc."
|
||||||
@ -158,3 +162,4 @@ codegen-units = 1
|
|||||||
panic = 'abort'
|
panic = 'abort'
|
||||||
strip = true
|
strip = true
|
||||||
#opt-level = 'z' # only have smaller size after strip
|
#opt-level = 'z' # only have smaller size after strip
|
||||||
|
rpath = true
|
||||||
98
build.py
98
build.py
@ -10,10 +10,12 @@ import hashlib
|
|||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
windows = platform.platform().startswith('Windows')
|
windows = platform.platform().startswith('Windows')
|
||||||
osx = platform.platform().startswith('Darwin') or platform.platform().startswith("macOS")
|
osx = platform.platform().startswith(
|
||||||
|
'Darwin') or platform.platform().startswith("macOS")
|
||||||
hbb_name = 'rustdesk' + ('.exe' if windows else '')
|
hbb_name = 'rustdesk' + ('.exe' if windows else '')
|
||||||
exe_path = 'target/release/' + hbb_name
|
exe_path = 'target/release/' + hbb_name
|
||||||
flutter_win_target_dir = 'flutter/build/windows/runner/Release/'
|
flutter_win_target_dir = 'flutter/build/windows/runner/Release/'
|
||||||
|
skip_cargo = False
|
||||||
|
|
||||||
|
|
||||||
def get_version():
|
def get_version():
|
||||||
@ -86,6 +88,11 @@ def make_parser():
|
|||||||
action='store_true',
|
action='store_true',
|
||||||
help='Build rustdesk libs with the flatpak feature enabled'
|
help='Build rustdesk libs with the flatpak feature enabled'
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--skip-cargo',
|
||||||
|
action='store_true',
|
||||||
|
help='Skip cargo build process, only flutter version + Linux supported currently'
|
||||||
|
)
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
|
|
||||||
@ -124,6 +131,7 @@ def generate_build_script_for_docker():
|
|||||||
os.system("chmod +x /tmp/build.sh")
|
os.system("chmod +x /tmp/build.sh")
|
||||||
os.system("bash /tmp/build.sh")
|
os.system("bash /tmp/build.sh")
|
||||||
|
|
||||||
|
|
||||||
def download_extract_features(features, res_dir):
|
def download_extract_features(features, res_dir):
|
||||||
proxy = ''
|
proxy = ''
|
||||||
|
|
||||||
@ -139,7 +147,8 @@ def download_extract_features(features, res_dir):
|
|||||||
for (feat, feat_info) in features.items():
|
for (feat, feat_info) in features.items():
|
||||||
print(f'{feat} download begin')
|
print(f'{feat} download begin')
|
||||||
download_filename = feat_info['zip_url'].split('/')[-1]
|
download_filename = feat_info['zip_url'].split('/')[-1]
|
||||||
checksum_md5_response = urllib.request.urlopen(req(feat_info['checksum_url']))
|
checksum_md5_response = urllib.request.urlopen(
|
||||||
|
req(feat_info['checksum_url']))
|
||||||
for line in checksum_md5_response.read().decode('utf-8').splitlines():
|
for line in checksum_md5_response.read().decode('utf-8').splitlines():
|
||||||
if line.split()[1] == download_filename:
|
if line.split()[1] == download_filename:
|
||||||
checksum_md5 = line.split()[0]
|
checksum_md5 = line.split()[0]
|
||||||
@ -186,7 +195,7 @@ def get_rc_features(args):
|
|||||||
|
|
||||||
|
|
||||||
def get_features(args):
|
def get_features(args):
|
||||||
features = ['inline']
|
features = ['inline'] if not args.flutter else []
|
||||||
if windows:
|
if windows:
|
||||||
features.extend(get_rc_features(args))
|
features.extend(get_rc_features(args))
|
||||||
if args.hwcodec:
|
if args.hwcodec:
|
||||||
@ -224,17 +233,16 @@ def ffi_bindgen_function_refactor():
|
|||||||
|
|
||||||
|
|
||||||
def build_flutter_deb(version, features):
|
def build_flutter_deb(version, features):
|
||||||
os.system(f'cargo build --features {features} --lib --release')
|
if not skip_cargo:
|
||||||
ffi_bindgen_function_refactor()
|
os.system(f'cargo build --features {features} --lib --release')
|
||||||
|
ffi_bindgen_function_refactor()
|
||||||
os.chdir('flutter')
|
os.chdir('flutter')
|
||||||
os.system('dpkg-deb -R rustdesk.deb tmpdeb')
|
|
||||||
os.system('flutter build linux --release')
|
os.system('flutter build linux --release')
|
||||||
os.system('mkdir -p tmpdeb/usr/bin/')
|
os.system('mkdir -p tmpdeb/usr/bin/')
|
||||||
os.system('mkdir -p tmpdeb/usr/lib/rustdesk')
|
os.system('mkdir -p tmpdeb/usr/lib/rustdesk')
|
||||||
os.system('mkdir -p tmpdeb/usr/share/rustdesk/files/systemd/')
|
os.system('mkdir -p tmpdeb/usr/share/rustdesk/files/systemd/')
|
||||||
os.system('mkdir -p tmpdeb/usr/share/applications/')
|
os.system('mkdir -p tmpdeb/usr/share/applications/')
|
||||||
os.system('mkdir -p tmpdeb/usr/share/polkit-1/actions')
|
os.system('mkdir -p tmpdeb/usr/share/polkit-1/actions')
|
||||||
|
|
||||||
os.system('rm tmpdeb/usr/bin/rustdesk')
|
os.system('rm tmpdeb/usr/bin/rustdesk')
|
||||||
os.system(
|
os.system(
|
||||||
'cp -r build/linux/x64/release/bundle/* tmpdeb/usr/lib/rustdesk/')
|
'cp -r build/linux/x64/release/bundle/* tmpdeb/usr/lib/rustdesk/')
|
||||||
@ -263,8 +271,26 @@ def build_flutter_deb(version, features):
|
|||||||
os.chdir("..")
|
os.chdir("..")
|
||||||
|
|
||||||
|
|
||||||
|
def build_flutter_dmg(version, features):
|
||||||
|
if not skip_cargo:
|
||||||
|
os.system(f'cargo build --features {features} --lib --release')
|
||||||
|
# copy dylib
|
||||||
|
os.system(
|
||||||
|
"cp target/release/liblibrustdesk.dylib target/release/librustdesk.dylib")
|
||||||
|
# ffi_bindgen_function_refactor()
|
||||||
|
# limitations from flutter rust bridge
|
||||||
|
os.system('sed -i "" "s/char \*\*rustdesk_core_main(int \*args_len);//" flutter/macos/Runner/bridge_generated.h')
|
||||||
|
os.chdir('flutter')
|
||||||
|
os.system('flutter build macos --release')
|
||||||
|
os.system(
|
||||||
|
"create-dmg rustdesk.dmg ./build/macos/Build/Products/Release/rustdesk.app")
|
||||||
|
os.rename("rustdesk.dmg", f"../rustdesk-{version}.dmg")
|
||||||
|
os.chdir("..")
|
||||||
|
|
||||||
|
|
||||||
def build_flutter_arch_manjaro(version, features):
|
def build_flutter_arch_manjaro(version, features):
|
||||||
os.system(f'cargo build --features {features} --lib --release')
|
if not skip_cargo:
|
||||||
|
os.system(f'cargo build --features {features} --lib --release')
|
||||||
ffi_bindgen_function_refactor()
|
ffi_bindgen_function_refactor()
|
||||||
os.chdir('flutter')
|
os.chdir('flutter')
|
||||||
os.system('flutter build linux --release')
|
os.system('flutter build linux --release')
|
||||||
@ -274,28 +300,36 @@ def build_flutter_arch_manjaro(version, features):
|
|||||||
|
|
||||||
|
|
||||||
def build_flutter_windows(version, features):
|
def build_flutter_windows(version, features):
|
||||||
os.system(f'cargo build --features {features} --lib --release')
|
if not skip_cargo:
|
||||||
if not os.path.exists("target/release/librustdesk.dll"):
|
os.system(f'cargo build --features {features} --lib --release')
|
||||||
print("cargo build failed, please check rust source code.")
|
if not os.path.exists("target/release/librustdesk.dll"):
|
||||||
exit(-1)
|
print("cargo build failed, please check rust source code.")
|
||||||
|
exit(-1)
|
||||||
os.chdir('flutter')
|
os.chdir('flutter')
|
||||||
os.system('flutter build windows --release')
|
os.system('flutter build windows --release')
|
||||||
os.chdir('..')
|
os.chdir('..')
|
||||||
|
shutil.copy2('target/release/deps/dylib_virtual_display.dll',
|
||||||
|
flutter_win_target_dir)
|
||||||
os.chdir('libs/portable')
|
os.chdir('libs/portable')
|
||||||
os.system('pip3 install -r requirements.txt')
|
os.system('pip3 install -r requirements.txt')
|
||||||
os.system(
|
os.system(
|
||||||
f'python3 ./generate.py -f ../../{flutter_win_target_dir} -o . -e ../../{flutter_win_target_dir}/rustdesk.exe')
|
f'python3 ./generate.py -f ../../{flutter_win_target_dir} -o . -e ../../{flutter_win_target_dir}/rustdesk.exe')
|
||||||
os.chdir('../..')
|
os.chdir('../..')
|
||||||
if os.path.exists('./rustdesk_portable.exe'):
|
if os.path.exists('./rustdesk_portable.exe'):
|
||||||
os.replace('./target/release/rustdesk-portable-packer.exe', './rustdesk_portable.exe')
|
os.replace('./target/release/rustdesk-portable-packer.exe',
|
||||||
|
'./rustdesk_portable.exe')
|
||||||
else:
|
else:
|
||||||
os.rename('./target/release/rustdesk-portable-packer.exe', './rustdesk_portable.exe')
|
os.rename('./target/release/rustdesk-portable-packer.exe',
|
||||||
print(f'output location: {os.path.abspath(os.curdir)}/rustdesk_portable.exe')
|
'./rustdesk_portable.exe')
|
||||||
|
print(
|
||||||
|
f'output location: {os.path.abspath(os.curdir)}/rustdesk_portable.exe')
|
||||||
os.rename('./rustdesk_portable.exe', f'./rustdesk-{version}-install.exe')
|
os.rename('./rustdesk_portable.exe', f'./rustdesk-{version}-install.exe')
|
||||||
print(f'output location: {os.path.abspath(os.curdir)}/rustdesk-{version}-install.exe')
|
print(
|
||||||
|
f'output location: {os.path.abspath(os.curdir)}/rustdesk-{version}-install.exe')
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
global skip_cargo
|
||||||
parser = make_parser()
|
parser = make_parser()
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
@ -313,9 +347,18 @@ def main():
|
|||||||
version = get_version()
|
version = get_version()
|
||||||
features = ','.join(get_features(args))
|
features = ','.join(get_features(args))
|
||||||
flutter = args.flutter
|
flutter = args.flutter
|
||||||
os.system('python3 res/inline-sciter.py')
|
if not flutter:
|
||||||
|
os.system('python3 res/inline-sciter.py')
|
||||||
|
print(args.skip_cargo)
|
||||||
|
if args.skip_cargo:
|
||||||
|
skip_cargo = True
|
||||||
portable = args.portable
|
portable = args.portable
|
||||||
if windows:
|
if windows:
|
||||||
|
# build virtual display dynamic library
|
||||||
|
os.chdir('libs/virtual_display/dylib')
|
||||||
|
os.system('cargo build --release')
|
||||||
|
os.chdir('../../..')
|
||||||
|
|
||||||
if flutter:
|
if flutter:
|
||||||
build_flutter_windows(version, features)
|
build_flutter_windows(version, features)
|
||||||
return
|
return
|
||||||
@ -329,7 +372,8 @@ def main():
|
|||||||
'target\\release\\rustdesk.exe')
|
'target\\release\\rustdesk.exe')
|
||||||
else:
|
else:
|
||||||
print('Not signed')
|
print('Not signed')
|
||||||
os.system(f'cp -rf target/release/RustDesk.exe rustdesk-{version}-win7-install.exe')
|
os.system(
|
||||||
|
f'cp -rf target/release/RustDesk.exe rustdesk-{version}-win7-install.exe')
|
||||||
elif os.path.isfile('/usr/bin/pacman'):
|
elif os.path.isfile('/usr/bin/pacman'):
|
||||||
# pacman -S -needed base-devel
|
# pacman -S -needed base-devel
|
||||||
os.system("sed -i 's/pkgver=.*/pkgver=%s/g' res/PKGBUILD" % version)
|
os.system("sed -i 's/pkgver=.*/pkgver=%s/g' res/PKGBUILD" % version)
|
||||||
@ -342,12 +386,13 @@ def main():
|
|||||||
os.system('ln -s res/pacman_install && ln -s res/PKGBUILD')
|
os.system('ln -s res/pacman_install && ln -s res/PKGBUILD')
|
||||||
os.system('HBB=`pwd` makepkg -f')
|
os.system('HBB=`pwd` makepkg -f')
|
||||||
os.system('mv rustdesk-%s-0-x86_64.pkg.tar.zst rustdesk-%s-manjaro-arch.pkg.tar.zst' % (
|
os.system('mv rustdesk-%s-0-x86_64.pkg.tar.zst rustdesk-%s-manjaro-arch.pkg.tar.zst' % (
|
||||||
version, version))
|
version, version))
|
||||||
# pacman -U ./rustdesk.pkg.tar.zst
|
# pacman -U ./rustdesk.pkg.tar.zst
|
||||||
elif os.path.isfile('/usr/bin/yum'):
|
elif os.path.isfile('/usr/bin/yum'):
|
||||||
os.system('cargo build --release --features ' + features)
|
os.system('cargo build --release --features ' + features)
|
||||||
os.system('strip target/release/rustdesk')
|
os.system('strip target/release/rustdesk')
|
||||||
os.system("sed -i 's/Version: .*/Version: %s/g' res/rpm.spec" % version)
|
os.system(
|
||||||
|
"sed -i 's/Version: .*/Version: %s/g' res/rpm.spec" % version)
|
||||||
os.system('HBB=`pwd` rpmbuild -ba res/rpm.spec')
|
os.system('HBB=`pwd` rpmbuild -ba res/rpm.spec')
|
||||||
os.system(
|
os.system(
|
||||||
'mv $HOME/rpmbuild/RPMS/x86_64/rustdesk-%s-0.x86_64.rpm ./rustdesk-%s-fedora28-centos8.rpm' % (
|
'mv $HOME/rpmbuild/RPMS/x86_64/rustdesk-%s-0.x86_64.rpm ./rustdesk-%s-fedora28-centos8.rpm' % (
|
||||||
@ -356,23 +401,24 @@ def main():
|
|||||||
elif os.path.isfile('/usr/bin/zypper'):
|
elif os.path.isfile('/usr/bin/zypper'):
|
||||||
os.system('cargo build --release --features ' + features)
|
os.system('cargo build --release --features ' + features)
|
||||||
os.system('strip target/release/rustdesk')
|
os.system('strip target/release/rustdesk')
|
||||||
os.system("sed -i 's/Version: .*/Version: %s/g' res/rpm-suse.spec" % version)
|
os.system(
|
||||||
|
"sed -i 's/Version: .*/Version: %s/g' res/rpm-suse.spec" % version)
|
||||||
os.system('HBB=`pwd` rpmbuild -ba res/rpm-suse.spec')
|
os.system('HBB=`pwd` rpmbuild -ba res/rpm-suse.spec')
|
||||||
os.system(
|
os.system(
|
||||||
'mv $HOME/rpmbuild/RPMS/x86_64/rustdesk-%s-0.x86_64.rpm ./rustdesk-%s-suse.rpm' % (
|
'mv $HOME/rpmbuild/RPMS/x86_64/rustdesk-%s-0.x86_64.rpm ./rustdesk-%s-suse.rpm' % (
|
||||||
version, version))
|
version, version))
|
||||||
# yum localinstall rustdesk.rpm
|
# yum localinstall rustdesk.rpm
|
||||||
else:
|
else:
|
||||||
os.system('cargo bundle --release --features ' + features)
|
|
||||||
if flutter:
|
if flutter:
|
||||||
if osx:
|
if osx:
|
||||||
# todo: OSX build
|
build_flutter_dmg(version, features)
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
os.system(
|
# os.system(
|
||||||
'mv target/release/bundle/deb/rustdesk*.deb ./flutter/rustdesk.deb')
|
# 'mv target/release/bundle/deb/rustdesk*.deb ./flutter/rustdesk.deb')
|
||||||
build_flutter_deb(version, features)
|
build_flutter_deb(version, features)
|
||||||
else:
|
else:
|
||||||
|
os.system('cargo bundle --release --features ' + features)
|
||||||
if osx:
|
if osx:
|
||||||
os.system(
|
os.system(
|
||||||
'strip target/release/bundle/osx/RustDesk.app/Contents/MacOS/rustdesk')
|
'strip target/release/bundle/osx/RustDesk.app/Contents/MacOS/rustdesk')
|
||||||
|
|||||||
@ -15,7 +15,6 @@ import 'package:flutter_hbb/main.dart';
|
|||||||
import 'package:flutter_hbb/models/peer_model.dart';
|
import 'package:flutter_hbb/models/peer_model.dart';
|
||||||
import 'package:flutter_hbb/utils/multi_window_manager.dart';
|
import 'package:flutter_hbb/utils/multi_window_manager.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
|
||||||
import 'package:uni_links/uni_links.dart';
|
import 'package:uni_links/uni_links.dart';
|
||||||
import 'package:uni_links_desktop/uni_links_desktop.dart';
|
import 'package:uni_links_desktop/uni_links_desktop.dart';
|
||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
@ -205,18 +204,17 @@ class MyTheme {
|
|||||||
);
|
);
|
||||||
|
|
||||||
static ThemeMode getThemeModePreference() {
|
static ThemeMode getThemeModePreference() {
|
||||||
return themeModeFromString(
|
return themeModeFromString(bind.mainGetLocalOption(key: kCommConfKeyTheme));
|
||||||
Get.find<SharedPreferences>().getString("themeMode") ?? "");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void changeDarkMode(ThemeMode mode) {
|
static void changeDarkMode(ThemeMode mode) {
|
||||||
final preference = getThemeModePreference();
|
final preference = getThemeModePreference();
|
||||||
if (preference != mode) {
|
if (preference != mode) {
|
||||||
if (mode == ThemeMode.system) {
|
if (mode == ThemeMode.system) {
|
||||||
Get.find<SharedPreferences>().setString("themeMode", "");
|
bind.mainSetLocalOption(key: kCommConfKeyTheme, value: '');
|
||||||
} else {
|
} else {
|
||||||
Get.find<SharedPreferences>()
|
bind.mainSetLocalOption(
|
||||||
.setString("themeMode", mode.toShortString());
|
key: kCommConfKeyTheme, value: mode.toShortString());
|
||||||
}
|
}
|
||||||
Get.changeThemeMode(mode);
|
Get.changeThemeMode(mode);
|
||||||
if (desktopType == DesktopType.main) {
|
if (desktopType == DesktopType.main) {
|
||||||
@ -629,7 +627,7 @@ class CustomAlertDialog extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void msgBox(String type, String title, String text, String link,
|
void msgBox(String id, String type, String title, String text, String link,
|
||||||
OverlayDialogManager dialogManager,
|
OverlayDialogManager dialogManager,
|
||||||
{bool? hasCancel}) {
|
{bool? hasCancel}) {
|
||||||
dialogManager.dismissAll();
|
dialogManager.dismissAll();
|
||||||
@ -674,14 +672,17 @@ void msgBox(String type, String title, String text, String link,
|
|||||||
if (link.isNotEmpty) {
|
if (link.isNotEmpty) {
|
||||||
buttons.insert(0, msgBoxButton(translate('JumpLink'), jumplink));
|
buttons.insert(0, msgBoxButton(translate('JumpLink'), jumplink));
|
||||||
}
|
}
|
||||||
dialogManager.show((setState, close) => CustomAlertDialog(
|
dialogManager.show(
|
||||||
title: _msgBoxTitle(title),
|
(setState, close) => CustomAlertDialog(
|
||||||
content: SelectableText(translate(text),
|
title: _msgBoxTitle(title),
|
||||||
style: const TextStyle(fontSize: 15)),
|
content:
|
||||||
actions: buttons,
|
SelectableText(translate(text), style: const TextStyle(fontSize: 15)),
|
||||||
onSubmit: hasOk ? submit : null,
|
actions: buttons,
|
||||||
onCancel: hasCancel == true ? cancel : null,
|
onSubmit: hasOk ? submit : null,
|
||||||
));
|
onCancel: hasCancel == true ? cancel : null,
|
||||||
|
),
|
||||||
|
tag: '$id-$type-$title-$text-$link',
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget msgBoxButton(String text, void Function() onPressed) {
|
Widget msgBoxButton(String text, void Function() onPressed) {
|
||||||
@ -1026,8 +1027,8 @@ Future<void> saveWindowPosition(WindowType type, {int? windowId}) async {
|
|||||||
final isMaximized = await windowManager.isMaximized();
|
final isMaximized = await windowManager.isMaximized();
|
||||||
final pos = LastWindowPosition(
|
final pos = LastWindowPosition(
|
||||||
sz.width, sz.height, position.dx, position.dy, isMaximized);
|
sz.width, sz.height, position.dx, position.dy, isMaximized);
|
||||||
await Get.find<SharedPreferences>()
|
await bind.setLocalFlutterConfig(
|
||||||
.setString(kWindowPrefix + type.name, pos.toString());
|
k: kWindowPrefix + type.name, v: pos.toString());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
final wc = WindowController.fromWindowId(windowId!);
|
final wc = WindowController.fromWindowId(windowId!);
|
||||||
@ -1037,9 +1038,10 @@ Future<void> saveWindowPosition(WindowType type, {int? windowId}) async {
|
|||||||
final isMaximized = await wc.isMaximized();
|
final isMaximized = await wc.isMaximized();
|
||||||
final pos = LastWindowPosition(
|
final pos = LastWindowPosition(
|
||||||
sz.width, sz.height, position.dx, position.dy, isMaximized);
|
sz.width, sz.height, position.dx, position.dy, isMaximized);
|
||||||
debugPrint("saving frame: ${windowId}: ${pos.width}/${pos.height}, offset:${pos.offsetWidth}/${pos.offsetHeight}");
|
debugPrint(
|
||||||
await Get.find<SharedPreferences>()
|
"saving frame: $windowId: ${pos.width}/${pos.height}, offset:${pos.offsetWidth}/${pos.offsetHeight}");
|
||||||
.setString(kWindowPrefix + type.name, pos.toString());
|
await bind.setLocalFlutterConfig(
|
||||||
|
k: kWindowPrefix + type.name, v: pos.toString());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1109,7 +1111,7 @@ Future<Offset?> _adjustRestoreMainWindowOffset(
|
|||||||
.toDouble();
|
.toDouble();
|
||||||
|
|
||||||
if (isDesktop || isWebDesktop) {
|
if (isDesktop || isWebDesktop) {
|
||||||
for(final screen in await window_size.getScreenList()) {
|
for (final screen in await window_size.getScreenList()) {
|
||||||
frameLeft = min(screen.visibleFrame.left, frameLeft);
|
frameLeft = min(screen.visibleFrame.left, frameLeft);
|
||||||
frameTop = min(screen.visibleFrame.top, frameTop);
|
frameTop = min(screen.visibleFrame.top, frameTop);
|
||||||
frameRight = max(screen.visibleFrame.right, frameRight);
|
frameRight = max(screen.visibleFrame.right, frameRight);
|
||||||
@ -1136,13 +1138,7 @@ Future<bool> restoreWindowPosition(WindowType type, {int? windowId}) async {
|
|||||||
debugPrint(
|
debugPrint(
|
||||||
"Error: windowId cannot be null when saving positions for sub window");
|
"Error: windowId cannot be null when saving positions for sub window");
|
||||||
}
|
}
|
||||||
final pos =
|
final pos = bind.getLocalFlutterConfig(k: kWindowPrefix + type.name);
|
||||||
Get.find<SharedPreferences>().getString(kWindowPrefix + type.name);
|
|
||||||
|
|
||||||
if (pos == null) {
|
|
||||||
debugPrint("no window position saved, ignore restore");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
var lpos = LastWindowPosition.loadFromString(pos);
|
var lpos = LastWindowPosition.loadFromString(pos);
|
||||||
if (lpos == null) {
|
if (lpos == null) {
|
||||||
debugPrint("window position saved, but cannot be parsed");
|
debugPrint("window position saved, but cannot be parsed");
|
||||||
@ -1175,7 +1171,8 @@ Future<bool> restoreWindowPosition(WindowType type, {int? windowId}) async {
|
|||||||
await _adjustRestoreMainWindowSize(lpos.width, lpos.height);
|
await _adjustRestoreMainWindowSize(lpos.width, lpos.height);
|
||||||
final offset = await _adjustRestoreMainWindowOffset(
|
final offset = await _adjustRestoreMainWindowOffset(
|
||||||
lpos.offsetWidth, lpos.offsetHeight);
|
lpos.offsetWidth, lpos.offsetHeight);
|
||||||
debugPrint("restore lpos: ${size.width}/${size.height}, offset:${offset?.dx}/${offset?.dy}");
|
debugPrint(
|
||||||
|
"restore lpos: ${size.width}/${size.height}, offset:${offset?.dx}/${offset?.dy}");
|
||||||
if (offset == null) {
|
if (offset == null) {
|
||||||
await wc.center();
|
await wc.center();
|
||||||
} else {
|
} else {
|
||||||
@ -1327,8 +1324,7 @@ void connect(BuildContext context, String id,
|
|||||||
|
|
||||||
Future<Map<String, String>> getHttpHeaders() async {
|
Future<Map<String, String>> getHttpHeaders() async {
|
||||||
return {
|
return {
|
||||||
'Authorization':
|
'Authorization': 'Bearer ${bind.mainGetLocalOption(key: 'access_token')}'
|
||||||
'Bearer ${await bind.mainGetLocalOption(key: 'access_token')}'
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -201,3 +201,47 @@ class RemoteCountState {
|
|||||||
|
|
||||||
static RxInt find() => Get.find<RxInt>(tag: tag());
|
static RxInt find() => Get.find<RxInt>(tag: tag());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class PeerBoolOption {
|
||||||
|
static String tag(String id, String opt) => 'peer_{$opt}_$id';
|
||||||
|
|
||||||
|
static void init(String id, String opt, bool Function() init_getter) {
|
||||||
|
final key = tag(id, opt);
|
||||||
|
if (!Get.isRegistered(tag: key)) {
|
||||||
|
final RxBool value = RxBool(init_getter());
|
||||||
|
Get.put(value, tag: key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void delete(String id, String opt) {
|
||||||
|
final key = tag(id, opt);
|
||||||
|
if (Get.isRegistered(tag: key)) {
|
||||||
|
Get.delete(tag: key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static RxBool find(String id, String opt) =>
|
||||||
|
Get.find<RxBool>(tag: tag(id, opt));
|
||||||
|
}
|
||||||
|
|
||||||
|
class PeerStringOption {
|
||||||
|
static String tag(String id, String opt) => 'peer_{$opt}_$id';
|
||||||
|
|
||||||
|
static void init(String id, String opt, String Function() init_getter) {
|
||||||
|
final key = tag(id, opt);
|
||||||
|
if (!Get.isRegistered(tag: key)) {
|
||||||
|
final RxString value = RxString(init_getter());
|
||||||
|
Get.put(value, tag: key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void delete(String id, String opt) {
|
||||||
|
final key = tag(id, opt);
|
||||||
|
if (Get.isRegistered(tag: key)) {
|
||||||
|
Get.delete(tag: key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static RxString find(String id, String opt) =>
|
||||||
|
Get.find<RxString>(tag: tag(id, opt));
|
||||||
|
}
|
||||||
|
|||||||
@ -133,9 +133,12 @@ void changeWhiteList({Function()? callback}) async {
|
|||||||
final ips =
|
final ips =
|
||||||
newWhiteListField.trim().split(RegExp(r"[\s,;\n]+"));
|
newWhiteListField.trim().split(RegExp(r"[\s,;\n]+"));
|
||||||
// test ip
|
// test ip
|
||||||
final ipMatch = RegExp(r"^\d+\.\d+\.\d+\.\d+$");
|
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) {
|
for (final ip in ips) {
|
||||||
if (!ipMatch.hasMatch(ip)) {
|
if (!ipMatch.hasMatch(ip) && !ipv6Match.hasMatch(ip)) {
|
||||||
msg = "${translate("Invalid IP")} $ip";
|
msg = "${translate("Invalid IP")} $ip";
|
||||||
setState(() {
|
setState(() {
|
||||||
isInProgress = false;
|
isInProgress = false;
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_hbb/common/widgets/address_book.dart';
|
import 'package:flutter_hbb/common/widgets/address_book.dart';
|
||||||
@ -446,6 +448,22 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Only avaliable on Windows.
|
||||||
|
@protected
|
||||||
|
MenuEntryBase<String> _createShortCutAction(String id) {
|
||||||
|
return MenuEntryButton<String>(
|
||||||
|
childBuilder: (TextStyle? style) => Text(
|
||||||
|
translate('Create Desktop Shortcut'),
|
||||||
|
style: style,
|
||||||
|
),
|
||||||
|
proc: () {
|
||||||
|
bind.mainCreateShortcut(id: id);
|
||||||
|
},
|
||||||
|
padding: menuPadding,
|
||||||
|
dismissOnClicked: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
Future<MenuEntryBase<String>> _forceAlwaysRelayAction(String id) async {
|
Future<MenuEntryBase<String>> _forceAlwaysRelayAction(String id) async {
|
||||||
const option = 'force-always-relay';
|
const option = 'force-always-relay';
|
||||||
@ -584,7 +602,7 @@ abstract class BasePeerCard extends StatelessWidget {
|
|||||||
submit() async {
|
submit() async {
|
||||||
isInProgress.value = true;
|
isInProgress.value = true;
|
||||||
name = controller.text;
|
name = controller.text;
|
||||||
await bind.mainSetPeerOption(id: id, key: 'alias', value: name);
|
await bind.mainSetPeerAlias(id: id, alias: name);
|
||||||
if (isAddressBook) {
|
if (isAddressBook) {
|
||||||
gFFI.abModel.setPeerAlias(id, name);
|
gFFI.abModel.setPeerAlias(id, name);
|
||||||
await gFFI.abModel.pushAb();
|
await gFFI.abModel.pushAb();
|
||||||
@ -649,6 +667,9 @@ class RecentPeerCard extends BasePeerCard {
|
|||||||
menuItems.add(_rdpAction(context, peer.id));
|
menuItems.add(_rdpAction(context, peer.id));
|
||||||
}
|
}
|
||||||
menuItems.add(_wolAction(peer.id));
|
menuItems.add(_wolAction(peer.id));
|
||||||
|
if (Platform.isWindows) {
|
||||||
|
menuItems.add(_createShortCutAction(peer.id));
|
||||||
|
}
|
||||||
menuItems.add(MenuEntryDivider());
|
menuItems.add(MenuEntryDivider());
|
||||||
menuItems.add(_renameAction(peer.id, false));
|
menuItems.add(_renameAction(peer.id, false));
|
||||||
menuItems.add(_removeAction(peer.id, () async {
|
menuItems.add(_removeAction(peer.id, () async {
|
||||||
@ -681,6 +702,9 @@ class FavoritePeerCard extends BasePeerCard {
|
|||||||
menuItems.add(_rdpAction(context, peer.id));
|
menuItems.add(_rdpAction(context, peer.id));
|
||||||
}
|
}
|
||||||
menuItems.add(_wolAction(peer.id));
|
menuItems.add(_wolAction(peer.id));
|
||||||
|
if (Platform.isWindows) {
|
||||||
|
menuItems.add(_createShortCutAction(peer.id));
|
||||||
|
}
|
||||||
menuItems.add(MenuEntryDivider());
|
menuItems.add(MenuEntryDivider());
|
||||||
menuItems.add(_renameAction(peer.id, false));
|
menuItems.add(_renameAction(peer.id, false));
|
||||||
menuItems.add(_removeAction(peer.id, () async {
|
menuItems.add(_removeAction(peer.id, () async {
|
||||||
@ -715,6 +739,9 @@ class DiscoveredPeerCard extends BasePeerCard {
|
|||||||
menuItems.add(_rdpAction(context, peer.id));
|
menuItems.add(_rdpAction(context, peer.id));
|
||||||
}
|
}
|
||||||
menuItems.add(_wolAction(peer.id));
|
menuItems.add(_wolAction(peer.id));
|
||||||
|
if (Platform.isWindows) {
|
||||||
|
menuItems.add(_createShortCutAction(peer.id));
|
||||||
|
}
|
||||||
menuItems.add(MenuEntryDivider());
|
menuItems.add(MenuEntryDivider());
|
||||||
menuItems.add(_removeAction(peer.id, () async {}));
|
menuItems.add(_removeAction(peer.id, () async {}));
|
||||||
return menuItems;
|
return menuItems;
|
||||||
@ -740,6 +767,9 @@ class AddressBookPeerCard extends BasePeerCard {
|
|||||||
menuItems.add(_rdpAction(context, peer.id));
|
menuItems.add(_rdpAction(context, peer.id));
|
||||||
}
|
}
|
||||||
menuItems.add(_wolAction(peer.id));
|
menuItems.add(_wolAction(peer.id));
|
||||||
|
if (Platform.isWindows) {
|
||||||
|
menuItems.add(_createShortCutAction(peer.id));
|
||||||
|
}
|
||||||
menuItems.add(MenuEntryDivider());
|
menuItems.add(MenuEntryDivider());
|
||||||
menuItems.add(_renameAction(peer.id, false));
|
menuItems.add(_renameAction(peer.id, false));
|
||||||
menuItems.add(_removeAction(peer.id, () async {}));
|
menuItems.add(_removeAction(peer.id, () async {}));
|
||||||
|
|||||||
@ -22,27 +22,28 @@ class _PeerTabPageState extends State<PeerTabPage>
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
() async {
|
setPeer();
|
||||||
await bind.mainGetLocalOption(key: 'peer-tab-index').then((value) {
|
|
||||||
if (value == '') return;
|
|
||||||
final tab = int.parse(value);
|
|
||||||
_tabIndex.value = tab;
|
|
||||||
});
|
|
||||||
await bind.mainGetLocalOption(key: 'peer-card-ui-type').then((value) {
|
|
||||||
if (value == '') return;
|
|
||||||
final tab = int.parse(value);
|
|
||||||
peerCardUiType.value =
|
|
||||||
tab == PeerUiType.list.index ? PeerUiType.list : PeerUiType.grid;
|
|
||||||
});
|
|
||||||
}();
|
|
||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setPeer() {
|
||||||
|
final index = bind.getLocalFlutterConfig(k: 'peer-tab-index');
|
||||||
|
if (index != '') {
|
||||||
|
_tabIndex.value = int.parse(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
final uiType = bind.getLocalFlutterConfig(k: 'peer-card-ui-type');
|
||||||
|
if (uiType != '') {
|
||||||
|
peerCardUiType.value = int.parse(uiType) == PeerUiType.list.index
|
||||||
|
? PeerUiType.list
|
||||||
|
: PeerUiType.grid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// hard code for now
|
// hard code for now
|
||||||
Future<void> _handleTabSelection(int index) async {
|
Future<void> _handleTabSelection(int index) async {
|
||||||
_tabIndex.value = index;
|
_tabIndex.value = index;
|
||||||
await bind.mainSetLocalOption(
|
await bind.setLocalFlutterConfig(k: 'peer-tab-index', v: index.toString());
|
||||||
key: 'peer-tab-index', value: index.toString());
|
|
||||||
switch (index) {
|
switch (index) {
|
||||||
case 0:
|
case 0:
|
||||||
bind.mainLoadRecentPeers();
|
bind.mainLoadRecentPeers();
|
||||||
@ -148,9 +149,8 @@ class _PeerTabPageState extends State<PeerTabPage>
|
|||||||
decoration: peerCardUiType.value == type ? activeDeco : null,
|
decoration: peerCardUiType.value == type ? activeDeco : null,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
await bind.mainSetLocalOption(
|
await bind.setLocalFlutterConfig(
|
||||||
key: 'peer-card-ui-type',
|
k: 'peer-card-ui-type', v: type.index.toString());
|
||||||
value: type.index.toString());
|
|
||||||
peerCardUiType.value = type;
|
peerCardUiType.value = type;
|
||||||
},
|
},
|
||||||
child: Icon(
|
child: Icon(
|
||||||
|
|||||||
@ -51,6 +51,11 @@ class RawPointerMouseRegion extends StatelessWidget {
|
|||||||
onPointerUp: inputModel.onPointUpImage,
|
onPointerUp: inputModel.onPointUpImage,
|
||||||
onPointerMove: inputModel.onPointMoveImage,
|
onPointerMove: inputModel.onPointMoveImage,
|
||||||
onPointerSignal: inputModel.onPointerSignalImage,
|
onPointerSignal: inputModel.onPointerSignalImage,
|
||||||
|
/*
|
||||||
|
onPointerPanZoomStart: inputModel.onPointerPanZoomStart,
|
||||||
|
onPointerPanZoomUpdate: inputModel.onPointerPanZoomUpdate,
|
||||||
|
onPointerPanZoomEnd: inputModel.onPointerPanZoomEnd,
|
||||||
|
*/
|
||||||
child: MouseRegion(
|
child: MouseRegion(
|
||||||
cursor: cursor ?? MouseCursor.defer,
|
cursor: cursor ?? MouseCursor.defer,
|
||||||
onEnter: onEnter,
|
onEnter: onEnter,
|
||||||
|
|||||||
@ -56,7 +56,11 @@ var kWindowEdgeSize = Platform.isWindows ? 1.0 : 5.0;
|
|||||||
const kWindowBorderWidth = 1.0;
|
const kWindowBorderWidth = 1.0;
|
||||||
const kDesktopMenuPadding = EdgeInsets.only(left: 12.0, right: 3.0);
|
const kDesktopMenuPadding = EdgeInsets.only(left: 12.0, right: 3.0);
|
||||||
|
|
||||||
const kInvalidValueStr = "InvalidValueStr";
|
const kInvalidValueStr = 'InvalidValueStr';
|
||||||
|
|
||||||
|
// Config key shared by flutter and other ui.
|
||||||
|
const kCommConfKeyTheme = 'theme';
|
||||||
|
const kCommConfKeyLang = 'lang';
|
||||||
|
|
||||||
const kMobilePageConstraints = BoxConstraints(maxWidth: 600);
|
const kMobilePageConstraints = BoxConstraints(maxWidth: 600);
|
||||||
|
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import 'dart:async';
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:auto_size_text/auto_size_text.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_hbb/common/widgets/address_book.dart';
|
import 'package:flutter_hbb/common/widgets/address_book.dart';
|
||||||
import 'package:flutter_hbb/consts.dart';
|
import 'package:flutter_hbb/consts.dart';
|
||||||
@ -93,6 +94,12 @@ class _ConnectionPageState extends State<ConnectionPage>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onWindowClose() {
|
||||||
|
super.onWindowClose();
|
||||||
|
bind.mainOnMainWindowClose();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Column(
|
return Column(
|
||||||
@ -171,12 +178,15 @@ class _ConnectionPageState extends State<ConnectionPage>
|
|||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Expanded(
|
||||||
translate('Control Remote Desktop'),
|
child: AutoSizeText(
|
||||||
style: Theme.of(context)
|
translate('Control Remote Desktop'),
|
||||||
.textTheme
|
maxLines: 1,
|
||||||
.titleLarge
|
style: Theme.of(context)
|
||||||
?.merge(TextStyle(height: 1)),
|
.textTheme
|
||||||
|
.titleLarge
|
||||||
|
?.merge(TextStyle(height: 1)),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
).marginOnly(bottom: 15),
|
).marginOnly(bottom: 15),
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import 'dart:async';
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:auto_size_text/auto_size_text.dart';
|
||||||
import 'package:flutter/material.dart' hide MenuItem;
|
import 'package:flutter/material.dart' hide MenuItem;
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_hbb/common.dart';
|
import 'package:flutter_hbb/common.dart';
|
||||||
@ -202,10 +203,11 @@ class _DesktopHomePageState extends State<DesktopHomePage>
|
|||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
AutoSizeText(
|
||||||
translate("Password"),
|
translate("One-time Password"),
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 14, color: textColor?.withOpacity(0.5)),
|
fontSize: 14, color: textColor?.withOpacity(0.5)),
|
||||||
|
maxLines: 1,
|
||||||
),
|
),
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
@ -484,7 +486,7 @@ void setPasswordDialog() async {
|
|||||||
errMsg1 = "";
|
errMsg1 = "";
|
||||||
});
|
});
|
||||||
final pass = p0.text.trim();
|
final pass = p0.text.trim();
|
||||||
if (pass.length < 6) {
|
if (pass.length < 6 && pass.isNotEmpty) {
|
||||||
setState(() {
|
setState(() {
|
||||||
errMsg0 = translate("Too short, at least 6 characters.");
|
errMsg0 = translate("Too short, at least 6 characters.");
|
||||||
});
|
});
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import 'package:file_picker/file_picker.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_hbb/common.dart';
|
import 'package:flutter_hbb/common.dart';
|
||||||
|
import 'package:flutter_hbb/consts.dart';
|
||||||
import 'package:flutter_hbb/desktop/pages/desktop_home_page.dart';
|
import 'package:flutter_hbb/desktop/pages/desktop_home_page.dart';
|
||||||
import 'package:flutter_hbb/desktop/pages/desktop_tab_page.dart';
|
import 'package:flutter_hbb/desktop/pages/desktop_tab_page.dart';
|
||||||
import 'package:flutter_hbb/desktop/widgets/login.dart';
|
import 'package:flutter_hbb/desktop/widgets/login.dart';
|
||||||
@ -30,8 +31,8 @@ const double _kListViewBottomMargin = 15;
|
|||||||
const double _kTitleFontSize = 20;
|
const double _kTitleFontSize = 20;
|
||||||
const double _kContentFontSize = 15;
|
const double _kContentFontSize = 15;
|
||||||
const Color _accentColor = MyTheme.accent;
|
const Color _accentColor = MyTheme.accent;
|
||||||
const String _kSettingPageControllerTag = "settingPageController";
|
const String _kSettingPageControllerTag = 'settingPageController';
|
||||||
const String _kSettingPageIndexTag = "settingPageIndex";
|
const String _kSettingPageIndexTag = 'settingPageIndex';
|
||||||
|
|
||||||
class _TabInfo {
|
class _TabInfo {
|
||||||
late final String label;
|
late final String label;
|
||||||
@ -250,19 +251,19 @@ class _GeneralState extends State<_General> {
|
|||||||
|
|
||||||
return _Card(title: 'Theme', children: [
|
return _Card(title: 'Theme', children: [
|
||||||
_Radio<String>(context,
|
_Radio<String>(context,
|
||||||
value: "light",
|
value: 'light',
|
||||||
groupValue: current,
|
groupValue: current,
|
||||||
label: "Light",
|
label: 'Light',
|
||||||
onChanged: onChanged),
|
onChanged: onChanged),
|
||||||
_Radio<String>(context,
|
_Radio<String>(context,
|
||||||
value: "dark",
|
value: 'dark',
|
||||||
groupValue: current,
|
groupValue: current,
|
||||||
label: "Dark",
|
label: 'Dark',
|
||||||
onChanged: onChanged),
|
onChanged: onChanged),
|
||||||
_Radio<String>(context,
|
_Radio<String>(context,
|
||||||
value: "system",
|
value: 'system',
|
||||||
groupValue: current,
|
groupValue: current,
|
||||||
label: "Follow System",
|
label: 'Follow System',
|
||||||
onChanged: onChanged),
|
onChanged: onChanged),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@ -286,8 +287,8 @@ class _GeneralState extends State<_General> {
|
|||||||
|
|
||||||
Widget audio(BuildContext context) {
|
Widget audio(BuildContext context) {
|
||||||
String getDefault() {
|
String getDefault() {
|
||||||
if (Platform.isWindows) return "System Sound";
|
if (Platform.isWindows) return 'System Sound';
|
||||||
return "";
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> getValue() async {
|
Future<String> getValue() async {
|
||||||
@ -300,7 +301,7 @@ class _GeneralState extends State<_General> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setDevice(String device) {
|
setDevice(String device) {
|
||||||
if (device == getDefault()) device = "";
|
if (device == getDefault()) device = '';
|
||||||
bind.mainSetOption(key: 'audio-input', value: device);
|
bind.mainSetOption(key: 'audio-input', value: device);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,7 +354,7 @@ class _GeneralState extends State<_General> {
|
|||||||
'allow-auto-record-incoming'),
|
'allow-auto-record-incoming'),
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Text('${translate('Directory')}:'),
|
Text('${translate("Directory")}:'),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
onTap: canlaunch ? () => launchUrl(Uri.file(dir)) : null,
|
onTap: canlaunch ? () => launchUrl(Uri.file(dir)) : null,
|
||||||
@ -386,26 +387,26 @@ class _GeneralState extends State<_General> {
|
|||||||
Widget language() {
|
Widget language() {
|
||||||
return _futureBuilder(future: () async {
|
return _futureBuilder(future: () async {
|
||||||
String langs = await bind.mainGetLangs();
|
String langs = await bind.mainGetLangs();
|
||||||
String lang = await bind.mainGetLocalOption(key: "lang");
|
String lang = bind.mainGetLocalOption(key: kCommConfKeyLang);
|
||||||
return {"langs": langs, "lang": lang};
|
return {'langs': langs, 'lang': lang};
|
||||||
}(), hasData: (res) {
|
}(), hasData: (res) {
|
||||||
Map<String, String> data = res as Map<String, String>;
|
Map<String, String> data = res as Map<String, String>;
|
||||||
List<dynamic> langsList = jsonDecode(data["langs"]!);
|
List<dynamic> langsList = jsonDecode(data['langs']!);
|
||||||
Map<String, String> langsMap = {for (var v in langsList) v[0]: v[1]};
|
Map<String, String> langsMap = {for (var v in langsList) v[0]: v[1]};
|
||||||
List<String> keys = langsMap.keys.toList();
|
List<String> keys = langsMap.keys.toList();
|
||||||
List<String> values = langsMap.values.toList();
|
List<String> values = langsMap.values.toList();
|
||||||
keys.insert(0, "");
|
keys.insert(0, '');
|
||||||
values.insert(0, "Default");
|
values.insert(0, 'Default');
|
||||||
String currentKey = data["lang"]!;
|
String currentKey = data['lang']!;
|
||||||
if (!keys.contains(currentKey)) {
|
if (!keys.contains(currentKey)) {
|
||||||
currentKey = "";
|
currentKey = '';
|
||||||
}
|
}
|
||||||
return _ComboBox(
|
return _ComboBox(
|
||||||
keys: keys,
|
keys: keys,
|
||||||
values: values,
|
values: values,
|
||||||
initialKey: currentKey,
|
initialKey: currentKey,
|
||||||
onChanged: (key) async {
|
onChanged: (key) async {
|
||||||
await bind.mainSetLocalOption(key: "lang", value: key);
|
await bind.mainSetLocalOption(key: kCommConfKeyLang, value: key);
|
||||||
reloadAllWindows();
|
reloadAllWindows();
|
||||||
bind.mainChangeLanguage(lang: key);
|
bind.mainChangeLanguage(lang: key);
|
||||||
},
|
},
|
||||||
@ -579,20 +580,21 @@ class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin {
|
|||||||
return ChangeNotifierProvider.value(
|
return ChangeNotifierProvider.value(
|
||||||
value: gFFI.serverModel,
|
value: gFFI.serverModel,
|
||||||
child: Consumer<ServerModel>(builder: ((context, model, child) {
|
child: Consumer<ServerModel>(builder: ((context, model, child) {
|
||||||
List<String> keys = [
|
List<String> passwordKeys = [
|
||||||
kUseTemporaryPassword,
|
kUseTemporaryPassword,
|
||||||
kUsePermanentPassword,
|
kUsePermanentPassword,
|
||||||
kUseBothPasswords,
|
kUseBothPasswords,
|
||||||
];
|
];
|
||||||
List<String> values = [
|
List<String> passwordValues = [
|
||||||
translate("Use temporary password"),
|
translate('Use one-time password'),
|
||||||
translate("Use permanent password"),
|
translate('Use permanent password'),
|
||||||
translate("Use both passwords"),
|
translate('Use both passwords'),
|
||||||
];
|
];
|
||||||
bool tmpEnabled = model.verificationMethod != kUsePermanentPassword;
|
bool tmpEnabled = model.verificationMethod != kUsePermanentPassword;
|
||||||
bool permEnabled = model.verificationMethod != kUseTemporaryPassword;
|
bool permEnabled = model.verificationMethod != kUseTemporaryPassword;
|
||||||
String currentValue = values[keys.indexOf(model.verificationMethod)];
|
String currentValue =
|
||||||
List<Widget> radios = values
|
passwordValues[passwordKeys.indexOf(model.verificationMethod)];
|
||||||
|
List<Widget> radios = passwordValues
|
||||||
.map((value) => _Radio<String>(
|
.map((value) => _Radio<String>(
|
||||||
context,
|
context,
|
||||||
value: value,
|
value: value,
|
||||||
@ -600,8 +602,8 @@ class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin {
|
|||||||
label: value,
|
label: value,
|
||||||
onChanged: ((value) {
|
onChanged: ((value) {
|
||||||
() async {
|
() async {
|
||||||
await model
|
await model.setVerificationMethod(
|
||||||
.setVerificationMethod(keys[values.indexOf(value)]);
|
passwordKeys[passwordValues.indexOf(value)]);
|
||||||
await model.updatePasswordModel();
|
await model.updatePasswordModel();
|
||||||
}();
|
}();
|
||||||
}),
|
}),
|
||||||
@ -639,20 +641,40 @@ class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin {
|
|||||||
))
|
))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
|
final modeKeys = ['password', 'click', ''];
|
||||||
|
final modeValues = [
|
||||||
|
translate('Accept sessions via password'),
|
||||||
|
translate('Accept sessions via click'),
|
||||||
|
translate('Accept sessions via both'),
|
||||||
|
];
|
||||||
|
var modeInitialKey = model.approveMode;
|
||||||
|
if (!modeKeys.contains(modeInitialKey)) modeInitialKey = '';
|
||||||
|
final usePassword = model.approveMode != 'click';
|
||||||
|
|
||||||
return _Card(title: 'Password', children: [
|
return _Card(title: 'Password', children: [
|
||||||
radios[0],
|
_ComboBox(
|
||||||
_SubLabeledWidget(
|
keys: modeKeys,
|
||||||
'Temporary Password Length',
|
values: modeValues,
|
||||||
Row(
|
initialKey: modeInitialKey,
|
||||||
children: [
|
onChanged: (key) => model.setApproveMode(key),
|
||||||
...lengthRadios,
|
).marginOnly(left: _kContentHMargin),
|
||||||
],
|
if (usePassword) radios[0],
|
||||||
),
|
if (usePassword)
|
||||||
enabled: tmpEnabled && !locked),
|
_SubLabeledWidget(
|
||||||
radios[1],
|
'One-time password length',
|
||||||
_SubButton('Set permanent password', setPasswordDialog,
|
Row(
|
||||||
permEnabled && !locked),
|
children: [
|
||||||
radios[2],
|
...lengthRadios,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
enabled: tmpEnabled && !locked),
|
||||||
|
if (usePassword) radios[1],
|
||||||
|
if (usePassword)
|
||||||
|
_SubButton('Set permanent password', setPasswordDialog,
|
||||||
|
permEnabled && !locked),
|
||||||
|
if (usePassword)
|
||||||
|
hide_cm(!locked).marginOnly(left: _kContentHSubMargin - 6),
|
||||||
|
if (usePassword) radios[2],
|
||||||
]);
|
]);
|
||||||
})));
|
})));
|
||||||
}
|
}
|
||||||
@ -781,6 +803,46 @@ class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin {
|
|||||||
).marginOnly(left: _kCheckBoxLeftMargin);
|
).marginOnly(left: _kCheckBoxLeftMargin);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget hide_cm(bool enabled) {
|
||||||
|
return ChangeNotifierProvider.value(
|
||||||
|
value: gFFI.serverModel,
|
||||||
|
child: Consumer<ServerModel>(builder: (context, model, child) {
|
||||||
|
final enableHideCm = model.approveMode == 'password' &&
|
||||||
|
model.verificationMethod == kUsePermanentPassword;
|
||||||
|
onHideCmChanged(bool? b) {
|
||||||
|
if (b != null) {
|
||||||
|
bind.mainSetOption(
|
||||||
|
key: 'allow-hide-cm', value: bool2option('allow-hide-cm', b));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Tooltip(
|
||||||
|
message: enableHideCm ? "" : translate('hide_cm_tip'),
|
||||||
|
child: GestureDetector(
|
||||||
|
onTap:
|
||||||
|
enableHideCm ? () => onHideCmChanged(!model.hideCm) : null,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Checkbox(
|
||||||
|
value: model.hideCm,
|
||||||
|
onChanged: enabled && enableHideCm
|
||||||
|
? onHideCmChanged
|
||||||
|
: null)
|
||||||
|
.marginOnly(right: 5),
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
translate('Hide connection management window'),
|
||||||
|
style: TextStyle(
|
||||||
|
color: _disabledTextColor(
|
||||||
|
context, enabled && enableHideCm)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _Network extends StatefulWidget {
|
class _Network extends StatefulWidget {
|
||||||
@ -830,12 +892,12 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin {
|
|||||||
// Setting page is not modal, oldOptions should only be used when getting options, never when setting.
|
// Setting page is not modal, oldOptions should only be used when getting options, never when setting.
|
||||||
Map<String, dynamic> oldOptions = jsonDecode(data! as String);
|
Map<String, dynamic> oldOptions = jsonDecode(data! as String);
|
||||||
old(String key) {
|
old(String key) {
|
||||||
return (oldOptions[key] ?? "").trim();
|
return (oldOptions[key] ?? '').trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
RxString idErrMsg = "".obs;
|
RxString idErrMsg = ''.obs;
|
||||||
RxString relayErrMsg = "".obs;
|
RxString relayErrMsg = ''.obs;
|
||||||
RxString apiErrMsg = "".obs;
|
RxString apiErrMsg = ''.obs;
|
||||||
var idController =
|
var idController =
|
||||||
TextEditingController(text: old('custom-rendezvous-server'));
|
TextEditingController(text: old('custom-rendezvous-server'));
|
||||||
var relayController = TextEditingController(text: old('relay-server'));
|
var relayController = TextEditingController(text: old('relay-server'));
|
||||||
@ -863,10 +925,10 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (apiServer.isNotEmpty) {
|
if (apiServer.isNotEmpty) {
|
||||||
if (!apiServer.startsWith('http://') ||
|
if (!apiServer.startsWith('http://') &&
|
||||||
!apiServer.startsWith("https://")) {
|
!apiServer.startsWith('https://')) {
|
||||||
apiErrMsg.value =
|
apiErrMsg.value =
|
||||||
"${translate("API Server")}: ${translate("invalid_http")}";
|
'${translate("API Server")}: ${translate("invalid_http")}';
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -893,7 +955,7 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin {
|
|||||||
import() {
|
import() {
|
||||||
Clipboard.getData(Clipboard.kTextPlain).then((value) {
|
Clipboard.getData(Clipboard.kTextPlain).then((value) {
|
||||||
TextEditingController mytext = TextEditingController();
|
TextEditingController mytext = TextEditingController();
|
||||||
String? aNullableString = "";
|
String? aNullableString = '';
|
||||||
aNullableString = value?.text;
|
aNullableString = value?.text;
|
||||||
mytext.text = aNullableString.toString();
|
mytext.text = aNullableString.toString();
|
||||||
if (mytext.text.isNotEmpty) {
|
if (mytext.text.isNotEmpty) {
|
||||||
@ -918,13 +980,13 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
showToast(translate("Invalid server configuration"));
|
showToast(translate('Invalid server configuration'));
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
showToast(translate("Invalid server configuration"));
|
showToast(translate('Invalid server configuration'));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
showToast(translate("Clipboard is empty"));
|
showToast(translate('Clipboard is empty'));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -936,7 +998,7 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin {
|
|||||||
config['ApiServer'] = apiController.text.trim();
|
config['ApiServer'] = apiController.text.trim();
|
||||||
config['Key'] = keyController.text.trim();
|
config['Key'] = keyController.text.trim();
|
||||||
Clipboard.setData(ClipboardData(text: jsonEncode(config)));
|
Clipboard.setData(ClipboardData(text: jsonEncode(config)));
|
||||||
showToast(translate("Export server configuration successfully"));
|
showToast(translate('Export server configuration successfully'));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool secure = !enabled;
|
bool secure = !enabled;
|
||||||
@ -962,7 +1024,7 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin {
|
|||||||
Obx(() => _LabeledTextField(context, 'API Server', apiController,
|
Obx(() => _LabeledTextField(context, 'API Server', apiController,
|
||||||
apiErrMsg.value, enabled, secure)),
|
apiErrMsg.value, enabled, secure)),
|
||||||
_LabeledTextField(
|
_LabeledTextField(
|
||||||
context, 'Key', keyController, "", enabled, secure),
|
context, 'Key', keyController, '', enabled, secure),
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.end,
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
children: [_Button('Apply', submit, enabled: enabled)],
|
children: [_Button('Apply', submit, enabled: enabled)],
|
||||||
@ -1028,10 +1090,12 @@ class _AboutState extends State<_About> {
|
|||||||
return _futureBuilder(future: () async {
|
return _futureBuilder(future: () async {
|
||||||
final license = await bind.mainGetLicense();
|
final license = await bind.mainGetLicense();
|
||||||
final version = await bind.mainGetVersion();
|
final version = await bind.mainGetVersion();
|
||||||
return {'license': license, 'version': version};
|
final buildDate = await bind.mainGetBuildDate();
|
||||||
|
return {'license': license, 'version': version, 'buildDate': buildDate};
|
||||||
}(), hasData: (data) {
|
}(), hasData: (data) {
|
||||||
final license = data['license'].toString();
|
final license = data['license'].toString();
|
||||||
final version = data['version'].toString();
|
final version = data['version'].toString();
|
||||||
|
final buildDate = data['buildDate'].toString();
|
||||||
const linkStyle = TextStyle(decoration: TextDecoration.underline);
|
const linkStyle = TextStyle(decoration: TextDecoration.underline);
|
||||||
final scrollController = ScrollController();
|
final scrollController = ScrollController();
|
||||||
return DesktopScrollWrapper(
|
return DesktopScrollWrapper(
|
||||||
@ -1039,28 +1103,29 @@ class _AboutState extends State<_About> {
|
|||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
controller: scrollController,
|
controller: scrollController,
|
||||||
physics: NeverScrollableScrollPhysics(),
|
physics: NeverScrollableScrollPhysics(),
|
||||||
child: _Card(title: "About RustDesk", children: [
|
child: _Card(title: 'About RustDesk', children: [
|
||||||
Column(
|
Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 8.0,
|
height: 8.0,
|
||||||
),
|
),
|
||||||
Text("Version: $version").marginSymmetric(vertical: 4.0),
|
Text('Version: $version').marginSymmetric(vertical: 4.0),
|
||||||
|
Text('Build Date: $buildDate').marginSymmetric(vertical: 4.0),
|
||||||
InkWell(
|
InkWell(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
launchUrlString("https://rustdesk.com/privacy");
|
launchUrlString('https://rustdesk.com/privacy');
|
||||||
},
|
},
|
||||||
child: const Text(
|
child: const Text(
|
||||||
"Privacy Statement",
|
'Privacy Statement',
|
||||||
style: linkStyle,
|
style: linkStyle,
|
||||||
).marginSymmetric(vertical: 4.0)),
|
).marginSymmetric(vertical: 4.0)),
|
||||||
InkWell(
|
InkWell(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
launchUrlString("https://rustdesk.com");
|
launchUrlString('https://rustdesk.com');
|
||||||
},
|
},
|
||||||
child: const Text(
|
child: const Text(
|
||||||
"Website",
|
'Website',
|
||||||
style: linkStyle,
|
style: linkStyle,
|
||||||
).marginSymmetric(vertical: 4.0)),
|
).marginSymmetric(vertical: 4.0)),
|
||||||
Container(
|
Container(
|
||||||
@ -1074,11 +1139,11 @@ class _AboutState extends State<_About> {
|
|||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
"Copyright © 2022 Purslane Ltd.\n$license",
|
'Copyright © 2022 Purslane Ltd.\n$license',
|
||||||
style: const TextStyle(color: Colors.white),
|
style: const TextStyle(color: Colors.white),
|
||||||
),
|
),
|
||||||
const Text(
|
const Text(
|
||||||
"Made with heart in this chaotic world!",
|
'Made with heart in this chaotic world!',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontWeight: FontWeight.w800,
|
fontWeight: FontWeight.w800,
|
||||||
color: Colors.white),
|
color: Colors.white),
|
||||||
@ -1472,10 +1537,10 @@ class _ComboBox extends StatelessWidget {
|
|||||||
void changeSocks5Proxy() async {
|
void changeSocks5Proxy() async {
|
||||||
var socks = await bind.mainGetSocks();
|
var socks = await bind.mainGetSocks();
|
||||||
|
|
||||||
String proxy = "";
|
String proxy = '';
|
||||||
String proxyMsg = "";
|
String proxyMsg = '';
|
||||||
String username = "";
|
String username = '';
|
||||||
String password = "";
|
String password = '';
|
||||||
if (socks.length == 3) {
|
if (socks.length == 3) {
|
||||||
proxy = socks[0];
|
proxy = socks[0];
|
||||||
username = socks[1];
|
username = socks[1];
|
||||||
@ -1489,7 +1554,7 @@ void changeSocks5Proxy() async {
|
|||||||
gFFI.dialogManager.show((setState, close) {
|
gFFI.dialogManager.show((setState, close) {
|
||||||
submit() async {
|
submit() async {
|
||||||
setState(() {
|
setState(() {
|
||||||
proxyMsg = "";
|
proxyMsg = '';
|
||||||
isInProgress = true;
|
isInProgress = true;
|
||||||
});
|
});
|
||||||
cancel() {
|
cancel() {
|
||||||
@ -1517,7 +1582,7 @@ void changeSocks5Proxy() async {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return CustomAlertDialog(
|
return CustomAlertDialog(
|
||||||
title: Text(translate("Socks5 Proxy")),
|
title: Text(translate('Socks5 Proxy')),
|
||||||
content: ConstrainedBox(
|
content: ConstrainedBox(
|
||||||
constraints: const BoxConstraints(minWidth: 500),
|
constraints: const BoxConstraints(minWidth: 500),
|
||||||
child: Column(
|
child: Column(
|
||||||
@ -1530,7 +1595,7 @@ void changeSocks5Proxy() async {
|
|||||||
children: [
|
children: [
|
||||||
ConstrainedBox(
|
ConstrainedBox(
|
||||||
constraints: const BoxConstraints(minWidth: 100),
|
constraints: const BoxConstraints(minWidth: 100),
|
||||||
child: Text("${translate('Hostname')}:")
|
child: Text('${translate("Hostname")}:')
|
||||||
.marginOnly(bottom: 16.0)),
|
.marginOnly(bottom: 16.0)),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
width: 24.0,
|
width: 24.0,
|
||||||
@ -1553,7 +1618,7 @@ void changeSocks5Proxy() async {
|
|||||||
children: [
|
children: [
|
||||||
ConstrainedBox(
|
ConstrainedBox(
|
||||||
constraints: const BoxConstraints(minWidth: 100),
|
constraints: const BoxConstraints(minWidth: 100),
|
||||||
child: Text("${translate('Username')}:")
|
child: Text('${translate("Username")}:')
|
||||||
.marginOnly(bottom: 16.0)),
|
.marginOnly(bottom: 16.0)),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
width: 24.0,
|
width: 24.0,
|
||||||
@ -1575,7 +1640,7 @@ void changeSocks5Proxy() async {
|
|||||||
children: [
|
children: [
|
||||||
ConstrainedBox(
|
ConstrainedBox(
|
||||||
constraints: const BoxConstraints(minWidth: 100),
|
constraints: const BoxConstraints(minWidth: 100),
|
||||||
child: Text("${translate('Password')}:")
|
child: Text('${translate("Password")}:')
|
||||||
.marginOnly(bottom: 16.0)),
|
.marginOnly(bottom: 16.0)),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
width: 24.0,
|
width: 24.0,
|
||||||
@ -1599,8 +1664,8 @@ void changeSocks5Proxy() async {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
actions: [
|
actions: [
|
||||||
TextButton(onPressed: close, child: Text(translate("Cancel"))),
|
TextButton(onPressed: close, child: Text(translate('Cancel'))),
|
||||||
TextButton(onPressed: submit, child: Text(translate("OK"))),
|
TextButton(onPressed: submit, child: Text(translate('OK'))),
|
||||||
],
|
],
|
||||||
onSubmit: submit,
|
onSubmit: submit,
|
||||||
onCancel: close,
|
onCancel: close,
|
||||||
|
|||||||
@ -83,6 +83,7 @@ class _FileManagerTabPageState extends State<FileManagerTabPage> {
|
|||||||
controller: tabController,
|
controller: tabController,
|
||||||
onWindowCloseButton: handleWindowCloseButton,
|
onWindowCloseButton: handleWindowCloseButton,
|
||||||
tail: const AddButton().paddingOnly(left: 10),
|
tail: const AddButton().paddingOnly(left: 10),
|
||||||
|
labelGetter: DesktopTab.labelGetterAlias,
|
||||||
)),
|
)),
|
||||||
);
|
);
|
||||||
return Platform.isMacOS
|
return Platform.isMacOS
|
||||||
|
|||||||
@ -94,6 +94,7 @@ class _PortForwardTabPageState extends State<PortForwardTabPage> {
|
|||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
tail: AddButton().paddingOnly(left: 10),
|
tail: AddButton().paddingOnly(left: 10),
|
||||||
|
labelGetter: DesktopTab.labelGetterAlias,
|
||||||
)),
|
)),
|
||||||
);
|
);
|
||||||
return Platform.isMacOS
|
return Platform.isMacOS
|
||||||
|
|||||||
@ -28,14 +28,14 @@ class RemotePage extends StatefulWidget {
|
|||||||
RemotePage({
|
RemotePage({
|
||||||
Key? key,
|
Key? key,
|
||||||
required this.id,
|
required this.id,
|
||||||
|
required this.menubarState,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
final String id;
|
final String id;
|
||||||
|
final MenubarState menubarState;
|
||||||
final SimpleWrapper<State<RemotePage>?> _lastState = SimpleWrapper(null);
|
final SimpleWrapper<State<RemotePage>?> _lastState = SimpleWrapper(null);
|
||||||
|
|
||||||
FFI get ffi => (_lastState.value! as _RemotePageState)._ffi;
|
FFI get ffi => (_lastState.value! as _RemotePageState)._ffi;
|
||||||
RxBool get showMenubar =>
|
|
||||||
(_lastState.value! as _RemotePageState)._showMenubar;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<RemotePage> createState() {
|
State<RemotePage> createState() {
|
||||||
@ -50,8 +50,8 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
Timer? _timer;
|
Timer? _timer;
|
||||||
String keyboardMode = "legacy";
|
String keyboardMode = "legacy";
|
||||||
final _cursorOverImage = false.obs;
|
final _cursorOverImage = false.obs;
|
||||||
final _showMenubar = false.obs;
|
|
||||||
late RxBool _showRemoteCursor;
|
late RxBool _showRemoteCursor;
|
||||||
|
late RxBool _zoomCursor;
|
||||||
late RxBool _remoteCursorMoved;
|
late RxBool _remoteCursorMoved;
|
||||||
late RxBool _keyboardEnabled;
|
late RxBool _keyboardEnabled;
|
||||||
|
|
||||||
@ -69,6 +69,9 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
KeyboardEnabledState.init(id);
|
KeyboardEnabledState.init(id);
|
||||||
ShowRemoteCursorState.init(id);
|
ShowRemoteCursorState.init(id);
|
||||||
RemoteCursorMovedState.init(id);
|
RemoteCursorMovedState.init(id);
|
||||||
|
final optZoomCursor = 'zoom-cursor';
|
||||||
|
PeerBoolOption.init(id, optZoomCursor, () => false);
|
||||||
|
_zoomCursor = PeerBoolOption.find(id, optZoomCursor);
|
||||||
_showRemoteCursor = ShowRemoteCursorState.find(id);
|
_showRemoteCursor = ShowRemoteCursorState.find(id);
|
||||||
_keyboardEnabled = KeyboardEnabledState.find(id);
|
_keyboardEnabled = KeyboardEnabledState.find(id);
|
||||||
_remoteCursorMoved = RemoteCursorMovedState.find(id);
|
_remoteCursorMoved = RemoteCursorMovedState.find(id);
|
||||||
@ -87,9 +90,7 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
_initStates(widget.id);
|
_initStates(widget.id);
|
||||||
|
|
||||||
_ffi = FFI();
|
_ffi = FFI();
|
||||||
|
|
||||||
Get.put(_ffi, tag: widget.id);
|
Get.put(_ffi, tag: widget.id);
|
||||||
_ffi.start(widget.id);
|
_ffi.start(widget.id);
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
@ -103,8 +104,11 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
_rawKeyFocusNode.requestFocus();
|
_rawKeyFocusNode.requestFocus();
|
||||||
_ffi.ffiModel.updateEventListener(widget.id);
|
_ffi.ffiModel.updateEventListener(widget.id);
|
||||||
_ffi.qualityMonitorModel.checkShowQualityMonitor(widget.id);
|
_ffi.qualityMonitorModel.checkShowQualityMonitor(widget.id);
|
||||||
|
// Session option should be set after models.dart/FFI.start
|
||||||
_showRemoteCursor.value = bind.sessionGetToggleOptionSync(
|
_showRemoteCursor.value = bind.sessionGetToggleOptionSync(
|
||||||
id: widget.id, arg: 'show-remote-cursor');
|
id: widget.id, arg: 'show-remote-cursor');
|
||||||
|
_zoomCursor.value =
|
||||||
|
bind.sessionGetToggleOptionSync(id: widget.id, arg: 'zoom-cursor');
|
||||||
if (!_isCustomCursorInited) {
|
if (!_isCustomCursorInited) {
|
||||||
customCursorController.registerNeedUpdateCursorCallback(
|
customCursorController.registerNeedUpdateCursorCallback(
|
||||||
(String? lastKey, String? currentKey) async {
|
(String? lastKey, String? currentKey) async {
|
||||||
@ -164,7 +168,7 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
super.build(context);
|
super.build(context);
|
||||||
return WillPopScope(
|
return WillPopScope(
|
||||||
onWillPop: () async {
|
onWillPop: () async {
|
||||||
clientClose(_ffi.dialogManager);
|
clientClose(widget.id, _ffi.dialogManager);
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
child: MultiProvider(providers: [
|
child: MultiProvider(providers: [
|
||||||
@ -217,6 +221,7 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
});
|
});
|
||||||
return ImagePaint(
|
return ImagePaint(
|
||||||
id: widget.id,
|
id: widget.id,
|
||||||
|
zoomCursor: _zoomCursor,
|
||||||
cursorOverImage: _cursorOverImage,
|
cursorOverImage: _cursorOverImage,
|
||||||
keyboardEnabled: _keyboardEnabled,
|
keyboardEnabled: _keyboardEnabled,
|
||||||
remoteCursorMoved: _remoteCursorMoved,
|
remoteCursorMoved: _remoteCursorMoved,
|
||||||
@ -234,12 +239,13 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
visible: _showRemoteCursor.isTrue && _remoteCursorMoved.isTrue,
|
visible: _showRemoteCursor.isTrue && _remoteCursorMoved.isTrue,
|
||||||
child: CursorPaint(
|
child: CursorPaint(
|
||||||
id: widget.id,
|
id: widget.id,
|
||||||
|
zoomCursor: _zoomCursor,
|
||||||
))));
|
))));
|
||||||
paints.add(QualityMonitor(_ffi.qualityMonitorModel));
|
paints.add(QualityMonitor(_ffi.qualityMonitorModel));
|
||||||
paints.add(RemoteMenubar(
|
paints.add(RemoteMenubar(
|
||||||
id: widget.id,
|
id: widget.id,
|
||||||
ffi: _ffi,
|
ffi: _ffi,
|
||||||
show: _showMenubar,
|
state: widget.menubarState,
|
||||||
onEnterOrLeaveImageSetter: (func) => _onEnterOrLeaveImage4Menubar = func,
|
onEnterOrLeaveImageSetter: (func) => _onEnterOrLeaveImage4Menubar = func,
|
||||||
onEnterOrLeaveImageCleaner: () => _onEnterOrLeaveImage4Menubar = null,
|
onEnterOrLeaveImageCleaner: () => _onEnterOrLeaveImage4Menubar = null,
|
||||||
));
|
));
|
||||||
@ -252,24 +258,40 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
bool get wantKeepAlive => true;
|
bool get wantKeepAlive => true;
|
||||||
}
|
}
|
||||||
|
|
||||||
class ImagePaint extends StatelessWidget {
|
class ImagePaint extends StatefulWidget {
|
||||||
final String id;
|
final String id;
|
||||||
|
final Rx<bool> zoomCursor;
|
||||||
final Rx<bool> cursorOverImage;
|
final Rx<bool> cursorOverImage;
|
||||||
final Rx<bool> keyboardEnabled;
|
final Rx<bool> keyboardEnabled;
|
||||||
final Rx<bool> remoteCursorMoved;
|
final Rx<bool> remoteCursorMoved;
|
||||||
final Widget Function(Widget)? listenerBuilder;
|
final Widget Function(Widget)? listenerBuilder;
|
||||||
final ScrollController _horizontal = ScrollController();
|
|
||||||
final ScrollController _vertical = ScrollController();
|
|
||||||
|
|
||||||
ImagePaint(
|
ImagePaint(
|
||||||
{Key? key,
|
{Key? key,
|
||||||
required this.id,
|
required this.id,
|
||||||
|
required this.zoomCursor,
|
||||||
required this.cursorOverImage,
|
required this.cursorOverImage,
|
||||||
required this.keyboardEnabled,
|
required this.keyboardEnabled,
|
||||||
required this.remoteCursorMoved,
|
required this.remoteCursorMoved,
|
||||||
this.listenerBuilder})
|
this.listenerBuilder})
|
||||||
: super(key: key);
|
: super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<StatefulWidget> createState() => _ImagePaintState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ImagePaintState extends State<ImagePaint> {
|
||||||
|
bool _lastRemoteCursorMoved = false;
|
||||||
|
final ScrollController _horizontal = ScrollController();
|
||||||
|
final ScrollController _vertical = ScrollController();
|
||||||
|
|
||||||
|
String get id => widget.id;
|
||||||
|
Rx<bool> get zoomCursor => widget.zoomCursor;
|
||||||
|
Rx<bool> get cursorOverImage => widget.cursorOverImage;
|
||||||
|
Rx<bool> get keyboardEnabled => widget.keyboardEnabled;
|
||||||
|
Rx<bool> get remoteCursorMoved => widget.remoteCursorMoved;
|
||||||
|
Widget Function(Widget)? get listenerBuilder => widget.listenerBuilder;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final m = Provider.of<ImageModel>(context);
|
final m = Provider.of<ImageModel>(context);
|
||||||
@ -279,9 +301,18 @@ class ImagePaint extends StatelessWidget {
|
|||||||
mouseRegion({child}) => Obx(() => MouseRegion(
|
mouseRegion({child}) => Obx(() => MouseRegion(
|
||||||
cursor: cursorOverImage.isTrue
|
cursor: cursorOverImage.isTrue
|
||||||
? keyboardEnabled.isTrue
|
? keyboardEnabled.isTrue
|
||||||
? (remoteCursorMoved.isTrue
|
? (() {
|
||||||
? SystemMouseCursors.none
|
if (remoteCursorMoved.isTrue) {
|
||||||
: _buildCustomCursor(context, s))
|
_lastRemoteCursorMoved = true;
|
||||||
|
return SystemMouseCursors.none;
|
||||||
|
} else {
|
||||||
|
if (_lastRemoteCursorMoved) {
|
||||||
|
_lastRemoteCursorMoved = false;
|
||||||
|
_firstEnterImage.value = true;
|
||||||
|
}
|
||||||
|
return _buildCustomCursor(context, s);
|
||||||
|
}
|
||||||
|
}())
|
||||||
: _buildDisabledCursor(context, s)
|
: _buildDisabledCursor(context, s)
|
||||||
: MouseCursor.defer,
|
: MouseCursor.defer,
|
||||||
onHover: (evt) {},
|
onHover: (evt) {},
|
||||||
@ -290,12 +321,10 @@ class ImagePaint extends StatelessWidget {
|
|||||||
if (c.scrollStyle == ScrollStyle.scrollbar) {
|
if (c.scrollStyle == ScrollStyle.scrollbar) {
|
||||||
final imageWidth = c.getDisplayWidth() * s;
|
final imageWidth = c.getDisplayWidth() * s;
|
||||||
final imageHeight = c.getDisplayHeight() * s;
|
final imageHeight = c.getDisplayHeight() * s;
|
||||||
final imageWidget = SizedBox(
|
final imageWidget = CustomPaint(
|
||||||
width: imageWidth,
|
size: Size(imageWidth, imageHeight),
|
||||||
height: imageHeight,
|
painter: ImagePainter(image: m.image, x: 0, y: 0, scale: s),
|
||||||
child: CustomPaint(
|
);
|
||||||
painter: ImagePainter(image: m.image, x: 0, y: 0, scale: s),
|
|
||||||
));
|
|
||||||
|
|
||||||
return NotificationListener<ScrollNotification>(
|
return NotificationListener<ScrollNotification>(
|
||||||
onNotification: (notification) {
|
onNotification: (notification) {
|
||||||
@ -319,58 +348,42 @@ class ImagePaint extends StatelessWidget {
|
|||||||
Size(imageWidth, imageHeight))),
|
Size(imageWidth, imageHeight))),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
final imageWidget = SizedBox(
|
final imageWidget = CustomPaint(
|
||||||
width: c.size.width,
|
size: Size(c.size.width, c.size.height),
|
||||||
height: c.size.height,
|
painter: ImagePainter(image: m.image, x: c.x / s, y: c.y / s, scale: s),
|
||||||
child: CustomPaint(
|
);
|
||||||
painter:
|
|
||||||
ImagePainter(image: m.image, x: c.x / s, y: c.y / s, scale: s),
|
|
||||||
));
|
|
||||||
return mouseRegion(child: _buildListener(imageWidget));
|
return mouseRegion(child: _buildListener(imageWidget));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseCursor _buildCustomCursor(BuildContext context, double scale) {
|
MouseCursor _buildCursorOfCache(
|
||||||
final cursor = Provider.of<CursorModel>(context);
|
CursorModel cursor, double scale, CursorData? cache) {
|
||||||
final cache = cursor.cache ?? cursor.defaultCache;
|
|
||||||
if (cache == null) {
|
if (cache == null) {
|
||||||
return MouseCursor.defer;
|
return MouseCursor.defer;
|
||||||
} else {
|
} else {
|
||||||
final key = cache.updateGetKey(scale);
|
final key = cache.updateGetKey(scale, zoomCursor.value);
|
||||||
cursor.addKey(key);
|
cursor.addKey(key);
|
||||||
return FlutterCustomMemoryImageCursor(
|
return FlutterCustomMemoryImageCursor(
|
||||||
pixbuf: cache.data,
|
pixbuf: cache.data,
|
||||||
key: key,
|
key: key,
|
||||||
// hotx: cache.hotx,
|
hotx: cache.hotx,
|
||||||
// hoty: cache.hoty,
|
hoty: cache.hoty,
|
||||||
hotx: 0,
|
|
||||||
hoty: 0,
|
|
||||||
imageWidth: (cache.width * cache.scale).toInt(),
|
imageWidth: (cache.width * cache.scale).toInt(),
|
||||||
imageHeight: (cache.height * cache.scale).toInt(),
|
imageHeight: (cache.height * cache.scale).toInt(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MouseCursor _buildCustomCursor(BuildContext context, double scale) {
|
||||||
|
final cursor = Provider.of<CursorModel>(context);
|
||||||
|
final cache = cursor.cache ?? preDefaultCursor.cache;
|
||||||
|
return _buildCursorOfCache(cursor, scale, cache);
|
||||||
|
}
|
||||||
|
|
||||||
MouseCursor _buildDisabledCursor(BuildContext context, double scale) {
|
MouseCursor _buildDisabledCursor(BuildContext context, double scale) {
|
||||||
final cursor = Provider.of<CursorModel>(context);
|
final cursor = Provider.of<CursorModel>(context);
|
||||||
final cache = cursor.cache;
|
final cache = preForbiddenCursor.cache;
|
||||||
if (cache == null) {
|
return _buildCursorOfCache(cursor, scale, cache);
|
||||||
return MouseCursor.defer;
|
|
||||||
} else {
|
|
||||||
if (cursor.cachedForbidmemoryCursorData == null) {
|
|
||||||
cursor.updateForbiddenCursorBuffer();
|
|
||||||
}
|
|
||||||
final key = 'disabled_cursor_key';
|
|
||||||
cursor.addKey(key);
|
|
||||||
return FlutterCustomMemoryImageCursor(
|
|
||||||
pixbuf: cursor.cachedForbidmemoryCursorData,
|
|
||||||
key: key,
|
|
||||||
hotx: 0,
|
|
||||||
hoty: 0,
|
|
||||||
imageWidth: 32,
|
|
||||||
imageHeight: 32,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildCrossScrollbarFromLayout(
|
Widget _buildCrossScrollbarFromLayout(
|
||||||
@ -481,21 +494,42 @@ class ImagePaint extends StatelessWidget {
|
|||||||
|
|
||||||
class CursorPaint extends StatelessWidget {
|
class CursorPaint extends StatelessWidget {
|
||||||
final String id;
|
final String id;
|
||||||
|
final RxBool zoomCursor;
|
||||||
|
|
||||||
const CursorPaint({Key? key, required this.id}) : super(key: key);
|
const CursorPaint({
|
||||||
|
Key? key,
|
||||||
|
required this.id,
|
||||||
|
required this.zoomCursor,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final m = Provider.of<CursorModel>(context);
|
final m = Provider.of<CursorModel>(context);
|
||||||
final c = Provider.of<CanvasModel>(context);
|
final c = Provider.of<CanvasModel>(context);
|
||||||
// final adjust = m.adjustForKeyboard();
|
// final adjust = m.adjustForKeyboard();
|
||||||
return CustomPaint(
|
double hotx = m.hotx;
|
||||||
painter: ImagePainter(
|
double hoty = m.hoty;
|
||||||
image: m.image,
|
if (m.image == null) {
|
||||||
x: m.x - m.hotx + c.x / c.scale,
|
if (preDefaultCursor.image != null) {
|
||||||
y: m.y - m.hoty + c.y / c.scale,
|
hotx = preDefaultCursor.image!.width / 2;
|
||||||
scale: c.scale),
|
hoty = preDefaultCursor.image!.height / 2;
|
||||||
);
|
}
|
||||||
|
}
|
||||||
|
return zoomCursor.isTrue
|
||||||
|
? CustomPaint(
|
||||||
|
painter: ImagePainter(
|
||||||
|
image: m.image ?? preDefaultCursor.image,
|
||||||
|
x: m.x - hotx + c.x / c.scale,
|
||||||
|
y: m.y - hoty + c.y / c.scale,
|
||||||
|
scale: c.scale),
|
||||||
|
)
|
||||||
|
: CustomPaint(
|
||||||
|
painter: ImagePainter(
|
||||||
|
image: m.image ?? preDefaultCursor.image,
|
||||||
|
x: (m.x - hotx) * c.scale + c.x,
|
||||||
|
y: (m.y - hoty) * c.scale + c.y,
|
||||||
|
scale: 1.0),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -520,9 +554,11 @@ class ImagePainter extends CustomPainter {
|
|||||||
// https://github.com/flutter/flutter/issues/76187#issuecomment-784628161
|
// https://github.com/flutter/flutter/issues/76187#issuecomment-784628161
|
||||||
// https://api.flutter-io.cn/flutter/dart-ui/FilterQuality.html
|
// https://api.flutter-io.cn/flutter/dart-ui/FilterQuality.html
|
||||||
var paint = Paint();
|
var paint = Paint();
|
||||||
paint.filterQuality = FilterQuality.medium;
|
if ((scale - 1.0).abs() > 0.001) {
|
||||||
if (scale > 10.00000) {
|
paint.filterQuality = FilterQuality.medium;
|
||||||
paint.filterQuality = FilterQuality.high;
|
if (scale > 10.00000) {
|
||||||
|
paint.filterQuality = FilterQuality.high;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
canvas.drawImage(image!, Offset(x, y), paint);
|
canvas.drawImage(image!, Offset(x, y), paint);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import 'package:flutter_hbb/common/shared_state.dart';
|
|||||||
import 'package:flutter_hbb/consts.dart';
|
import 'package:flutter_hbb/consts.dart';
|
||||||
import 'package:flutter_hbb/models/state_model.dart';
|
import 'package:flutter_hbb/models/state_model.dart';
|
||||||
import 'package:flutter_hbb/desktop/pages/remote_page.dart';
|
import 'package:flutter_hbb/desktop/pages/remote_page.dart';
|
||||||
|
import 'package:flutter_hbb/desktop/widgets/remote_menubar.dart';
|
||||||
import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart';
|
import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart';
|
||||||
import 'package:flutter_hbb/desktop/widgets/material_mod_popup_menu.dart'
|
import 'package:flutter_hbb/desktop/widgets/material_mod_popup_menu.dart'
|
||||||
as mod_menu;
|
as mod_menu;
|
||||||
@ -43,9 +44,12 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
static const IconData selectedIcon = Icons.desktop_windows_sharp;
|
static const IconData selectedIcon = Icons.desktop_windows_sharp;
|
||||||
static const IconData unselectedIcon = Icons.desktop_windows_outlined;
|
static const IconData unselectedIcon = Icons.desktop_windows_outlined;
|
||||||
|
|
||||||
|
late MenubarState _menubarState;
|
||||||
|
|
||||||
var connectionMap = RxList<Widget>.empty(growable: true);
|
var connectionMap = RxList<Widget>.empty(growable: true);
|
||||||
|
|
||||||
_ConnectionTabPageState(Map<String, dynamic> params) {
|
_ConnectionTabPageState(Map<String, dynamic> params) {
|
||||||
|
_menubarState = MenubarState();
|
||||||
RemoteCountState.init();
|
RemoteCountState.init();
|
||||||
final peerId = params['id'];
|
final peerId = params['id'];
|
||||||
if (peerId != null) {
|
if (peerId != null) {
|
||||||
@ -59,6 +63,7 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
page: RemotePage(
|
page: RemotePage(
|
||||||
key: ValueKey(peerId),
|
key: ValueKey(peerId),
|
||||||
id: peerId,
|
id: peerId,
|
||||||
|
menubarState: _menubarState,
|
||||||
),
|
),
|
||||||
));
|
));
|
||||||
_update_remote_count();
|
_update_remote_count();
|
||||||
@ -79,7 +84,6 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
if (call.method == "new_remote_desktop") {
|
if (call.method == "new_remote_desktop") {
|
||||||
final args = jsonDecode(call.arguments);
|
final args = jsonDecode(call.arguments);
|
||||||
final id = args['id'];
|
final id = args['id'];
|
||||||
ConnectionTypeState.init(id);
|
|
||||||
window_on_top(windowId());
|
window_on_top(windowId());
|
||||||
ConnectionTypeState.init(id);
|
ConnectionTypeState.init(id);
|
||||||
tabController.add(TabInfo(
|
tabController.add(TabInfo(
|
||||||
@ -88,7 +92,11 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
selectedIcon: selectedIcon,
|
selectedIcon: selectedIcon,
|
||||||
unselectedIcon: unselectedIcon,
|
unselectedIcon: unselectedIcon,
|
||||||
onTabCloseButton: () => tabController.closeBy(id),
|
onTabCloseButton: () => tabController.closeBy(id),
|
||||||
page: RemotePage(key: ValueKey(id), id: id),
|
page: RemotePage(
|
||||||
|
key: ValueKey(id),
|
||||||
|
id: id,
|
||||||
|
menubarState: _menubarState,
|
||||||
|
),
|
||||||
));
|
));
|
||||||
} else if (call.method == "onDestroy") {
|
} else if (call.method == "onDestroy") {
|
||||||
tabController.clear();
|
tabController.clear();
|
||||||
@ -99,20 +107,29 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
super.dispose();
|
||||||
|
_menubarState.save();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final tabWidget = Container(
|
final tabWidget = Obx(
|
||||||
decoration: BoxDecoration(
|
() => Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
border: Border.all(
|
border: Border.all(
|
||||||
color: MyTheme.color(context).border!,
|
color: MyTheme.color(context).border!,
|
||||||
width: kWindowBorderWidth)),
|
width: stateGlobal.windowBorderWidth.value),
|
||||||
child: Scaffold(
|
),
|
||||||
|
child: Scaffold(
|
||||||
backgroundColor: Theme.of(context).backgroundColor,
|
backgroundColor: Theme.of(context).backgroundColor,
|
||||||
body: DesktopTab(
|
body: DesktopTab(
|
||||||
controller: tabController,
|
controller: tabController,
|
||||||
onWindowCloseButton: handleWindowCloseButton,
|
onWindowCloseButton: handleWindowCloseButton,
|
||||||
tail: const AddButton().paddingOnly(left: 10),
|
tail: const AddButton().paddingOnly(left: 10),
|
||||||
pageViewBuilder: (pageView) => pageView,
|
pageViewBuilder: (pageView) => pageView,
|
||||||
|
labelGetter: DesktopTab.labelGetterAlias,
|
||||||
tabBuilder: (key, icon, label, themeConf) => Obx(() {
|
tabBuilder: (key, icon, label, themeConf) => Obx(() {
|
||||||
final connectionType = ConnectionTypeState.find(key);
|
final connectionType = ConnectionTypeState.find(key);
|
||||||
if (!connectionType.isValid()) {
|
if (!connectionType.isValid()) {
|
||||||
@ -166,7 +183,9 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
)),
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
return Platform.isMacOS
|
return Platform.isMacOS
|
||||||
? tabWidget
|
? tabWidget
|
||||||
@ -177,7 +196,7 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// to-do: some dup code to ../widgets/remote_menubar
|
// Note: Some dup code to ../widgets/remote_menubar
|
||||||
Widget _tabMenuBuilder(String key, CancelFunc cancelFunc) {
|
Widget _tabMenuBuilder(String key, CancelFunc cancelFunc) {
|
||||||
final List<MenuEntryBase<String>> menu = [];
|
final List<MenuEntryBase<String>> menu = [];
|
||||||
const EdgeInsets padding = EdgeInsets.only(left: 8.0, right: 5.0);
|
const EdgeInsets padding = EdgeInsets.only(left: 8.0, right: 5.0);
|
||||||
@ -187,7 +206,6 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
final ffi = remotePage.ffi;
|
final ffi = remotePage.ffi;
|
||||||
final pi = ffi.ffiModel.pi;
|
final pi = ffi.ffiModel.pi;
|
||||||
final perms = ffi.ffiModel.permissions;
|
final perms = ffi.ffiModel.permissions;
|
||||||
final showMenuBar = remotePage.showMenubar;
|
|
||||||
menu.addAll([
|
menu.addAll([
|
||||||
MenuEntryButton<String>(
|
MenuEntryButton<String>(
|
||||||
childBuilder: (TextStyle? style) => Text(
|
childBuilder: (TextStyle? style) => Text(
|
||||||
@ -202,11 +220,12 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
),
|
),
|
||||||
MenuEntryButton<String>(
|
MenuEntryButton<String>(
|
||||||
childBuilder: (TextStyle? style) => Obx(() => Text(
|
childBuilder: (TextStyle? style) => Obx(() => Text(
|
||||||
translate(showMenuBar.isTrue ? 'Hide Menubar' : 'Show Menubar'),
|
translate(
|
||||||
|
_menubarState.show.isTrue ? 'Hide Menubar' : 'Show Menubar'),
|
||||||
style: style,
|
style: style,
|
||||||
)),
|
)),
|
||||||
proc: () {
|
proc: () {
|
||||||
showMenuBar.value = !showMenuBar.value;
|
_menubarState.switchShow();
|
||||||
cancelFunc();
|
cancelFunc();
|
||||||
},
|
},
|
||||||
padding: padding,
|
padding: padding,
|
||||||
@ -226,13 +245,12 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
dismissOnClicked: true,
|
dismissOnClicked: true,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
curOptionGetter: () async {
|
curOptionGetter: () async =>
|
||||||
return await bind.sessionGetOption(id: key, arg: 'view-style') ??
|
// null means peer id is not found, which there's no need to care about
|
||||||
'adaptive';
|
await bind.sessionGetViewStyle(id: key) ?? '',
|
||||||
},
|
|
||||||
optionSetter: (String oldValue, String newValue) async {
|
optionSetter: (String oldValue, String newValue) async {
|
||||||
await bind.sessionPeerOption(
|
await bind.sessionSetViewStyle(
|
||||||
id: key, name: "view-style", value: newValue);
|
id: key, value: newValue);
|
||||||
ffi.canvasModel.updateViewStyle();
|
ffi.canvasModel.updateViewStyle();
|
||||||
cancelFunc();
|
cancelFunc();
|
||||||
},
|
},
|
||||||
|
|||||||
@ -76,7 +76,6 @@ class _DesktopServerPageState extends State<DesktopServerPage>
|
|||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Expanded(child: ConnectionManager()),
|
Expanded(child: ConnectionManager()),
|
||||||
SizedBox.fromSize(size: Size(0, 15.0)),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -108,13 +107,14 @@ class ConnectionManagerState extends State<ConnectionManager> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final serverModel = Provider.of<ServerModel>(context);
|
final serverModel = Provider.of<ServerModel>(context);
|
||||||
final pointerHandler = serverModel.cmHiddenTimer != null
|
pointerHandler(PointerEvent e) {
|
||||||
? (PointerEvent e) {
|
if (serverModel.cmHiddenTimer != null) {
|
||||||
serverModel.cmHiddenTimer!.cancel();
|
serverModel.cmHiddenTimer!.cancel();
|
||||||
serverModel.cmHiddenTimer = null;
|
serverModel.cmHiddenTimer = null;
|
||||||
debugPrint("CM hidden timer has been canceled");
|
debugPrint("CM hidden timer has been canceled");
|
||||||
}
|
}
|
||||||
: null;
|
}
|
||||||
|
|
||||||
return serverModel.clients.isEmpty
|
return serverModel.clients.isEmpty
|
||||||
? Column(
|
? Column(
|
||||||
children: [
|
children: [
|
||||||
@ -305,7 +305,9 @@ class _CmHeaderState extends State<_CmHeader>
|
|||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
_timer = Timer.periodic(Duration(seconds: 1), (_) {
|
_timer = Timer.periodic(Duration(seconds: 1), (_) {
|
||||||
if (!client.disconnected) _time.value = _time.value + 1;
|
if (client.authorized && !client.disconnected) {
|
||||||
|
_time.value = _time.value + 1;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -359,12 +361,15 @@ class _CmHeaderState extends State<_CmHeader>
|
|||||||
FittedBox(
|
FittedBox(
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Text(client.disconnected
|
Text(client.authorized
|
||||||
? translate("Disconnected")
|
? client.disconnected
|
||||||
: translate("Connected"))
|
? translate("Disconnected")
|
||||||
|
: translate("Connected")
|
||||||
|
: "${translate("Request access to your device")}...")
|
||||||
.marginOnly(right: 8.0),
|
.marginOnly(right: 8.0),
|
||||||
Obx(() => Text(
|
if (client.authorized)
|
||||||
formatDurationToTime(Duration(seconds: _time.value))))
|
Obx(() => Text(
|
||||||
|
formatDurationToTime(Duration(seconds: _time.value))))
|
||||||
],
|
],
|
||||||
))
|
))
|
||||||
],
|
],
|
||||||
@ -486,6 +491,8 @@ class _PrivilegeBoardState extends State<_PrivilegeBoard> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const double bigMargin = 15;
|
||||||
|
|
||||||
class _CmControlPanel extends StatelessWidget {
|
class _CmControlPanel extends StatelessWidget {
|
||||||
final Client client;
|
final Client client;
|
||||||
|
|
||||||
@ -501,108 +508,148 @@ class _CmControlPanel extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
buildAuthorized(BuildContext context) {
|
buildAuthorized(BuildContext context) {
|
||||||
return Row(
|
final bool canElevate = bind.cmCanElevate();
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
final model = Provider.of<ServerModel>(context);
|
||||||
|
final showElevation = canElevate && model.showElevation;
|
||||||
|
return Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
children: [
|
children: [
|
||||||
Ink(
|
Offstage(
|
||||||
width: 200,
|
offstage: !showElevation,
|
||||||
height: 40,
|
child: buildButton(context, color: Colors.green[700], onClick: () {
|
||||||
decoration: BoxDecoration(
|
handleElevate(context);
|
||||||
color: Colors.redAccent, borderRadius: BorderRadius.circular(10)),
|
windowManager.minimize();
|
||||||
child: InkWell(
|
},
|
||||||
onTap: () =>
|
icon: Icon(
|
||||||
checkClickTime(client.id, () => handleDisconnect(context)),
|
Icons.security_sharp,
|
||||||
child: Row(
|
color: Colors.white,
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
),
|
||||||
children: [
|
text: 'Elevate',
|
||||||
Text(
|
textColor: Colors.white),
|
||||||
translate("Disconnect"),
|
),
|
||||||
style: TextStyle(color: Colors.white),
|
Row(
|
||||||
),
|
children: [
|
||||||
],
|
Expanded(
|
||||||
)),
|
child: buildButton(context,
|
||||||
|
color: Colors.redAccent,
|
||||||
|
onClick: handleDisconnect,
|
||||||
|
text: 'Disconnect',
|
||||||
|
textColor: Colors.white)),
|
||||||
|
],
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
);
|
)
|
||||||
|
.marginOnly(bottom: showElevation ? 0 : bigMargin)
|
||||||
|
.marginSymmetric(horizontal: showElevation ? 0 : bigMargin);
|
||||||
}
|
}
|
||||||
|
|
||||||
buildDisconnected(BuildContext context) {
|
buildDisconnected(BuildContext context) {
|
||||||
return Row(
|
return Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Ink(
|
Expanded(
|
||||||
width: 200,
|
child: buildButton(context,
|
||||||
height: 40,
|
color: MyTheme.accent,
|
||||||
decoration: BoxDecoration(
|
onClick: handleClose,
|
||||||
color: MyTheme.accent, borderRadius: BorderRadius.circular(10)),
|
text: 'Close',
|
||||||
child: InkWell(
|
textColor: Colors.white)),
|
||||||
onTap: () => handleClose(context),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
translate("Close"),
|
|
||||||
style: TextStyle(color: Colors.white),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)),
|
|
||||||
)
|
|
||||||
],
|
],
|
||||||
);
|
).marginOnly(bottom: 15).marginSymmetric(horizontal: bigMargin);
|
||||||
}
|
}
|
||||||
|
|
||||||
buildUnAuthorized(BuildContext context) {
|
buildUnAuthorized(BuildContext context) {
|
||||||
return Row(
|
final bool canElevate = bind.cmCanElevate();
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
final model = Provider.of<ServerModel>(context);
|
||||||
|
final showElevation = canElevate && model.showElevation;
|
||||||
|
final showAccept = model.approveMode != 'password';
|
||||||
|
return Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
children: [
|
children: [
|
||||||
Ink(
|
Offstage(
|
||||||
width: 100,
|
offstage: !showElevation || !showAccept,
|
||||||
height: 40,
|
child: buildButton(context, color: Colors.green[700], onClick: () {
|
||||||
decoration: BoxDecoration(
|
handleAccept(context);
|
||||||
color: MyTheme.accent, borderRadius: BorderRadius.circular(10)),
|
handleElevate(context);
|
||||||
child: InkWell(
|
windowManager.minimize();
|
||||||
onTap: () => checkClickTime(client.id, () {
|
},
|
||||||
handleAccept(context);
|
text: 'Accept',
|
||||||
windowManager.minimize();
|
icon: Icon(
|
||||||
}),
|
Icons.security_sharp,
|
||||||
child: Row(
|
color: Colors.white,
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
),
|
||||||
children: [
|
textColor: Colors.white),
|
||||||
Text(
|
|
||||||
translate("Accept"),
|
|
||||||
style: TextStyle(color: Colors.white),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)),
|
|
||||||
),
|
),
|
||||||
SizedBox(
|
Row(
|
||||||
width: 30,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
if (showAccept)
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
buildButton(context, color: MyTheme.accent, onClick: () {
|
||||||
|
handleAccept(context);
|
||||||
|
windowManager.minimize();
|
||||||
|
}, text: 'Accept', textColor: Colors.white),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: buildButton(context,
|
||||||
|
color: Colors.transparent,
|
||||||
|
border: Border.all(color: Colors.grey),
|
||||||
|
onClick: handleDisconnect,
|
||||||
|
text: 'Cancel',
|
||||||
|
textColor: null)),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
Ink(
|
|
||||||
width: 100,
|
|
||||||
height: 40,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.transparent,
|
|
||||||
borderRadius: BorderRadius.circular(10),
|
|
||||||
border: Border.all(color: Colors.grey)),
|
|
||||||
child: InkWell(
|
|
||||||
onTap: () =>
|
|
||||||
checkClickTime(client.id, () => handleDisconnect(context)),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
translate("Cancel"),
|
|
||||||
style: TextStyle(),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)),
|
|
||||||
)
|
|
||||||
],
|
],
|
||||||
);
|
)
|
||||||
|
.marginOnly(bottom: showElevation ? 0 : bigMargin)
|
||||||
|
.marginSymmetric(horizontal: showElevation ? 0 : bigMargin);
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleDisconnect(BuildContext context) {
|
buildButton(
|
||||||
|
BuildContext context, {
|
||||||
|
required Color? color,
|
||||||
|
required Function() onClick,
|
||||||
|
Icon? icon,
|
||||||
|
BoxBorder? border,
|
||||||
|
required String text,
|
||||||
|
required Color? textColor,
|
||||||
|
}) {
|
||||||
|
Widget textWidget;
|
||||||
|
if (icon != null) {
|
||||||
|
textWidget = Text(
|
||||||
|
translate(text),
|
||||||
|
style: TextStyle(color: textColor),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
textWidget = Expanded(
|
||||||
|
child: Text(
|
||||||
|
translate(text),
|
||||||
|
style: TextStyle(color: textColor),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container(
|
||||||
|
height: 30,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: color, borderRadius: BorderRadius.circular(4), border: border),
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () => checkClickTime(client.id, onClick),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Offstage(offstage: icon == null, child: icon),
|
||||||
|
textWidget,
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
).marginAll(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleDisconnect() {
|
||||||
bind.cmCloseConnection(connId: client.id);
|
bind.cmCloseConnection(connId: client.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -611,7 +658,13 @@ class _CmControlPanel extends StatelessWidget {
|
|||||||
model.sendLoginResponse(client, true);
|
model.sendLoginResponse(client, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleClose(BuildContext context) async {
|
void handleElevate(BuildContext context) {
|
||||||
|
final model = Provider.of<ServerModel>(context, listen: false);
|
||||||
|
model.setShowElevation(false);
|
||||||
|
bind.cmElevatePortable(connId: client.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleClose() async {
|
||||||
await bind.cmRemoveDisconnectedConnection(connId: client.id);
|
await bind.cmRemoveDisconnectedConnection(connId: client.id);
|
||||||
if (await bind.cmGetClientsLength() == 0) {
|
if (await bind.cmGetClientsLength() == 0) {
|
||||||
windowManager.close();
|
windowManager.close();
|
||||||
|
|||||||
@ -21,6 +21,69 @@ import '../../common/shared_state.dart';
|
|||||||
import './popup_menu.dart';
|
import './popup_menu.dart';
|
||||||
import './material_mod_popup_menu.dart' as mod_menu;
|
import './material_mod_popup_menu.dart' as mod_menu;
|
||||||
|
|
||||||
|
class MenubarState {
|
||||||
|
final kStoreKey = 'remoteMenubarState';
|
||||||
|
late RxBool show;
|
||||||
|
late RxBool _pin;
|
||||||
|
|
||||||
|
MenubarState() {
|
||||||
|
final s = bind.getLocalFlutterConfig(k: kStoreKey);
|
||||||
|
if (s.isEmpty) {
|
||||||
|
_initSet(false, false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
final m = jsonDecode(s);
|
||||||
|
if (m == null) {
|
||||||
|
_initSet(false, false);
|
||||||
|
} else {
|
||||||
|
_initSet(m['pin'] ?? false, m['pin'] ?? false);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
debugPrint('Failed to decode menubar state ${e.toString()}');
|
||||||
|
_initSet(false, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_initSet(bool s, bool p) {
|
||||||
|
// Show remubar when connection is established.
|
||||||
|
show = RxBool(true);
|
||||||
|
_pin = RxBool(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool get pin => _pin.value;
|
||||||
|
|
||||||
|
switchShow() async {
|
||||||
|
show.value = !show.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
setShow(bool v) async {
|
||||||
|
if (show.value != v) {
|
||||||
|
show.value = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switchPin() async {
|
||||||
|
_pin.value = !_pin.value;
|
||||||
|
// Save everytime changed, as this func will not be called frequently
|
||||||
|
await save();
|
||||||
|
}
|
||||||
|
|
||||||
|
setPin(bool v) async {
|
||||||
|
if (_pin.value != v) {
|
||||||
|
_pin.value = v;
|
||||||
|
// Save everytime changed, as this func will not be called frequently
|
||||||
|
await save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
save() async {
|
||||||
|
bind.setLocalFlutterConfig(
|
||||||
|
k: kStoreKey, v: jsonEncode({'pin': _pin.value}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class _MenubarTheme {
|
class _MenubarTheme {
|
||||||
static const Color commonColor = MyTheme.accent;
|
static const Color commonColor = MyTheme.accent;
|
||||||
// kMinInteractiveDimension
|
// kMinInteractiveDimension
|
||||||
@ -31,7 +94,7 @@ class _MenubarTheme {
|
|||||||
class RemoteMenubar extends StatefulWidget {
|
class RemoteMenubar extends StatefulWidget {
|
||||||
final String id;
|
final String id;
|
||||||
final FFI ffi;
|
final FFI ffi;
|
||||||
final RxBool show;
|
final MenubarState state;
|
||||||
final Function(Function(bool)) onEnterOrLeaveImageSetter;
|
final Function(Function(bool)) onEnterOrLeaveImageSetter;
|
||||||
final Function() onEnterOrLeaveImageCleaner;
|
final Function() onEnterOrLeaveImageCleaner;
|
||||||
|
|
||||||
@ -39,7 +102,7 @@ class RemoteMenubar extends StatefulWidget {
|
|||||||
Key? key,
|
Key? key,
|
||||||
required this.id,
|
required this.id,
|
||||||
required this.ffi,
|
required this.ffi,
|
||||||
required this.show,
|
required this.state,
|
||||||
required this.onEnterOrLeaveImageSetter,
|
required this.onEnterOrLeaveImageSetter,
|
||||||
required this.onEnterOrLeaveImageCleaner,
|
required this.onEnterOrLeaveImageCleaner,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
@ -51,7 +114,6 @@ class RemoteMenubar extends StatefulWidget {
|
|||||||
class _RemoteMenubarState extends State<RemoteMenubar> {
|
class _RemoteMenubarState extends State<RemoteMenubar> {
|
||||||
final Rx<Color> _hideColor = Colors.white12.obs;
|
final Rx<Color> _hideColor = Colors.white12.obs;
|
||||||
final _rxHideReplay = rxdart.ReplaySubject<int>();
|
final _rxHideReplay = rxdart.ReplaySubject<int>();
|
||||||
final _pinMenubar = false.obs;
|
|
||||||
bool _isCursorOverImage = false;
|
bool _isCursorOverImage = false;
|
||||||
window_size.Screen? _screen;
|
window_size.Screen? _screen;
|
||||||
|
|
||||||
@ -63,7 +125,8 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
|
|
||||||
RxBool get show => widget.show;
|
RxBool get show => widget.state.show;
|
||||||
|
bool get pin => widget.state.pin;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
initState() {
|
initState() {
|
||||||
@ -82,7 +145,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
.throttleTime(const Duration(milliseconds: 5000),
|
.throttleTime(const Duration(milliseconds: 5000),
|
||||||
trailing: true, leading: false)
|
trailing: true, leading: false)
|
||||||
.listen((int v) {
|
.listen((int v) {
|
||||||
if (_pinMenubar.isFalse && show.isTrue && _isCursorOverImage) {
|
if (!pin && show.isTrue && _isCursorOverImage) {
|
||||||
show.value = false;
|
show.value = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -132,7 +195,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_updateScreen() async {
|
_updateScreen() async {
|
||||||
final v = await DesktopMultiWindow.invokeMethod(0, "get_window_info", "");
|
final v = await DesktopMultiWindow.invokeMethod(0, 'get_window_info', '');
|
||||||
final String valueStr = v;
|
final String valueStr = v;
|
||||||
if (valueStr.isEmpty) {
|
if (valueStr.isEmpty) {
|
||||||
_screen = null;
|
_screen = null;
|
||||||
@ -196,18 +259,15 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
|
|
||||||
Widget _buildPinMenubar(BuildContext context) {
|
Widget _buildPinMenubar(BuildContext context) {
|
||||||
return Obx(() => IconButton(
|
return Obx(() => IconButton(
|
||||||
tooltip:
|
tooltip: translate(pin ? 'Unpin menubar' : 'Pin menubar'),
|
||||||
translate(_pinMenubar.isTrue ? 'Unpin menubar' : 'Pin menubar'),
|
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
_pinMenubar.value = !_pinMenubar.value;
|
widget.state.switchPin();
|
||||||
},
|
},
|
||||||
icon: Obx(() => Transform.rotate(
|
icon: Obx(() => Transform.rotate(
|
||||||
angle: _pinMenubar.isTrue ? math.pi / 4 : 0,
|
angle: pin ? math.pi / 4 : 0,
|
||||||
child: Icon(
|
child: Icon(
|
||||||
Icons.push_pin,
|
Icons.push_pin,
|
||||||
color: _pinMenubar.isTrue
|
color: pin ? _MenubarTheme.commonColor : Colors.grey,
|
||||||
? _MenubarTheme.commonColor
|
|
||||||
: Colors.grey,
|
|
||||||
))),
|
))),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@ -262,7 +322,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
child: Obx(() {
|
child: Obx(() {
|
||||||
RxInt display = CurrentDisplayState.find(widget.id);
|
RxInt display = CurrentDisplayState.find(widget.id);
|
||||||
return Text(
|
return Text(
|
||||||
"${display.value + 1}/${pi.displays.length}",
|
'${display.value + 1}/${pi.displays.length}',
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
color: _MenubarTheme.commonColor, fontSize: 8),
|
color: _MenubarTheme.commonColor, fontSize: 8),
|
||||||
);
|
);
|
||||||
@ -430,7 +490,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
return IconButton(
|
return IconButton(
|
||||||
tooltip: translate('Close'),
|
tooltip: translate('Close'),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
clientClose(widget.ffi.dialogManager);
|
clientClose(widget.id, widget.ffi.dialogManager);
|
||||||
},
|
},
|
||||||
icon: const Icon(
|
icon: const Icon(
|
||||||
Icons.close,
|
Icons.close,
|
||||||
@ -535,10 +595,10 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (perms["restart"] != false &&
|
if (perms['restart'] != false &&
|
||||||
(pi.platform == "Linux" ||
|
(pi.platform == 'Linux' ||
|
||||||
pi.platform == "Windows" ||
|
pi.platform == 'Windows' ||
|
||||||
pi.platform == "Mac OS")) {
|
pi.platform == 'Mac OS')) {
|
||||||
displayMenu.add(MenuEntryButton<String>(
|
displayMenu.add(MenuEntryButton<String>(
|
||||||
childBuilder: (TextStyle? style) => Text(
|
childBuilder: (TextStyle? style) => Text(
|
||||||
translate('Restart Remote Device'),
|
translate('Restart Remote Device'),
|
||||||
@ -569,14 +629,14 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
displayMenu.add(MenuEntryButton<String>(
|
displayMenu.add(MenuEntryButton<String>(
|
||||||
childBuilder: (TextStyle? style) => Obx(() => Text(
|
childBuilder: (TextStyle? style) => Obx(() => Text(
|
||||||
translate(
|
translate(
|
||||||
'${BlockInputState.find(widget.id).value ? "Unb" : "B"}lock user input'),
|
'${BlockInputState.find(widget.id).value ? 'Unb' : 'B'}lock user input'),
|
||||||
style: style,
|
style: style,
|
||||||
)),
|
)),
|
||||||
proc: () {
|
proc: () {
|
||||||
RxBool blockInput = BlockInputState.find(widget.id);
|
RxBool blockInput = BlockInputState.find(widget.id);
|
||||||
bind.sessionToggleOption(
|
bind.sessionToggleOption(
|
||||||
id: widget.id,
|
id: widget.id,
|
||||||
value: '${blockInput.value ? "un" : ""}block-input');
|
value: '${blockInput.value ? 'un' : ''}block-input');
|
||||||
blockInput.value = !blockInput.value;
|
blockInput.value = !blockInput.value;
|
||||||
},
|
},
|
||||||
padding: padding,
|
padding: padding,
|
||||||
@ -611,7 +671,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
// ClipboardData? data =
|
// ClipboardData? data =
|
||||||
// await Clipboard.getData(Clipboard.kTextPlain);
|
// await Clipboard.getData(Clipboard.kTextPlain);
|
||||||
// if (data != null && data.text != null) {
|
// if (data != null && data.text != null) {
|
||||||
// bind.sessionInputString(id: widget.id, value: data.text ?? "");
|
// bind.sessionInputString(id: widget.id, value: data.text ?? '');
|
||||||
// }
|
// }
|
||||||
// }();
|
// }();
|
||||||
// },
|
// },
|
||||||
@ -619,18 +679,6 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
// dismissOnClicked: true,
|
// dismissOnClicked: true,
|
||||||
// ));
|
// ));
|
||||||
// }
|
// }
|
||||||
|
|
||||||
displayMenu.add(MenuEntryButton<String>(
|
|
||||||
childBuilder: (TextStyle? style) => Text(
|
|
||||||
translate('Reset canvas'),
|
|
||||||
style: style,
|
|
||||||
),
|
|
||||||
proc: () {
|
|
||||||
widget.ffi.cursorModel.reset();
|
|
||||||
},
|
|
||||||
padding: padding,
|
|
||||||
dismissOnClicked: true,
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return displayMenu;
|
return displayMenu;
|
||||||
@ -680,14 +728,11 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
dismissOnClicked: true,
|
dismissOnClicked: true,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
curOptionGetter: () async {
|
curOptionGetter: () async =>
|
||||||
return await bind.sessionGetOption(
|
// null means peer id is not found, which there's no need to care about
|
||||||
id: widget.id, arg: 'view-style') ??
|
await bind.sessionGetViewStyle(id: widget.id) ?? '',
|
||||||
'adaptive';
|
|
||||||
},
|
|
||||||
optionSetter: (String oldValue, String newValue) async {
|
optionSetter: (String oldValue, String newValue) async {
|
||||||
await bind.sessionPeerOption(
|
await bind.sessionSetViewStyle(id: widget.id, value: newValue);
|
||||||
id: widget.id, name: "view-style", value: newValue);
|
|
||||||
widget.ffi.canvasModel.updateViewStyle();
|
widget.ffi.canvasModel.updateViewStyle();
|
||||||
},
|
},
|
||||||
padding: padding,
|
padding: padding,
|
||||||
@ -708,14 +753,11 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
dismissOnClicked: true,
|
dismissOnClicked: true,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
curOptionGetter: () async {
|
curOptionGetter: () async =>
|
||||||
return await bind.sessionGetOption(
|
// null means peer id is not found, which there's no need to care about
|
||||||
id: widget.id, arg: 'scroll-style') ??
|
await bind.sessionGetScrollStyle(id: widget.id) ?? '',
|
||||||
'';
|
|
||||||
},
|
|
||||||
optionSetter: (String oldValue, String newValue) async {
|
optionSetter: (String oldValue, String newValue) async {
|
||||||
await bind.sessionPeerOption(
|
await bind.sessionSetScrollStyle(id: widget.id, value: newValue);
|
||||||
id: widget.id, name: "scroll-style", value: newValue);
|
|
||||||
widget.ffi.canvasModel.updateScrollStyle();
|
widget.ffi.canvasModel.updateScrollStyle();
|
||||||
},
|
},
|
||||||
padding: padding,
|
padding: padding,
|
||||||
@ -745,12 +787,9 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
value: 'custom',
|
value: 'custom',
|
||||||
dismissOnClicked: true),
|
dismissOnClicked: true),
|
||||||
],
|
],
|
||||||
curOptionGetter: () async {
|
curOptionGetter: () async =>
|
||||||
String quality =
|
// null means peer id is not found, which there's no need to care about
|
||||||
await bind.sessionGetImageQuality(id: widget.id) ?? 'balanced';
|
await bind.sessionGetImageQuality(id: widget.id) ?? '',
|
||||||
if (quality == '') quality = 'balanced';
|
|
||||||
return quality;
|
|
||||||
},
|
|
||||||
optionSetter: (String oldValue, String newValue) async {
|
optionSetter: (String oldValue, String newValue) async {
|
||||||
if (oldValue != newValue) {
|
if (oldValue != newValue) {
|
||||||
await bind.sessionSetImageQuality(id: widget.id, value: newValue);
|
await bind.sessionSetImageQuality(id: widget.id, value: newValue);
|
||||||
@ -1015,14 +1054,14 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
},
|
},
|
||||||
curOptionGetter: () async {
|
curOptionGetter: () async =>
|
||||||
return await bind.sessionGetOption(
|
// null means peer id is not found, which there's no need to care about
|
||||||
id: widget.id, arg: 'codec-preference') ??
|
await bind.sessionGetOption(
|
||||||
'auto';
|
id: widget.id, arg: 'codec-preference') ??
|
||||||
},
|
'',
|
||||||
optionSetter: (String oldValue, String newValue) async {
|
optionSetter: (String oldValue, String newValue) async {
|
||||||
await bind.sessionPeerOption(
|
await bind.sessionPeerOption(
|
||||||
id: widget.id, name: "codec-preference", value: newValue);
|
id: widget.id, name: 'codec-preference', value: newValue);
|
||||||
bind.sessionChangePreferCodec(id: widget.id);
|
bind.sessionChangePreferCodec(id: widget.id);
|
||||||
},
|
},
|
||||||
padding: padding,
|
padding: padding,
|
||||||
@ -1050,6 +1089,25 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
);
|
);
|
||||||
}());
|
}());
|
||||||
|
|
||||||
|
/// Show remote cursor
|
||||||
|
displayMenu.add(() {
|
||||||
|
final opt = 'zoom-cursor';
|
||||||
|
final state = PeerBoolOption.find(widget.id, opt);
|
||||||
|
return MenuEntrySwitch2<String>(
|
||||||
|
switchType: SwitchType.scheckbox,
|
||||||
|
text: translate('Zoom cursor'),
|
||||||
|
getter: () {
|
||||||
|
return state;
|
||||||
|
},
|
||||||
|
setter: (bool v) async {
|
||||||
|
state.value = v;
|
||||||
|
await bind.sessionToggleOption(id: widget.id, value: opt);
|
||||||
|
},
|
||||||
|
padding: padding,
|
||||||
|
dismissOnClicked: true,
|
||||||
|
);
|
||||||
|
}());
|
||||||
|
|
||||||
/// Show quality monitor
|
/// Show quality monitor
|
||||||
displayMenu.add(MenuEntrySwitch<String>(
|
displayMenu.add(MenuEntrySwitch<String>(
|
||||||
switchType: SwitchType.scheckbox,
|
switchType: SwitchType.scheckbox,
|
||||||
@ -1116,9 +1174,8 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
MenuEntryRadioOption(text: translate('Legacy mode'), value: 'legacy'),
|
MenuEntryRadioOption(text: translate('Legacy mode'), value: 'legacy'),
|
||||||
MenuEntryRadioOption(text: translate('Map mode'), value: 'map'),
|
MenuEntryRadioOption(text: translate('Map mode'), value: 'map'),
|
||||||
],
|
],
|
||||||
curOptionGetter: () async {
|
curOptionGetter: () async =>
|
||||||
return await bind.sessionGetKeyboardName(id: widget.id);
|
await bind.sessionGetKeyboardName(id: widget.id),
|
||||||
},
|
|
||||||
optionSetter: (String oldValue, String newValue) async {
|
optionSetter: (String oldValue, String newValue) async {
|
||||||
await bind.sessionSetKeyboardMode(
|
await bind.sessionSetKeyboardMode(
|
||||||
id: widget.id, keyboardMode: newValue);
|
id: widget.id, keyboardMode: newValue);
|
||||||
@ -1150,16 +1207,16 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
void showSetOSPassword(
|
void showSetOSPassword(
|
||||||
String id, bool login, OverlayDialogManager dialogManager) async {
|
String id, bool login, OverlayDialogManager dialogManager) async {
|
||||||
final controller = TextEditingController();
|
final controller = TextEditingController();
|
||||||
var password = await bind.sessionGetOption(id: id, arg: "os-password") ?? "";
|
var password = await bind.sessionGetOption(id: id, arg: 'os-password') ?? '';
|
||||||
var autoLogin = await bind.sessionGetOption(id: id, arg: "auto-login") != "";
|
var autoLogin = await bind.sessionGetOption(id: id, arg: 'auto-login') != '';
|
||||||
controller.text = password;
|
controller.text = password;
|
||||||
dialogManager.show((setState, close) {
|
dialogManager.show((setState, close) {
|
||||||
submit() {
|
submit() {
|
||||||
var text = controller.text.trim();
|
var text = controller.text.trim();
|
||||||
bind.sessionPeerOption(id: id, name: "os-password", value: text);
|
bind.sessionPeerOption(id: id, name: 'os-password', value: text);
|
||||||
bind.sessionPeerOption(
|
bind.sessionPeerOption(
|
||||||
id: id, name: "auto-login", value: autoLogin ? 'Y' : '');
|
id: id, name: 'auto-login', value: autoLogin ? 'Y' : '');
|
||||||
if (text != "" && login) {
|
if (text != '' && login) {
|
||||||
bind.sessionInputOsPassword(id: id, value: text);
|
bind.sessionInputOsPassword(id: id, value: text);
|
||||||
}
|
}
|
||||||
close();
|
close();
|
||||||
@ -1206,7 +1263,7 @@ void showAuditDialog(String id, dialogManager) async {
|
|||||||
dialogManager.show((setState, close) {
|
dialogManager.show((setState, close) {
|
||||||
submit() {
|
submit() {
|
||||||
var text = controller.text.trim();
|
var text = controller.text.trim();
|
||||||
if (text != "") {
|
if (text != '') {
|
||||||
bind.sessionSendNote(id: id, note: text);
|
bind.sessionSendNote(id: id, note: text);
|
||||||
}
|
}
|
||||||
close();
|
close();
|
||||||
@ -1245,11 +1302,11 @@ void showAuditDialog(String id, dialogManager) async {
|
|||||||
keyboardType: TextInputType.multiline,
|
keyboardType: TextInputType.multiline,
|
||||||
textInputAction: TextInputAction.newline,
|
textInputAction: TextInputAction.newline,
|
||||||
decoration: const InputDecoration.collapsed(
|
decoration: const InputDecoration.collapsed(
|
||||||
hintText: "input note here",
|
hintText: 'input note here',
|
||||||
),
|
),
|
||||||
// inputFormatters: [
|
// inputFormatters: [
|
||||||
// LengthLimitingTextInputFormatter(16),
|
// LengthLimitingTextInputFormatter(16),
|
||||||
// // FilteringTextInputFormatter(RegExp(r"[a-zA-z][a-zA-z0-9\_]*"), allow: true)
|
// // FilteringTextInputFormatter(RegExp(r'[a-zA-z][a-zA-z0-9\_]*'), allow: true)
|
||||||
// ],
|
// ],
|
||||||
maxLines: null,
|
maxLines: null,
|
||||||
maxLength: 256,
|
maxLength: 256,
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import 'package:flutter/material.dart' hide TabBarTheme;
|
|||||||
import 'package:flutter_hbb/common.dart';
|
import 'package:flutter_hbb/common.dart';
|
||||||
import 'package:flutter_hbb/consts.dart';
|
import 'package:flutter_hbb/consts.dart';
|
||||||
import 'package:flutter_hbb/main.dart';
|
import 'package:flutter_hbb/main.dart';
|
||||||
|
import 'package:flutter_hbb/common/shared_state.dart';
|
||||||
import 'package:flutter_hbb/models/platform_model.dart';
|
import 'package:flutter_hbb/models/platform_model.dart';
|
||||||
import 'package:flutter_hbb/models/state_model.dart';
|
import 'package:flutter_hbb/models/state_model.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
@ -252,6 +253,15 @@ class DesktopTab extends StatelessWidget {
|
|||||||
tabType == DesktopTabType.main || tabType == DesktopTabType.cm;
|
tabType == DesktopTabType.main || tabType == DesktopTabType.cm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static RxString labelGetterAlias(String peerId) {
|
||||||
|
final opt = 'alias';
|
||||||
|
PeerStringOption.init(peerId, opt, () {
|
||||||
|
final alias = bind.mainGetPeerOptionSync(id: peerId, key: opt);
|
||||||
|
return alias.isEmpty ? peerId : alias;
|
||||||
|
});
|
||||||
|
return PeerStringOption.find(peerId, opt);
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Column(children: [
|
return Column(children: [
|
||||||
|
|||||||
@ -15,7 +15,6 @@ import 'package:flutter_hbb/utils/multi_window_manager.dart';
|
|||||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
|
||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
import 'package:bot_toast/bot_toast.dart';
|
import 'package:bot_toast/bot_toast.dart';
|
||||||
|
|
||||||
@ -43,7 +42,9 @@ Future<void> main(List<String> args) async {
|
|||||||
if (args.isNotEmpty && args.first == 'multi_window') {
|
if (args.isNotEmpty && args.first == 'multi_window') {
|
||||||
windowId = int.parse(args[1]);
|
windowId = int.parse(args[1]);
|
||||||
stateGlobal.setWindowId(windowId!);
|
stateGlobal.setWindowId(windowId!);
|
||||||
WindowController.fromWindowId(windowId!).showTitleBar(false);
|
if (!Platform.isMacOS) {
|
||||||
|
WindowController.fromWindowId(windowId!).showTitleBar(false);
|
||||||
|
}
|
||||||
final argument = args[2].isEmpty
|
final argument = args[2].isEmpty
|
||||||
? <String, dynamic>{}
|
? <String, dynamic>{}
|
||||||
: jsonDecode(args[2]) as Map<String, dynamic>;
|
: jsonDecode(args[2]) as Map<String, dynamic>;
|
||||||
@ -84,7 +85,7 @@ Future<void> main(List<String> args) async {
|
|||||||
debugPrint("--cm started");
|
debugPrint("--cm started");
|
||||||
desktopType = DesktopType.cm;
|
desktopType = DesktopType.cm;
|
||||||
await windowManager.ensureInitialized();
|
await windowManager.ensureInitialized();
|
||||||
runConnectionManagerScreen();
|
runConnectionManagerScreen(args.contains('--hide'));
|
||||||
} else if (args.contains('--install')) {
|
} else if (args.contains('--install')) {
|
||||||
runInstallPage();
|
runInstallPage();
|
||||||
} else {
|
} else {
|
||||||
@ -97,7 +98,6 @@ Future<void> main(List<String> args) async {
|
|||||||
|
|
||||||
Future<void> initEnv(String appType) async {
|
Future<void> initEnv(String appType) async {
|
||||||
// global shared preference
|
// global shared preference
|
||||||
await Get.putAsync(() => SharedPreferences.getInstance());
|
|
||||||
await platformFFI.init(appType);
|
await platformFFI.init(appType);
|
||||||
// global FFI, use this **ONLY** for global configuration
|
// global FFI, use this **ONLY** for global configuration
|
||||||
// for convenience, use global FFI on mobile platform
|
// for convenience, use global FFI on mobile platform
|
||||||
@ -170,13 +170,14 @@ void runMultiWindow(
|
|||||||
);
|
);
|
||||||
switch (appType) {
|
switch (appType) {
|
||||||
case kAppTypeDesktopRemote:
|
case kAppTypeDesktopRemote:
|
||||||
await restoreWindowPosition(WindowType.RemoteDesktop, windowId: windowId!);
|
await restoreWindowPosition(WindowType.RemoteDesktop,
|
||||||
|
windowId: windowId!);
|
||||||
break;
|
break;
|
||||||
case kAppTypeDesktopFileTransfer:
|
case kAppTypeDesktopFileTransfer:
|
||||||
await restoreWindowPosition(WindowType.FileTransfer, windowId: windowId!);
|
await restoreWindowPosition(WindowType.FileTransfer, windowId: windowId!);
|
||||||
break;
|
break;
|
||||||
case kAppTypeDesktopPortForward:
|
case kAppTypeDesktopPortForward:
|
||||||
await restoreWindowPosition(WindowType.PortForward, windowId: windowId!);
|
await restoreWindowPosition(WindowType.PortForward, windowId: windowId!);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// no such appType
|
// no such appType
|
||||||
@ -184,16 +185,23 @@ void runMultiWindow(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void runConnectionManagerScreen() async {
|
void runConnectionManagerScreen(bool hide) async {
|
||||||
await initEnv(kAppTypeMain);
|
await initEnv(kAppTypeMain);
|
||||||
// initialize window
|
|
||||||
WindowOptions windowOptions =
|
|
||||||
getHiddenTitleBarWindowOptions(size: kConnectionManagerWindowSize);
|
|
||||||
_runApp(
|
_runApp(
|
||||||
'',
|
'',
|
||||||
const DesktopServerPage(),
|
const DesktopServerPage(),
|
||||||
MyTheme.currentThemeMode(),
|
MyTheme.currentThemeMode(),
|
||||||
);
|
);
|
||||||
|
if (hide) {
|
||||||
|
hideCmWindow();
|
||||||
|
} else {
|
||||||
|
showCmWindow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void showCmWindow() {
|
||||||
|
WindowOptions windowOptions =
|
||||||
|
getHiddenTitleBarWindowOptions(size: kConnectionManagerWindowSize);
|
||||||
windowManager.waitUntilReadyToShow(windowOptions, () async {
|
windowManager.waitUntilReadyToShow(windowOptions, () async {
|
||||||
await windowManager.show();
|
await windowManager.show();
|
||||||
await Future.wait([windowManager.focus(), windowManager.setOpacity(1)]);
|
await Future.wait([windowManager.focus(), windowManager.setOpacity(1)]);
|
||||||
@ -203,6 +211,15 @@ void runConnectionManagerScreen() async {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hideCmWindow() {
|
||||||
|
WindowOptions windowOptions =
|
||||||
|
getHiddenTitleBarWindowOptions(size: kConnectionManagerWindowSize);
|
||||||
|
windowManager.setOpacity(0);
|
||||||
|
windowManager.waitUntilReadyToShow(windowOptions, () async {
|
||||||
|
await windowManager.hide();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void _runApp(
|
void _runApp(
|
||||||
String title,
|
String title,
|
||||||
Widget home,
|
Widget home,
|
||||||
|
|||||||
@ -63,7 +63,8 @@ class _FileManagerPageState extends State<FileManagerPage> {
|
|||||||
leading: Row(children: [
|
leading: Row(children: [
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.close),
|
icon: Icon(Icons.close),
|
||||||
onPressed: () => clientClose(gFFI.dialogManager)),
|
onPressed: () =>
|
||||||
|
clientClose(widget.id, gFFI.dialogManager)),
|
||||||
]),
|
]),
|
||||||
centerTitle: true,
|
centerTitle: true,
|
||||||
title: ToggleSwitch(
|
title: ToggleSwitch(
|
||||||
|
|||||||
@ -223,7 +223,7 @@ class _RemotePageState extends State<RemotePage> {
|
|||||||
|
|
||||||
return WillPopScope(
|
return WillPopScope(
|
||||||
onWillPop: () async {
|
onWillPop: () async {
|
||||||
clientClose(gFFI.dialogManager);
|
clientClose(widget.id, gFFI.dialogManager);
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
child: getRawPointerAndKeyBody(Scaffold(
|
child: getRawPointerAndKeyBody(Scaffold(
|
||||||
@ -304,7 +304,7 @@ class _RemotePageState extends State<RemotePage> {
|
|||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
icon: Icon(Icons.clear),
|
icon: Icon(Icons.clear),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
clientClose(gFFI.dialogManager);
|
clientClose(widget.id, gFFI.dialogManager);
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
] +
|
] +
|
||||||
@ -474,7 +474,7 @@ class _RemotePageState extends State<RemotePage> {
|
|||||||
},
|
},
|
||||||
onTwoFingerScaleEnd: (d) {
|
onTwoFingerScaleEnd: (d) {
|
||||||
_scale = 1;
|
_scale = 1;
|
||||||
bind.sessionPeerOption(id: widget.id, name: "view-style", value: "");
|
bind.sessionSetViewStyle(id: widget.id, value: "");
|
||||||
},
|
},
|
||||||
onThreeFingerVerticalDragUpdate: gFFI.ffiModel.isPeerAndroid
|
onThreeFingerVerticalDragUpdate: gFFI.ffiModel.isPeerAndroid
|
||||||
? null
|
? null
|
||||||
@ -862,11 +862,19 @@ class CursorPaint extends StatelessWidget {
|
|||||||
final c = Provider.of<CanvasModel>(context);
|
final c = Provider.of<CanvasModel>(context);
|
||||||
final adjust = gFFI.cursorModel.adjustForKeyboard();
|
final adjust = gFFI.cursorModel.adjustForKeyboard();
|
||||||
var s = c.scale;
|
var s = c.scale;
|
||||||
|
double hotx = m.hotx;
|
||||||
|
double hoty = m.hoty;
|
||||||
|
if (m.image == null) {
|
||||||
|
if (preDefaultCursor.image != null) {
|
||||||
|
hotx = preDefaultCursor.image!.width / 2;
|
||||||
|
hoty = preDefaultCursor.image!.height / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
return CustomPaint(
|
return CustomPaint(
|
||||||
painter: ImagePainter(
|
painter: ImagePainter(
|
||||||
image: m.image,
|
image: m.image ?? preDefaultCursor.image,
|
||||||
x: m.x * s - m.hotx + c.x,
|
x: m.x * s - hotx * s + c.x,
|
||||||
y: m.y * s - m.hoty + c.y - adjust,
|
y: m.y * s - hoty * s + c.y - adjust,
|
||||||
scale: 1),
|
scale: 1),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -993,7 +1001,7 @@ void showOptions(
|
|||||||
setState(() {
|
setState(() {
|
||||||
viewStyle = value;
|
viewStyle = value;
|
||||||
bind
|
bind
|
||||||
.sessionPeerOption(id: id, name: "view-style", value: value)
|
.sessionSetViewStyle(id: id, value: value)
|
||||||
.then((_) => gFFI.canvasModel.updateViewStyle());
|
.then((_) => gFFI.canvasModel.updateViewStyle());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,9 +5,9 @@ import '../../common.dart';
|
|||||||
import '../../models/model.dart';
|
import '../../models/model.dart';
|
||||||
import '../../models/platform_model.dart';
|
import '../../models/platform_model.dart';
|
||||||
|
|
||||||
void clientClose(OverlayDialogManager dialogManager) {
|
void clientClose(String id, OverlayDialogManager dialogManager) {
|
||||||
msgBox(
|
msgBox(id, '', 'Close', 'Are you sure to close the connection?', '',
|
||||||
'', 'Close', 'Are you sure to close the connection?', '', dialogManager);
|
dialogManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
void showSuccess() {
|
void showSuccess() {
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
import 'dart:ui' as ui;
|
import 'dart:ui' as ui;
|
||||||
@ -39,10 +40,14 @@ class InputModel {
|
|||||||
var alt = false;
|
var alt = false;
|
||||||
var command = false;
|
var command = false;
|
||||||
|
|
||||||
|
// trackpad
|
||||||
|
var trackpadScrollDistance = Offset.zero;
|
||||||
|
Timer? _flingTimer;
|
||||||
|
|
||||||
// mouse
|
// mouse
|
||||||
final isPhysicalMouse = false.obs;
|
final isPhysicalMouse = false.obs;
|
||||||
int _lastMouseDownButtons = 0;
|
int _lastMouseDownButtons = 0;
|
||||||
Offset last_mouse_pos = Offset.zero;
|
Offset lastMousePos = Offset.zero;
|
||||||
|
|
||||||
get id => parent.target?.id ?? "";
|
get id => parent.target?.id ?? "";
|
||||||
|
|
||||||
@ -236,6 +241,7 @@ class InputModel {
|
|||||||
if (!enter) {
|
if (!enter) {
|
||||||
resetModifiers();
|
resetModifiers();
|
||||||
}
|
}
|
||||||
|
_flingTimer?.cancel();
|
||||||
bind.sessionEnterOrLeave(id: id, enter: enter);
|
bind.sessionEnterOrLeave(id: id, enter: enter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,6 +264,59 @@ class InputModel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
int _signOrZero(num x) {
|
||||||
|
if (x == 0) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return x > 0 ? 1 : -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void onPointerPanZoomStart(PointerPanZoomStartEvent e) {}
|
||||||
|
|
||||||
|
// https://docs.flutter.dev/release/breaking-changes/trackpad-gestures
|
||||||
|
// TODO(support zoom in/out)
|
||||||
|
void onPointerPanZoomUpdate(PointerPanZoomUpdateEvent e) {
|
||||||
|
var delta = e.panDelta;
|
||||||
|
trackpadScrollDistance += delta;
|
||||||
|
bind.sessionSendMouse(
|
||||||
|
id: id,
|
||||||
|
msg:
|
||||||
|
'{"type": "trackpad", "x": "${delta.dx.toInt()}", "y": "${delta.dy.toInt()}"}');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simple simulation for fling.
|
||||||
|
void _scheduleFling(var x, y, dx, dy) {
|
||||||
|
if (dx <= 0 && dy <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_flingTimer = Timer(Duration(milliseconds: 10), () {
|
||||||
|
bind.sessionSendMouse(
|
||||||
|
id: id, msg: '{"type": "trackpad", "x": "$x", "y": "$y"}');
|
||||||
|
dx--;
|
||||||
|
dy--;
|
||||||
|
if (dx == 0) {
|
||||||
|
x = 0;
|
||||||
|
}
|
||||||
|
if (dy == 0) {
|
||||||
|
y = 0;
|
||||||
|
}
|
||||||
|
_scheduleFling(x, y, dx, dy);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void onPointerPanZoomEnd(PointerPanZoomEndEvent e) {
|
||||||
|
var x = _signOrZero(trackpadScrollDistance.dx);
|
||||||
|
var y = _signOrZero(trackpadScrollDistance.dy);
|
||||||
|
var dx = trackpadScrollDistance.dx.abs() ~/ 40;
|
||||||
|
var dy = trackpadScrollDistance.dy.abs() ~/ 40;
|
||||||
|
_scheduleFling(x, y, dx, dy);
|
||||||
|
|
||||||
|
trackpadScrollDistance = Offset.zero;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
void onPointDownImage(PointerDownEvent e) {
|
void onPointDownImage(PointerDownEvent e) {
|
||||||
debugPrint("onPointDownImage");
|
debugPrint("onPointDownImage");
|
||||||
if (e.kind != ui.PointerDeviceKind.mouse) {
|
if (e.kind != ui.PointerDeviceKind.mouse) {
|
||||||
@ -308,23 +367,23 @@ class InputModel {
|
|||||||
double y = max(0.0, evt['y']);
|
double y = max(0.0, evt['y']);
|
||||||
final cursorModel = parent.target!.cursorModel;
|
final cursorModel = parent.target!.cursorModel;
|
||||||
|
|
||||||
if (cursorModel.is_peer_control_protected) {
|
if (cursorModel.isPeerControlProtected) {
|
||||||
last_mouse_pos = ui.Offset(x, y);
|
lastMousePos = ui.Offset(x, y);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cursorModel.got_mouse_control) {
|
if (!cursorModel.gotMouseControl) {
|
||||||
bool self_get_control =
|
bool selfGetControl =
|
||||||
(x - last_mouse_pos.dx).abs() > kMouseControlDistance ||
|
(x - lastMousePos.dx).abs() > kMouseControlDistance ||
|
||||||
(y - last_mouse_pos.dy).abs() > kMouseControlDistance;
|
(y - lastMousePos.dy).abs() > kMouseControlDistance;
|
||||||
if (self_get_control) {
|
if (selfGetControl) {
|
||||||
cursorModel.got_mouse_control = true;
|
cursorModel.gotMouseControl = true;
|
||||||
} else {
|
} else {
|
||||||
last_mouse_pos = ui.Offset(x, y);
|
lastMousePos = ui.Offset(x, y);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
last_mouse_pos = ui.Offset(x, y);
|
lastMousePos = ui.Offset(x, y);
|
||||||
|
|
||||||
var type = '';
|
var type = '';
|
||||||
var isMove = false;
|
var isMove = false;
|
||||||
|
|||||||
@ -15,8 +15,8 @@ import 'package:flutter_hbb/models/file_model.dart';
|
|||||||
import 'package:flutter_hbb/models/server_model.dart';
|
import 'package:flutter_hbb/models/server_model.dart';
|
||||||
import 'package:flutter_hbb/models/user_model.dart';
|
import 'package:flutter_hbb/models/user_model.dart';
|
||||||
import 'package:flutter_hbb/models/state_model.dart';
|
import 'package:flutter_hbb/models/state_model.dart';
|
||||||
|
import 'package:flutter_hbb/common/shared_state.dart';
|
||||||
import 'package:flutter_hbb/utils/multi_window_manager.dart';
|
import 'package:flutter_hbb/utils/multi_window_manager.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
|
||||||
import 'package:tuple/tuple.dart';
|
import 'package:tuple/tuple.dart';
|
||||||
import 'package:image/image.dart' as img2;
|
import 'package:image/image.dart' as img2;
|
||||||
import 'package:flutter_custom_cursor/flutter_custom_cursor.dart';
|
import 'package:flutter_custom_cursor/flutter_custom_cursor.dart';
|
||||||
@ -190,6 +190,13 @@ class FfiModel with ChangeNotifier {
|
|||||||
rustDeskWinManager.newRemoteDesktop(arg);
|
rustDeskWinManager.newRemoteDesktop(arg);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
} else if (name == 'alias') {
|
||||||
|
handleAliasChanged(evt);
|
||||||
|
} else if (name == 'show_elevation') {
|
||||||
|
final show = evt['show'].toString() == 'true';
|
||||||
|
parent.target?.serverModel.setShowElevation(show);
|
||||||
|
} else if (name == 'cancel_msgbox') {
|
||||||
|
cancelMsgBox(evt, peerId);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -199,6 +206,13 @@ class FfiModel with ChangeNotifier {
|
|||||||
platformFFI.setEventCallback(startEventListener(peerId));
|
platformFFI.setEventCallback(startEventListener(peerId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleAliasChanged(Map<String, dynamic> evt) {
|
||||||
|
final rxAlias = PeerStringOption.find(evt['id'], 'alias');
|
||||||
|
if (rxAlias.value != evt['alias']) {
|
||||||
|
rxAlias.value = evt['alias'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
handleSwitchDisplay(Map<String, dynamic> evt) {
|
handleSwitchDisplay(Map<String, dynamic> evt) {
|
||||||
final oldOrientation = _display.width > _display.height;
|
final oldOrientation = _display.width > _display.height;
|
||||||
var old = _pi.currentDisplay;
|
var old = _pi.currentDisplay;
|
||||||
@ -219,6 +233,13 @@ class FfiModel with ChangeNotifier {
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cancelMsgBox(Map<String, dynamic> evt, String id) {
|
||||||
|
if (parent.target == null) return;
|
||||||
|
final dialogManager = parent.target!.dialogManager;
|
||||||
|
final tag = '$id-${evt['tag']}';
|
||||||
|
dialogManager.dismissByTag(tag);
|
||||||
|
}
|
||||||
|
|
||||||
/// Handle the message box event based on [evt] and [id].
|
/// Handle the message box event based on [evt] and [id].
|
||||||
handleMsgBox(Map<String, dynamic> evt, String id) {
|
handleMsgBox(Map<String, dynamic> evt, String id) {
|
||||||
if (parent.target == null) return;
|
if (parent.target == null) return;
|
||||||
@ -234,6 +255,9 @@ class FfiModel with ChangeNotifier {
|
|||||||
} else if (type == 'restarting') {
|
} else if (type == 'restarting') {
|
||||||
showMsgBox(id, type, title, text, link, false, dialogManager,
|
showMsgBox(id, type, title, text, link, false, dialogManager,
|
||||||
hasCancel: false);
|
hasCancel: false);
|
||||||
|
} else if (type == 'wait-remote-accept-nook') {
|
||||||
|
msgBoxCommon(dialogManager, title, Text(translate(text)),
|
||||||
|
[msgBoxButton("Cancel", closeConnection)]);
|
||||||
} else {
|
} else {
|
||||||
var hasRetry = evt['hasRetry'] == 'true';
|
var hasRetry = evt['hasRetry'] == 'true';
|
||||||
showMsgBox(id, type, title, text, link, hasRetry, dialogManager);
|
showMsgBox(id, type, title, text, link, hasRetry, dialogManager);
|
||||||
@ -244,7 +268,7 @@ class FfiModel with ChangeNotifier {
|
|||||||
showMsgBox(String id, String type, String title, String text, String link,
|
showMsgBox(String id, String type, String title, String text, String link,
|
||||||
bool hasRetry, OverlayDialogManager dialogManager,
|
bool hasRetry, OverlayDialogManager dialogManager,
|
||||||
{bool? hasCancel}) {
|
{bool? hasCancel}) {
|
||||||
msgBox(type, title, text, link, dialogManager, hasCancel: hasCancel);
|
msgBox(id, type, title, text, link, dialogManager, hasCancel: hasCancel);
|
||||||
_timer?.cancel();
|
_timer?.cancel();
|
||||||
if (hasRetry) {
|
if (hasRetry) {
|
||||||
_timer = Timer(Duration(seconds: _reconnects), () {
|
_timer = Timer(Duration(seconds: _reconnects), () {
|
||||||
@ -392,7 +416,7 @@ class ImageModel with ChangeNotifier {
|
|||||||
await initializeCursorAndCanvas(parent.target!);
|
await initializeCursorAndCanvas(parent.target!);
|
||||||
}
|
}
|
||||||
if (parent.target?.ffiModel.isPeerAndroid ?? false) {
|
if (parent.target?.ffiModel.isPeerAndroid ?? false) {
|
||||||
bind.sessionPeerOption(id: id, name: 'view-style', value: 'adaptive');
|
bind.sessionSetViewStyle(id: id, value: 'adaptive');
|
||||||
parent.target?.canvasModel.updateViewStyle();
|
parent.target?.canvasModel.updateViewStyle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -514,7 +538,7 @@ class CanvasModel with ChangeNotifier {
|
|||||||
double get scrollY => _scrollY;
|
double get scrollY => _scrollY;
|
||||||
|
|
||||||
updateViewStyle() async {
|
updateViewStyle() async {
|
||||||
final style = await bind.sessionGetOption(id: id, arg: 'view-style');
|
final style = await bind.sessionGetViewStyle(id: id);
|
||||||
if (style == null) {
|
if (style == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -540,7 +564,7 @@ class CanvasModel with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
updateScrollStyle() async {
|
updateScrollStyle() async {
|
||||||
final style = await bind.sessionGetOption(id: id, arg: 'scroll-style');
|
final style = await bind.sessionGetScrollStyle(id: id);
|
||||||
if (style == 'scrollbar') {
|
if (style == 'scrollbar') {
|
||||||
_scrollStyle = ScrollStyle.scrollbar;
|
_scrollStyle = ScrollStyle.scrollbar;
|
||||||
_scrollX = 0.0;
|
_scrollX = 0.0;
|
||||||
@ -572,7 +596,7 @@ class CanvasModel with ChangeNotifier {
|
|||||||
return parent.target?.ffiModel.display.height ?? defaultHeight;
|
return parent.target?.ffiModel.display.height ?? defaultHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
double get windowBorderWidth => stateGlobal.windowBorderWidth;
|
double get windowBorderWidth => stateGlobal.windowBorderWidth.value;
|
||||||
double get tabBarHeight => stateGlobal.tabBarHeight;
|
double get tabBarHeight => stateGlobal.tabBarHeight;
|
||||||
|
|
||||||
Size get size {
|
Size get size {
|
||||||
@ -675,6 +699,8 @@ class CursorData {
|
|||||||
final img2.Image? image;
|
final img2.Image? image;
|
||||||
double scale;
|
double scale;
|
||||||
Uint8List? data;
|
Uint8List? data;
|
||||||
|
final double hotxOrigin;
|
||||||
|
final double hotyOrigin;
|
||||||
double hotx;
|
double hotx;
|
||||||
double hoty;
|
double hoty;
|
||||||
final int width;
|
final int width;
|
||||||
@ -686,52 +712,129 @@ class CursorData {
|
|||||||
required this.image,
|
required this.image,
|
||||||
required this.scale,
|
required this.scale,
|
||||||
required this.data,
|
required this.data,
|
||||||
required this.hotx,
|
required this.hotxOrigin,
|
||||||
required this.hoty,
|
required this.hotyOrigin,
|
||||||
required this.width,
|
required this.width,
|
||||||
required this.height,
|
required this.height,
|
||||||
});
|
}) : hotx = hotxOrigin * scale,
|
||||||
|
hoty = hotxOrigin * scale;
|
||||||
|
|
||||||
int _doubleToInt(double v) => (v * 10e6).round().toInt();
|
int _doubleToInt(double v) => (v * 10e6).round().toInt();
|
||||||
|
|
||||||
double _checkUpdateScale(double scale) {
|
double _checkUpdateScale(double scale, bool shouldScale) {
|
||||||
// Update data if scale changed.
|
double oldScale = this.scale;
|
||||||
if (Platform.isWindows) {
|
if (!shouldScale) {
|
||||||
final tgtWidth = (width * scale).toInt();
|
scale = 1.0;
|
||||||
final tgtHeight = (width * scale).toInt();
|
} else {
|
||||||
if (tgtWidth < kMinCursorSize || tgtHeight < kMinCursorSize) {
|
// Update data if scale changed.
|
||||||
double sw = kMinCursorSize.toDouble() / width;
|
if (Platform.isWindows) {
|
||||||
double sh = kMinCursorSize.toDouble() / height;
|
final tgtWidth = (width * scale).toInt();
|
||||||
scale = sw < sh ? sh : sw;
|
final tgtHeight = (width * scale).toInt();
|
||||||
|
if (tgtWidth < kMinCursorSize || tgtHeight < kMinCursorSize) {
|
||||||
|
double sw = kMinCursorSize.toDouble() / width;
|
||||||
|
double sh = kMinCursorSize.toDouble() / height;
|
||||||
|
scale = sw < sh ? sh : sw;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (_doubleToInt(this.scale) != _doubleToInt(scale)) {
|
}
|
||||||
|
|
||||||
|
if (Platform.isWindows) {
|
||||||
|
if (_doubleToInt(oldScale) != _doubleToInt(scale)) {
|
||||||
data = img2
|
data = img2
|
||||||
.copyResize(
|
.copyResize(
|
||||||
image!,
|
image!,
|
||||||
width: (width * scale).toInt(),
|
width: (width * scale).toInt(),
|
||||||
height: (height * scale).toInt(),
|
height: (height * scale).toInt(),
|
||||||
|
interpolation: img2.Interpolation.average,
|
||||||
)
|
)
|
||||||
.getBytes(format: img2.Format.bgra);
|
.getBytes(format: img2.Format.bgra);
|
||||||
hotx = (width * scale) / 2;
|
|
||||||
hoty = (height * scale) / 2;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.scale = scale;
|
this.scale = scale;
|
||||||
|
hotx = hotxOrigin * scale;
|
||||||
|
hoty = hotyOrigin * scale;
|
||||||
return scale;
|
return scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
String updateGetKey(double scale) {
|
String updateGetKey(double scale, bool shouldScale) {
|
||||||
scale = _checkUpdateScale(scale);
|
scale = _checkUpdateScale(scale, shouldScale);
|
||||||
return '${peerId}_${id}_${_doubleToInt(width * scale)}_${_doubleToInt(height * scale)}';
|
return '${peerId}_${id}_${_doubleToInt(width * scale)}_${_doubleToInt(height * scale)}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const _forbiddenCursorPng =
|
||||||
|
'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAkZQTFRFAAAA2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4GWAwCAAAAAAAA2B4GAAAAMTExAAAAAAAA2B4G2B4G2B4GAAAAmZmZkZGRAQEBAAAA2B4G2B4G2B4G////oKCgAwMDag8D2B4G2B4G2B4Gra2tBgYGbg8D2B4G2B4Gubm5CQkJTwsCVgwC2B4GxcXFDg4OAAAAAAAA2B4G2B4Gz8/PFBQUAAAAAAAA2B4G2B4G2B4G2B4G2B4G2B4G2B4GDgIA2NjYGxsbAAAAAAAA2B4GFwMB4eHhIyMjAAAAAAAA2B4G6OjoLCwsAAAAAAAA2B4G2B4G2B4G2B4G2B4GCQEA4ODgv7+/iYmJY2NjAgICAAAA9PT0Ojo6AAAAAAAAAAAA+/v7SkpKhYWFr6+vAAAAAAAA8/PzOTk5ERER9fX1KCgoAAAAgYGBKioqAAAAAAAApqamlpaWAAAAAAAAAAAAAAAAAAAAAAAALi4u/v7+GRkZAAAAAAAAAAAAAAAAAAAAfn5+AAAAAAAAV1dXkJCQAAAAAAAAAQEBAAAAAAAAAAAA7Hz6BAAAAMJ0Uk5TAAIWEwEynNz6//fVkCAatP2fDUHs6cDD8d0mPfT5fiEskiIR584A0gejr3AZ+P4plfALf5ZiTL85a4ziD6697fzN3UYE4v/4TwrNHuT///tdRKZh///+1U/ZBv///yjb///eAVL//50Cocv//6oFBbPvpGZCbfT//7cIhv///8INM///zBEcWYSZmO7//////1P////ts/////8vBv//////gv//R/z///QQz9sevP///2waXhNO/+fc//8mev/5gAe2r90MAAAByUlEQVR4nGNggANGJmYWBpyAlY2dg5OTi5uHF6s0H78AJxRwCAphyguLgKRExcQlQLSkFLq8tAwnp6ycPNABjAqKQKNElVDllVU4OVVhVquJA81Q10BRoAkUUYbJa4Edoo0sr6PLqaePLG/AyWlohKTAmJPTBFnelAFoixmSAnNOTgsUeQZLTk4rJAXWnJw2EHlbiDyDPCenHZICe04HFrh+RydnBgYWPU5uJAWinJwucPNd3dw9GDw5Ob2QFHBzcnrD7ffx9fMPCOTkDEINhmC4+3x8Q0LDwlEDIoKTMzIKKg9SEBIdE8sZh6SAJZ6Tkx0qD1YQkpCYlIwclCng0AXLQxSEpKalZyCryATKZwkhKQjJzsnNQ1KQXwBUUVhUXBJYWgZREFJeUVmFpMKlWg+anmqgCkJq6+obkG1pLEBTENLU3NKKrIKhrb2js8u4G6Kgpze0r3/CRAZMAHbkpJDJU6ZMmTqtFbuC6TNmhsyaMnsOFlmwgrnzpsxfELJwEXZ5Bp/FS3yWLlsesmLlKuwKVk9Ys5Zh3foN0zduwq5g85atDAzbpqSGbN9RhV0FGOzctWH3lD14FOzdt3H/gQw8Cg4u2gQPAwBYDXXdIH+wqAAAAABJRU5ErkJggg==';
|
||||||
|
const _defaultCursorPng =
|
||||||
|
'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAFmSURBVFiF7dWxSlxREMbx34QFDRowYBchZSxSCWlMCOwD5FGEFHap06UI7KPsAyyEEIQFqxRaCqYTsqCJFsKkuAeRXb17wrqV918dztw55zszc2fo6Oh47MR/e3zO1/iAHWmznHKGQwx9ip/LEbCfazbsoY8j/JLOhcC6sCW9wsjEwJf483AC9nPNc1+lFRwI13d+l3rYFS799rFGxJMqARv2pBXh+72XQ7gWvklPS7TmMl9Ak/M+DqrENvxAv/guKKApuKPWl0/TROK4+LbSqzhuB+OZ3fRSeFPWY+Fkyn56Y29hfgTSpnQ+s98cvorVey66uPlNFxKwZOYLCGfCs5n9NMYVrsp6mvXSoFqpqYFDvMBkStgJJe93dZOwVXxbqUnBENulydSReqUrDhcX0PT2EXarBYS3GNXMhboinBgIl9K71kg0L3+PvyYGdVpruT2MwrF0iotiXfIwus0Dj+OOjo6Of+e7ab74RkpgAAAAAElFTkSuQmCC';
|
||||||
|
|
||||||
|
final preForbiddenCursor = PredefinedCursor(
|
||||||
|
png: _forbiddenCursorPng,
|
||||||
|
id: -2,
|
||||||
|
);
|
||||||
|
final preDefaultCursor = PredefinedCursor(
|
||||||
|
png: _defaultCursorPng,
|
||||||
|
id: -1,
|
||||||
|
hotxGetter: (double w) => w / 2,
|
||||||
|
hotyGetter: (double h) => h / 2,
|
||||||
|
);
|
||||||
|
|
||||||
|
class PredefinedCursor {
|
||||||
|
ui.Image? _image;
|
||||||
|
img2.Image? _image2;
|
||||||
|
CursorData? _cache;
|
||||||
|
String png;
|
||||||
|
int id;
|
||||||
|
double Function(double)? hotxGetter;
|
||||||
|
double Function(double)? hotyGetter;
|
||||||
|
|
||||||
|
PredefinedCursor(
|
||||||
|
{required this.png, required this.id, this.hotxGetter, this.hotyGetter}) {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
ui.Image? get image => _image;
|
||||||
|
CursorData? get cache => _cache;
|
||||||
|
|
||||||
|
init() {
|
||||||
|
_image2 = img2.decodePng(base64Decode(png));
|
||||||
|
if (_image2 != null) {
|
||||||
|
() async {
|
||||||
|
final defaultImg = _image2!;
|
||||||
|
// This function is called only one time, no need to care about the performance.
|
||||||
|
Uint8List data = defaultImg.getBytes(format: img2.Format.rgba);
|
||||||
|
_image = await img.decodeImageFromPixels(
|
||||||
|
data, defaultImg.width, defaultImg.height, ui.PixelFormat.rgba8888);
|
||||||
|
|
||||||
|
double scale = 1.0;
|
||||||
|
if (Platform.isWindows) {
|
||||||
|
data = _image2!.getBytes(format: img2.Format.bgra);
|
||||||
|
} else {
|
||||||
|
data = Uint8List.fromList(img2.encodePng(_image2!));
|
||||||
|
}
|
||||||
|
|
||||||
|
_cache = CursorData(
|
||||||
|
peerId: '',
|
||||||
|
id: id,
|
||||||
|
image: _image2?.clone(),
|
||||||
|
scale: scale,
|
||||||
|
data: data,
|
||||||
|
hotxOrigin:
|
||||||
|
hotxGetter != null ? hotxGetter!(_image2!.width.toDouble()) : 0,
|
||||||
|
hotyOrigin:
|
||||||
|
hotyGetter != null ? hotyGetter!(_image2!.height.toDouble()) : 0,
|
||||||
|
width: _image2!.width,
|
||||||
|
height: _image2!.height,
|
||||||
|
);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class CursorModel with ChangeNotifier {
|
class CursorModel with ChangeNotifier {
|
||||||
ui.Image? _image;
|
ui.Image? _image;
|
||||||
final _images = <int, Tuple3<ui.Image, double, double>>{};
|
final _images = <int, Tuple3<ui.Image, double, double>>{};
|
||||||
CursorData? _cache;
|
CursorData? _cache;
|
||||||
final _defaultCacheId = -1;
|
|
||||||
CursorData? _defaultCache;
|
|
||||||
final _cacheMap = <int, CursorData>{};
|
final _cacheMap = <int, CursorData>{};
|
||||||
final _cacheKeys = <String>{};
|
final _cacheKeys = <String>{};
|
||||||
double _x = -10000;
|
double _x = -10000;
|
||||||
@ -740,15 +843,14 @@ class CursorModel with ChangeNotifier {
|
|||||||
double _hoty = 0;
|
double _hoty = 0;
|
||||||
double _displayOriginX = 0;
|
double _displayOriginX = 0;
|
||||||
double _displayOriginY = 0;
|
double _displayOriginY = 0;
|
||||||
bool got_mouse_control = true;
|
bool gotMouseControl = true;
|
||||||
DateTime _last_peer_mouse = DateTime.now()
|
DateTime _lastPeerMouse = DateTime.now()
|
||||||
.subtract(Duration(milliseconds: 2 * kMouseControlTimeoutMSec));
|
.subtract(Duration(milliseconds: 2 * kMouseControlTimeoutMSec));
|
||||||
String id = '';
|
String id = '';
|
||||||
WeakReference<FFI> parent;
|
WeakReference<FFI> parent;
|
||||||
|
|
||||||
ui.Image? get image => _image;
|
ui.Image? get image => _image;
|
||||||
CursorData? get cache => _cache;
|
CursorData? get cache => _cache;
|
||||||
CursorData? get defaultCache => _getDefaultCache();
|
|
||||||
|
|
||||||
double get x => _x - _displayOriginX;
|
double get x => _x - _displayOriginX;
|
||||||
double get y => _y - _displayOriginY;
|
double get y => _y - _displayOriginY;
|
||||||
@ -758,8 +860,8 @@ class CursorModel with ChangeNotifier {
|
|||||||
double get hotx => _hotx;
|
double get hotx => _hotx;
|
||||||
double get hoty => _hoty;
|
double get hoty => _hoty;
|
||||||
|
|
||||||
bool get is_peer_control_protected =>
|
bool get isPeerControlProtected =>
|
||||||
DateTime.now().difference(_last_peer_mouse).inMilliseconds <
|
DateTime.now().difference(_lastPeerMouse).inMilliseconds <
|
||||||
kMouseControlTimeoutMSec;
|
kMouseControlTimeoutMSec;
|
||||||
|
|
||||||
CursorModel(this.parent);
|
CursorModel(this.parent);
|
||||||
@ -767,29 +869,6 @@ class CursorModel with ChangeNotifier {
|
|||||||
Set<String> get cachedKeys => _cacheKeys;
|
Set<String> get cachedKeys => _cacheKeys;
|
||||||
addKey(String key) => _cacheKeys.add(key);
|
addKey(String key) => _cacheKeys.add(key);
|
||||||
|
|
||||||
CursorData? _getDefaultCache() {
|
|
||||||
if (_defaultCache == null) {
|
|
||||||
if (Platform.isWindows) {
|
|
||||||
Uint8List data = defaultCursorImage!.getBytes(format: img2.Format.bgra);
|
|
||||||
_hotx = defaultCursorImage!.width / 2;
|
|
||||||
_hoty = defaultCursorImage!.height / 2;
|
|
||||||
|
|
||||||
_defaultCache = CursorData(
|
|
||||||
peerId: id,
|
|
||||||
id: _defaultCacheId,
|
|
||||||
image: defaultCursorImage?.clone(),
|
|
||||||
scale: 1.0,
|
|
||||||
data: data,
|
|
||||||
hotx: _hotx,
|
|
||||||
hoty: _hoty,
|
|
||||||
width: defaultCursorImage!.width,
|
|
||||||
height: defaultCursorImage!.height,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return _defaultCache;
|
|
||||||
}
|
|
||||||
|
|
||||||
// remote physical display coordinate
|
// remote physical display coordinate
|
||||||
Rect getVisibleRect() {
|
Rect getVisibleRect() {
|
||||||
final size = MediaQueryData.fromWindow(ui.window).size;
|
final size = MediaQueryData.fromWindow(ui.window).size;
|
||||||
@ -917,59 +996,51 @@ class CursorModel with ChangeNotifier {
|
|||||||
var height = int.parse(evt['height']);
|
var height = int.parse(evt['height']);
|
||||||
List<dynamic> colors = json.decode(evt['colors']);
|
List<dynamic> colors = json.decode(evt['colors']);
|
||||||
final rgba = Uint8List.fromList(colors.map((s) => s as int).toList());
|
final rgba = Uint8List.fromList(colors.map((s) => s as int).toList());
|
||||||
var pid = parent.target?.id;
|
|
||||||
final image = await img.decodeImageFromPixels(
|
final image = await img.decodeImageFromPixels(
|
||||||
rgba, width, height, ui.PixelFormat.rgba8888);
|
rgba, width, height, ui.PixelFormat.rgba8888);
|
||||||
if (parent.target?.id != pid) return;
|
|
||||||
_image = image;
|
_image = image;
|
||||||
_images[id] = Tuple3(image, _hotx, _hoty);
|
if (await _updateCache(rgba, image, id, width, height)) {
|
||||||
await _updateCache(image, id, width, height);
|
_images[id] = Tuple3(image, _hotx, _hoty);
|
||||||
|
} else {
|
||||||
|
_hotx = 0;
|
||||||
|
_hoty = 0;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
// my throw exception, because the listener maybe already dispose
|
// my throw exception, because the listener maybe already dispose
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
debugPrint('notify cursor: $e');
|
debugPrint('WARNING: updateCursorId $id, without notifyListeners(). $e');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateCache(ui.Image image, int id, int w, int h) async {
|
Future<bool> _updateCache(
|
||||||
|
Uint8List rgba, ui.Image image, int id, int w, int h) async {
|
||||||
Uint8List? data;
|
Uint8List? data;
|
||||||
img2.Image? image2;
|
img2.Image? imgOrigin;
|
||||||
if (Platform.isWindows) {
|
if (Platform.isWindows) {
|
||||||
ByteData? data2 =
|
imgOrigin = img2.Image.fromBytes(w, h, rgba, format: img2.Format.rgba);
|
||||||
await image.toByteData(format: ui.ImageByteFormat.rawRgba);
|
data = imgOrigin.getBytes(format: img2.Format.bgra);
|
||||||
if (data2 != null) {
|
|
||||||
data = data2.buffer.asUint8List();
|
|
||||||
image2 = img2.Image.fromBytes(w, h, data);
|
|
||||||
} else {
|
|
||||||
data = defaultCursorImage?.getBytes(format: img2.Format.bgra);
|
|
||||||
image2 = defaultCursorImage?.clone();
|
|
||||||
_hotx = defaultCursorImage!.width / 2;
|
|
||||||
_hoty = defaultCursorImage!.height / 2;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
ByteData? data2 = await image.toByteData(format: ui.ImageByteFormat.png);
|
ByteData? imgBytes =
|
||||||
if (data2 != null) {
|
await image.toByteData(format: ui.ImageByteFormat.png);
|
||||||
data = data2.buffer.asUint8List();
|
if (imgBytes == null) {
|
||||||
} else {
|
return false;
|
||||||
data = Uint8List.fromList(img2.encodePng(defaultCursorImage!));
|
|
||||||
_hotx = defaultCursorImage!.width / 2;
|
|
||||||
_hoty = defaultCursorImage!.height / 2;
|
|
||||||
}
|
}
|
||||||
|
data = imgBytes.buffer.asUint8List();
|
||||||
}
|
}
|
||||||
|
|
||||||
_cache = CursorData(
|
_cache = CursorData(
|
||||||
peerId: this.id,
|
peerId: this.id,
|
||||||
id: id,
|
id: id,
|
||||||
image: image2,
|
image: imgOrigin,
|
||||||
scale: 1.0,
|
scale: 1.0,
|
||||||
data: data,
|
data: data,
|
||||||
hotx: _hotx,
|
hotxOrigin: _hotx,
|
||||||
hoty: _hoty,
|
hotyOrigin: _hoty,
|
||||||
width: w,
|
width: w,
|
||||||
height: h,
|
height: h,
|
||||||
);
|
);
|
||||||
_cacheMap[id] = _cache!;
|
_cacheMap[id] = _cache!;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateCursorId(Map<String, dynamic> evt) async {
|
updateCursorId(Map<String, dynamic> evt) async {
|
||||||
@ -981,13 +1052,16 @@ class CursorModel with ChangeNotifier {
|
|||||||
_hotx = tmp.item2;
|
_hotx = tmp.item2;
|
||||||
_hoty = tmp.item3;
|
_hoty = tmp.item3;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
} else {
|
||||||
|
debugPrint(
|
||||||
|
'WARNING: updateCursorId $id, cache is ${_cache == null ? "null" : "not null"}. without notifyListeners()');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Update the cursor position.
|
/// Update the cursor position.
|
||||||
updateCursorPosition(Map<String, dynamic> evt, String id) async {
|
updateCursorPosition(Map<String, dynamic> evt, String id) async {
|
||||||
got_mouse_control = false;
|
gotMouseControl = false;
|
||||||
_last_peer_mouse = DateTime.now();
|
_lastPeerMouse = DateTime.now();
|
||||||
_x = double.parse(evt['x']);
|
_x = double.parse(evt['x']);
|
||||||
_y = double.parse(evt['y']);
|
_y = double.parse(evt['y']);
|
||||||
try {
|
try {
|
||||||
@ -1035,15 +1109,6 @@ class CursorModel with ChangeNotifier {
|
|||||||
customCursorController.freeCache(k);
|
customCursorController.freeCache(k);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Uint8List? cachedForbidmemoryCursorData;
|
|
||||||
void updateForbiddenCursorBuffer() {
|
|
||||||
cachedForbidmemoryCursorData ??= base64Decode(
|
|
||||||
'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAkZQTFRFAAAA2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4G2B4GWAwCAAAAAAAA2B4GAAAAMTExAAAAAAAA2B4G2B4G2B4GAAAAmZmZkZGRAQEBAAAA2B4G2B4G2B4G////oKCgAwMDag8D2B4G2B4G2B4Gra2tBgYGbg8D2B4G2B4Gubm5CQkJTwsCVgwC2B4GxcXFDg4OAAAAAAAA2B4G2B4Gz8/PFBQUAAAAAAAA2B4G2B4G2B4G2B4G2B4G2B4G2B4GDgIA2NjYGxsbAAAAAAAA2B4GFwMB4eHhIyMjAAAAAAAA2B4G6OjoLCwsAAAAAAAA2B4G2B4G2B4G2B4G2B4GCQEA4ODgv7+/iYmJY2NjAgICAAAA9PT0Ojo6AAAAAAAAAAAA+/v7SkpKhYWFr6+vAAAAAAAA8/PzOTk5ERER9fX1KCgoAAAAgYGBKioqAAAAAAAApqamlpaWAAAAAAAAAAAAAAAAAAAAAAAALi4u/v7+GRkZAAAAAAAAAAAAAAAAAAAAfn5+AAAAAAAAV1dXkJCQAAAAAAAAAQEBAAAAAAAAAAAA7Hz6BAAAAMJ0Uk5TAAIWEwEynNz6//fVkCAatP2fDUHs6cDD8d0mPfT5fiEskiIR584A0gejr3AZ+P4plfALf5ZiTL85a4ziD6697fzN3UYE4v/4TwrNHuT///tdRKZh///+1U/ZBv///yjb///eAVL//50Cocv//6oFBbPvpGZCbfT//7cIhv///8INM///zBEcWYSZmO7//////1P////ts/////8vBv//////gv//R/z///QQz9sevP///2waXhNO/+fc//8mev/5gAe2r90MAAAByUlEQVR4nGNggANGJmYWBpyAlY2dg5OTi5uHF6s0H78AJxRwCAphyguLgKRExcQlQLSkFLq8tAwnp6ycPNABjAqKQKNElVDllVU4OVVhVquJA81Q10BRoAkUUYbJa4Edoo0sr6PLqaePLG/AyWlohKTAmJPTBFnelAFoixmSAnNOTgsUeQZLTk4rJAXWnJw2EHlbiDyDPCenHZICe04HFrh+RydnBgYWPU5uJAWinJwucPNd3dw9GDw5Ob2QFHBzcnrD7ffx9fMPCOTkDEINhmC4+3x8Q0LDwlEDIoKTMzIKKg9SEBIdE8sZh6SAJZ6Tkx0qD1YQkpCYlIwclCng0AXLQxSEpKalZyCryATKZwkhKQjJzsnNQ1KQXwBUUVhUXBJYWgZREFJeUVmFpMKlWg+anmqgCkJq6+obkG1pLEBTENLU3NKKrIKhrb2js8u4G6Kgpze0r3/CRAZMAHbkpJDJU6ZMmTqtFbuC6TNmhsyaMnsOFlmwgrnzpsxfELJwEXZ5Bp/FS3yWLlsesmLlKuwKVk9Ys5Zh3foN0zduwq5g85atDAzbpqSGbN9RhV0FGOzctWH3lD14FOzdt3H/gQw8Cg4u2gQPAwBYDXXdIH+wqAAAAABJRU5ErkJggg==');
|
|
||||||
}
|
|
||||||
|
|
||||||
img2.Image? defaultCursorImage = img2.decodePng(base64Decode(
|
|
||||||
'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAFmSURBVFiF7dWxSlxREMbx34QFDRowYBchZSxSCWlMCOwD5FGEFHap06UI7KPsAyyEEIQFqxRaCqYTsqCJFsKkuAeRXb17wrqV918dztw55zszc2fo6Oh47MR/e3zO1/iAHWmznHKGQwx9ip/LEbCfazbsoY8j/JLOhcC6sCW9wsjEwJf483AC9nPNc1+lFRwI13d+l3rYFS799rFGxJMqARv2pBXh+72XQ7gWvklPS7TmMl9Ak/M+DqrENvxAv/guKKApuKPWl0/TROK4+LbSqzhuB+OZ3fRSeFPWY+Fkyn56Y29hfgTSpnQ+s98cvorVey66uPlNFxKwZOYLCGfCs5n9NMYVrsp6mvXSoFqpqYFDvMBkStgJJe93dZOwVXxbqUnBENulydSReqUrDhcX0PT2EXarBYS3GNXMhboinBgIl9K71kg0L3+PvyYGdVpruT2MwrF0iotiXfIwus0Dj+OOjo6Of+e7ab74RkpgAAAAAElFTkSuQmCC'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class QualityMonitorData {
|
class QualityMonitorData {
|
||||||
@ -1219,7 +1284,7 @@ class FFI {
|
|||||||
Future<void> close() async {
|
Future<void> close() async {
|
||||||
chatModel.close();
|
chatModel.close();
|
||||||
if (imageModel.image != null && !isWebDesktop) {
|
if (imageModel.image != null && !isWebDesktop) {
|
||||||
await savePreference(id, cursorModel.x, cursorModel.y, canvasModel.x,
|
await setCanvasConfig(id, cursorModel.x, cursorModel.y, canvasModel.x,
|
||||||
canvasModel.y, canvasModel.scale, ffiModel.pi.currentDisplay);
|
canvasModel.y, canvasModel.scale, ffiModel.pi.currentDisplay);
|
||||||
}
|
}
|
||||||
bind.sessionClose(id: id);
|
bind.sessionClose(id: id);
|
||||||
@ -1267,9 +1332,10 @@ class PeerInfo {
|
|||||||
List<Display> displays = [];
|
List<Display> displays = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> savePreference(String id, double xCursor, double yCursor,
|
const canvasKey = 'canvas';
|
||||||
|
|
||||||
|
Future<void> setCanvasConfig(String id, double xCursor, double yCursor,
|
||||||
double xCanvas, double yCanvas, double scale, int currentDisplay) async {
|
double xCanvas, double yCanvas, double scale, int currentDisplay) async {
|
||||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
|
||||||
final p = <String, dynamic>{};
|
final p = <String, dynamic>{};
|
||||||
p['xCursor'] = xCursor;
|
p['xCursor'] = xCursor;
|
||||||
p['yCursor'] = yCursor;
|
p['yCursor'] = yCursor;
|
||||||
@ -1277,25 +1343,27 @@ Future<void> savePreference(String id, double xCursor, double yCursor,
|
|||||||
p['yCanvas'] = yCanvas;
|
p['yCanvas'] = yCanvas;
|
||||||
p['scale'] = scale;
|
p['scale'] = scale;
|
||||||
p['currentDisplay'] = currentDisplay;
|
p['currentDisplay'] = currentDisplay;
|
||||||
prefs.setString('peer$id', json.encode(p));
|
await bind.sessionSetFlutterConfig(id: id, k: canvasKey, v: jsonEncode(p));
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Map<String, dynamic>?> getPreference(String id) async {
|
Future<Map<String, dynamic>?> getCanvasConfig(String id) async {
|
||||||
if (!isWebDesktop) return null;
|
if (!isWebDesktop) return null;
|
||||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
var p = await bind.sessionGetFlutterConfig(id: id, k: canvasKey);
|
||||||
var p = prefs.getString('peer$id');
|
if (p == null || p.isEmpty) return null;
|
||||||
if (p == null) return null;
|
try {
|
||||||
Map<String, dynamic> m = json.decode(p);
|
Map<String, dynamic> m = json.decode(p);
|
||||||
return m;
|
return m;
|
||||||
|
} catch (e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void removePreference(String id) async {
|
void removePreference(String id) async {
|
||||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
await bind.sessionSetFlutterConfig(id: id, k: canvasKey, v: '');
|
||||||
prefs.remove('peer$id');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> initializeCursorAndCanvas(FFI ffi) async {
|
Future<void> initializeCursorAndCanvas(FFI ffi) async {
|
||||||
var p = await getPreference(ffi.id);
|
var p = await getCanvasConfig(ffi.id);
|
||||||
int currentDisplay = 0;
|
int currentDisplay = 0;
|
||||||
if (p != null) {
|
if (p != null) {
|
||||||
currentDisplay = p['currentDisplay'];
|
currentDisplay = p['currentDisplay'];
|
||||||
|
|||||||
@ -97,7 +97,7 @@ class PlatformFFI {
|
|||||||
: Platform.isWindows
|
: Platform.isWindows
|
||||||
? DynamicLibrary.open('librustdesk.dll')
|
? DynamicLibrary.open('librustdesk.dll')
|
||||||
: Platform.isMacOS
|
: Platform.isMacOS
|
||||||
? DynamicLibrary.open('librustdesk.dylib')
|
? DynamicLibrary.open("liblibrustdesk.dylib")
|
||||||
: DynamicLibrary.process();
|
: DynamicLibrary.process();
|
||||||
debugPrint('initializing FFI $_appType');
|
debugPrint('initializing FFI $_appType');
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import 'dart:convert';
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_hbb/main.dart';
|
||||||
import 'package:flutter_hbb/models/platform_model.dart';
|
import 'package:flutter_hbb/models/platform_model.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:wakelock/wakelock.dart';
|
import 'package:wakelock/wakelock.dart';
|
||||||
@ -27,13 +28,17 @@ class ServerModel with ChangeNotifier {
|
|||||||
bool _inputOk = false;
|
bool _inputOk = false;
|
||||||
bool _audioOk = false;
|
bool _audioOk = false;
|
||||||
bool _fileOk = false;
|
bool _fileOk = false;
|
||||||
|
bool _showElevation = true;
|
||||||
|
bool _hideCm = false;
|
||||||
int _connectStatus = 0; // Rendezvous Server status
|
int _connectStatus = 0; // Rendezvous Server status
|
||||||
String _verificationMethod = "";
|
String _verificationMethod = "";
|
||||||
String _temporaryPasswordLength = "";
|
String _temporaryPasswordLength = "";
|
||||||
|
String _approveMode = "";
|
||||||
|
|
||||||
late String _emptyIdShow;
|
late String _emptyIdShow;
|
||||||
late final IDTextEditingController _serverId;
|
late final IDTextEditingController _serverId;
|
||||||
final _serverPasswd = TextEditingController(text: "");
|
final _serverPasswd =
|
||||||
|
TextEditingController(text: translate("Generating ..."));
|
||||||
|
|
||||||
final tabController = DesktopTabController(tabType: DesktopTabType.cm);
|
final tabController = DesktopTabController(tabType: DesktopTabType.cm);
|
||||||
|
|
||||||
@ -51,6 +56,10 @@ class ServerModel with ChangeNotifier {
|
|||||||
|
|
||||||
bool get fileOk => _fileOk;
|
bool get fileOk => _fileOk;
|
||||||
|
|
||||||
|
bool get showElevation => _showElevation;
|
||||||
|
|
||||||
|
bool get hideCm => _hideCm;
|
||||||
|
|
||||||
int get connectStatus => _connectStatus;
|
int get connectStatus => _connectStatus;
|
||||||
|
|
||||||
String get verificationMethod {
|
String get verificationMethod {
|
||||||
@ -65,8 +74,14 @@ class ServerModel with ChangeNotifier {
|
|||||||
return _verificationMethod;
|
return _verificationMethod;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String get approveMode => _approveMode;
|
||||||
|
|
||||||
setVerificationMethod(String method) async {
|
setVerificationMethod(String method) async {
|
||||||
await bind.mainSetOption(key: "verification-method", value: method);
|
await bind.mainSetOption(key: "verification-method", value: method);
|
||||||
|
if (method != kUsePermanentPassword) {
|
||||||
|
await bind.mainSetOption(
|
||||||
|
key: 'allow-hide-cm', value: bool2option('allow-hide-cm', false));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String get temporaryPasswordLength {
|
String get temporaryPasswordLength {
|
||||||
@ -81,6 +96,14 @@ class ServerModel with ChangeNotifier {
|
|||||||
await bind.mainSetOption(key: "temporary-password-length", value: length);
|
await bind.mainSetOption(key: "temporary-password-length", value: length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setApproveMode(String mode) async {
|
||||||
|
await bind.mainSetOption(key: 'approve-mode', value: mode);
|
||||||
|
if (mode != 'password') {
|
||||||
|
await bind.mainSetOption(
|
||||||
|
key: 'allow-hide-cm', value: bool2option('allow-hide-cm', false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TextEditingController get serverId => _serverId;
|
TextEditingController get serverId => _serverId;
|
||||||
|
|
||||||
TextEditingController get serverPasswd => _serverPasswd;
|
TextEditingController get serverPasswd => _serverPasswd;
|
||||||
@ -95,8 +118,7 @@ class ServerModel with ChangeNotifier {
|
|||||||
_emptyIdShow = translate("Generating ...");
|
_emptyIdShow = translate("Generating ...");
|
||||||
_serverId = IDTextEditingController(text: _emptyIdShow);
|
_serverId = IDTextEditingController(text: _emptyIdShow);
|
||||||
|
|
||||||
Timer.periodic(Duration(seconds: 1), (timer) async {
|
timerCallback() async {
|
||||||
if (isTest) return timer.cancel();
|
|
||||||
var status = await bind.mainGetOnlineStatue();
|
var status = await bind.mainGetOnlineStatue();
|
||||||
if (status > 0) {
|
if (status > 0) {
|
||||||
status = 1;
|
status = 1;
|
||||||
@ -112,7 +134,18 @@ class ServerModel with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
updatePasswordModel();
|
updatePasswordModel();
|
||||||
});
|
}
|
||||||
|
|
||||||
|
if (!isTest) {
|
||||||
|
Future.delayed(Duration.zero, () async {
|
||||||
|
if (await bind.optionSynced()) {
|
||||||
|
await timerCallback();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Timer.periodic(Duration(milliseconds: 500), (timer) async {
|
||||||
|
await timerCallback();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 1. check android permission
|
/// 1. check android permission
|
||||||
@ -148,11 +181,24 @@ class ServerModel with ChangeNotifier {
|
|||||||
await bind.mainGetOption(key: "verification-method");
|
await bind.mainGetOption(key: "verification-method");
|
||||||
final temporaryPasswordLength =
|
final temporaryPasswordLength =
|
||||||
await bind.mainGetOption(key: "temporary-password-length");
|
await bind.mainGetOption(key: "temporary-password-length");
|
||||||
|
final approveMode = await bind.mainGetOption(key: 'approve-mode');
|
||||||
|
var hideCm = option2bool(
|
||||||
|
'allow-hide-cm', await bind.mainGetOption(key: 'allow-hide-cm'));
|
||||||
|
if (!(approveMode == 'password' &&
|
||||||
|
verificationMethod == kUsePermanentPassword)) {
|
||||||
|
hideCm = false;
|
||||||
|
}
|
||||||
|
if (_approveMode != approveMode) {
|
||||||
|
_approveMode = approveMode;
|
||||||
|
update = true;
|
||||||
|
}
|
||||||
final oldPwdText = _serverPasswd.text;
|
final oldPwdText = _serverPasswd.text;
|
||||||
if (_serverPasswd.text != temporaryPassword) {
|
if (_serverPasswd.text != temporaryPassword &&
|
||||||
|
temporaryPassword.isNotEmpty) {
|
||||||
_serverPasswd.text = temporaryPassword;
|
_serverPasswd.text = temporaryPassword;
|
||||||
}
|
}
|
||||||
if (verificationMethod == kUsePermanentPassword) {
|
if (verificationMethod == kUsePermanentPassword ||
|
||||||
|
_approveMode == 'click') {
|
||||||
_serverPasswd.text = '-';
|
_serverPasswd.text = '-';
|
||||||
}
|
}
|
||||||
if (oldPwdText != _serverPasswd.text) {
|
if (oldPwdText != _serverPasswd.text) {
|
||||||
@ -166,6 +212,17 @@ class ServerModel with ChangeNotifier {
|
|||||||
_temporaryPasswordLength = temporaryPasswordLength;
|
_temporaryPasswordLength = temporaryPasswordLength;
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
|
if (_hideCm != hideCm) {
|
||||||
|
_hideCm = hideCm;
|
||||||
|
if (desktopType == DesktopType.cm) {
|
||||||
|
if (hideCm) {
|
||||||
|
hideCmWindow();
|
||||||
|
} else {
|
||||||
|
showCmWindow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
update = true;
|
||||||
|
}
|
||||||
if (update) {
|
if (update) {
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
@ -412,11 +469,11 @@ class ServerModel with ChangeNotifier {
|
|||||||
},
|
},
|
||||||
page: desktop.buildConnectionCard(client)));
|
page: desktop.buildConnectionCard(client)));
|
||||||
Future.delayed(Duration.zero, () async {
|
Future.delayed(Duration.zero, () async {
|
||||||
window_on_top(null);
|
if (!hideCm) window_on_top(null);
|
||||||
});
|
});
|
||||||
if (client.authorized) {
|
if (client.authorized) {
|
||||||
cmHiddenTimer = Timer(const Duration(seconds: 3), () {
|
cmHiddenTimer = Timer(const Duration(seconds: 3), () {
|
||||||
windowManager.minimize();
|
if (!hideCm) windowManager.minimize();
|
||||||
cmHiddenTimer = null;
|
cmHiddenTimer = null;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -530,6 +587,13 @@ class ServerModel with ChangeNotifier {
|
|||||||
final index = _clients.indexWhere((client) => client.id == id);
|
final index = _clients.indexWhere((client) => client.id == id);
|
||||||
tabController.jumpTo(index);
|
tabController.jumpTo(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setShowElevation(bool show) {
|
||||||
|
if (_showElevation != show) {
|
||||||
|
_showElevation = show;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Client {
|
class Client {
|
||||||
|
|||||||
@ -1,4 +1,7 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:desktop_multi_window/desktop_multi_window.dart';
|
import 'package:desktop_multi_window/desktop_multi_window.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
import '../consts.dart';
|
import '../consts.dart';
|
||||||
@ -7,14 +10,16 @@ class StateGlobal {
|
|||||||
int _windowId = -1;
|
int _windowId = -1;
|
||||||
bool _fullscreen = false;
|
bool _fullscreen = false;
|
||||||
final RxBool _showTabBar = true.obs;
|
final RxBool _showTabBar = true.obs;
|
||||||
final RxDouble _resizeEdgeSize = 8.0.obs;
|
final RxDouble _resizeEdgeSize = RxDouble(kWindowEdgeSize);
|
||||||
|
final RxDouble _windowBorderWidth = RxDouble(kWindowBorderWidth);
|
||||||
|
final RxBool showRemoteMenuBar = false.obs;
|
||||||
|
|
||||||
int get windowId => _windowId;
|
int get windowId => _windowId;
|
||||||
bool get fullscreen => _fullscreen;
|
bool get fullscreen => _fullscreen;
|
||||||
double get tabBarHeight => fullscreen ? 0 : kDesktopRemoteTabBarHeight;
|
double get tabBarHeight => fullscreen ? 0 : kDesktopRemoteTabBarHeight;
|
||||||
double get windowBorderWidth => fullscreen ? 0 : kWindowBorderWidth;
|
|
||||||
RxBool get showTabBar => _showTabBar;
|
RxBool get showTabBar => _showTabBar;
|
||||||
RxDouble get resizeEdgeSize => _resizeEdgeSize;
|
RxDouble get resizeEdgeSize => _resizeEdgeSize;
|
||||||
|
RxDouble get windowBorderWidth => _windowBorderWidth;
|
||||||
|
|
||||||
setWindowId(int id) => _windowId = id;
|
setWindowId(int id) => _windowId = id;
|
||||||
setFullscreen(bool v) {
|
setFullscreen(bool v) {
|
||||||
@ -23,7 +28,21 @@ class StateGlobal {
|
|||||||
_showTabBar.value = !_fullscreen;
|
_showTabBar.value = !_fullscreen;
|
||||||
_resizeEdgeSize.value =
|
_resizeEdgeSize.value =
|
||||||
fullscreen ? kFullScreenEdgeSize : kWindowEdgeSize;
|
fullscreen ? kFullScreenEdgeSize : kWindowEdgeSize;
|
||||||
WindowController.fromWindowId(windowId).setFullscreen(_fullscreen);
|
_windowBorderWidth.value = fullscreen ? 0 : kWindowBorderWidth;
|
||||||
|
WindowController.fromWindowId(windowId)
|
||||||
|
.setFullscreen(_fullscreen)
|
||||||
|
.then((_) {
|
||||||
|
// https://github.com/leanflutter/window_manager/issues/131#issuecomment-1111587982
|
||||||
|
if (Platform.isWindows && !v) {
|
||||||
|
Future.delayed(Duration.zero, () async {
|
||||||
|
final frame =
|
||||||
|
await WindowController.fromWindowId(windowId).getFrame();
|
||||||
|
final newRect = Rect.fromLTWH(
|
||||||
|
frame.left, frame.top, frame.width + 1, frame.height + 1);
|
||||||
|
await WindowController.fromWindowId(windowId).setFrame(newRect);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -19,7 +19,7 @@ class UserModel {
|
|||||||
|
|
||||||
void refreshCurrentUser() async {
|
void refreshCurrentUser() async {
|
||||||
await getUserName();
|
await getUserName();
|
||||||
final token = await bind.mainGetLocalOption(key: 'access_token');
|
final token = bind.mainGetLocalOption(key: 'access_token');
|
||||||
if (token == '') return;
|
if (token == '') return;
|
||||||
final url = await bind.mainGetApiServer();
|
final url = await bind.mainGetApiServer();
|
||||||
final body = {
|
final body = {
|
||||||
@ -73,7 +73,7 @@ class UserModel {
|
|||||||
if (userName.isNotEmpty) {
|
if (userName.isNotEmpty) {
|
||||||
return userName.value;
|
return userName.value;
|
||||||
}
|
}
|
||||||
final userInfo = await bind.mainGetLocalOption(key: 'user_info');
|
final userInfo = bind.mainGetLocalOption(key: 'user_info');
|
||||||
if (userInfo.trim().isEmpty) {
|
if (userInfo.trim().isEmpty) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,19 +17,21 @@ PODS:
|
|||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- screen_retriever (0.0.1):
|
- screen_retriever (0.0.1):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- shared_preferences_macos (0.0.1):
|
|
||||||
- FlutterMacOS
|
|
||||||
- sqflite (0.0.2):
|
- sqflite (0.0.2):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- FMDB (>= 2.7.5)
|
- FMDB (>= 2.7.5)
|
||||||
- tray_manager (0.0.1):
|
- tray_manager (0.0.1):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
|
- uni_links_desktop (0.0.1):
|
||||||
|
- FlutterMacOS
|
||||||
- url_launcher_macos (0.0.1):
|
- url_launcher_macos (0.0.1):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- wakelock_macos (0.0.1):
|
- wakelock_macos (0.0.1):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- window_manager (0.2.0):
|
- window_manager (0.2.0):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
|
- window_size (0.0.2):
|
||||||
|
- FlutterMacOS
|
||||||
|
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`)
|
- desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`)
|
||||||
@ -40,12 +42,13 @@ DEPENDENCIES:
|
|||||||
- package_info_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus_macos/macos`)
|
- package_info_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus_macos/macos`)
|
||||||
- path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`)
|
- path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`)
|
||||||
- screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`)
|
- screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`)
|
||||||
- shared_preferences_macos (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_macos/macos`)
|
|
||||||
- sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`)
|
- sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`)
|
||||||
- tray_manager (from `Flutter/ephemeral/.symlinks/plugins/tray_manager/macos`)
|
- tray_manager (from `Flutter/ephemeral/.symlinks/plugins/tray_manager/macos`)
|
||||||
|
- uni_links_desktop (from `Flutter/ephemeral/.symlinks/plugins/uni_links_desktop/macos`)
|
||||||
- url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
|
- url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
|
||||||
- wakelock_macos (from `Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos`)
|
- wakelock_macos (from `Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos`)
|
||||||
- window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`)
|
- window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`)
|
||||||
|
- window_size (from `Flutter/ephemeral/.symlinks/plugins/window_size/macos`)
|
||||||
|
|
||||||
SPEC REPOS:
|
SPEC REPOS:
|
||||||
trunk:
|
trunk:
|
||||||
@ -68,35 +71,38 @@ EXTERNAL SOURCES:
|
|||||||
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos
|
||||||
screen_retriever:
|
screen_retriever:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos
|
||||||
shared_preferences_macos:
|
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_macos/macos
|
|
||||||
sqflite:
|
sqflite:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos
|
||||||
tray_manager:
|
tray_manager:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/tray_manager/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/tray_manager/macos
|
||||||
|
uni_links_desktop:
|
||||||
|
:path: Flutter/ephemeral/.symlinks/plugins/uni_links_desktop/macos
|
||||||
url_launcher_macos:
|
url_launcher_macos:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
|
||||||
wakelock_macos:
|
wakelock_macos:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos
|
||||||
window_manager:
|
window_manager:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos
|
||||||
|
window_size:
|
||||||
|
:path: Flutter/ephemeral/.symlinks/plugins/window_size/macos
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898
|
desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898
|
||||||
desktop_multi_window: 566489c048b501134f9d7fb6a2354c60a9126486
|
desktop_multi_window: 566489c048b501134f9d7fb6a2354c60a9126486
|
||||||
device_info_plus_macos: 1ad388a1ef433505c4038e7dd9605aadd1e2e9c7
|
device_info_plus_macos: 1ad388a1ef433505c4038e7dd9605aadd1e2e9c7
|
||||||
flutter_custom_cursor: 629957115075c672287bd0fa979d863ccf6024f7
|
flutter_custom_cursor: 629957115075c672287bd0fa979d863ccf6024f7
|
||||||
FlutterMacOS: ae6af50a8ea7d6103d888583d46bd8328a7e9811
|
FlutterMacOS: 57701585bf7de1b3fc2bb61f6378d73bbdea8424
|
||||||
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
|
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
|
||||||
package_info_plus_macos: f010621b07802a241d96d01876d6705f15e77c1c
|
package_info_plus_macos: f010621b07802a241d96d01876d6705f15e77c1c
|
||||||
path_provider_macos: 3c0c3b4b0d4a76d2bf989a913c2de869c5641a19
|
path_provider_macos: 3c0c3b4b0d4a76d2bf989a913c2de869c5641a19
|
||||||
screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38
|
screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38
|
||||||
shared_preferences_macos: a64dc611287ed6cbe28fd1297898db1336975727
|
|
||||||
sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea
|
sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea
|
||||||
tray_manager: 9064e219c56d75c476e46b9a21182087930baf90
|
tray_manager: 9064e219c56d75c476e46b9a21182087930baf90
|
||||||
|
uni_links_desktop: 45900fb319df48fcdea2df0756e9c2626696b026
|
||||||
url_launcher_macos: 597e05b8e514239626bcf4a850fcf9ef5c856ec3
|
url_launcher_macos: 597e05b8e514239626bcf4a850fcf9ef5c856ec3
|
||||||
wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9
|
wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9
|
||||||
window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8
|
window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8
|
||||||
|
window_size: 339dafa0b27a95a62a843042038fa6c3c48de195
|
||||||
|
|
||||||
PODFILE CHECKSUM: c7161fcf45d4fd9025dc0f48a76d6e64e52f8176
|
PODFILE CHECKSUM: c7161fcf45d4fd9025dc0f48a76d6e64e52f8176
|
||||||
|
|
||||||
|
|||||||
@ -26,9 +26,9 @@
|
|||||||
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
|
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
|
||||||
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
|
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
|
||||||
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
|
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
|
||||||
|
84010BA8292CF66600152837 /* liblibrustdesk.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 84010BA7292CF66600152837 /* liblibrustdesk.dylib */; settings = {ATTRIBUTES = (Weak, ); }; };
|
||||||
|
84010BA9292CF68300152837 /* liblibrustdesk.dylib in Embed Libraries */ = {isa = PBXBuildFile; fileRef = 84010BA7292CF66600152837 /* liblibrustdesk.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
||||||
C5E54335B73C89F72DB1B606 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26C84465887F29AE938039CB /* Pods_Runner.framework */; };
|
C5E54335B73C89F72DB1B606 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26C84465887F29AE938039CB /* Pods_Runner.framework */; };
|
||||||
CC13D44B2847D53E00EF8B54 /* librustdesk.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CC13D4362847C8C200EF8B54 /* librustdesk.dylib */; };
|
|
||||||
CC13D4502847D5E800EF8B54 /* librustdesk.dylib in Bundle Framework */ = {isa = PBXBuildFile; fileRef = CC13D4362847C8C200EF8B54 /* librustdesk.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
@ -39,53 +39,18 @@
|
|||||||
remoteGlobalIDString = 33CC111A2044C6BA0003C045;
|
remoteGlobalIDString = 33CC111A2044C6BA0003C045;
|
||||||
remoteInfo = FLX;
|
remoteInfo = FLX;
|
||||||
};
|
};
|
||||||
CC13D4352847C8C200EF8B54 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = CC13D42E2847C8C200EF8B54 /* rustdesk.xcodeproj */;
|
|
||||||
proxyType = 2;
|
|
||||||
remoteGlobalIDString = CA6071B5A0F5A7A3EF2297AA;
|
|
||||||
remoteInfo = "librustdesk-cdylib";
|
|
||||||
};
|
|
||||||
CC13D4372847C8C200EF8B54 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = CC13D42E2847C8C200EF8B54 /* rustdesk.xcodeproj */;
|
|
||||||
proxyType = 2;
|
|
||||||
remoteGlobalIDString = CA604C7415FB2A3731F5016A;
|
|
||||||
remoteInfo = "librustdesk-staticlib";
|
|
||||||
};
|
|
||||||
CC13D4392847C8C200EF8B54 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = CC13D42E2847C8C200EF8B54 /* rustdesk.xcodeproj */;
|
|
||||||
proxyType = 2;
|
|
||||||
remoteGlobalIDString = CA60D3BC5386D3D7DBD96893;
|
|
||||||
remoteInfo = "naming-bin";
|
|
||||||
};
|
|
||||||
CC13D43B2847C8C200EF8B54 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = CC13D42E2847C8C200EF8B54 /* rustdesk.xcodeproj */;
|
|
||||||
proxyType = 2;
|
|
||||||
remoteGlobalIDString = CA60D3BC5386B357B2AB834F;
|
|
||||||
remoteInfo = "rustdesk-bin";
|
|
||||||
};
|
|
||||||
CC13D43D2847C8CB00EF8B54 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = CC13D42E2847C8C200EF8B54 /* rustdesk.xcodeproj */;
|
|
||||||
proxyType = 1;
|
|
||||||
remoteGlobalIDString = CA6071B5A0F5D6691E4C3FF1;
|
|
||||||
remoteInfo = "librustdesk-cdylib";
|
|
||||||
};
|
|
||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
/* Begin PBXCopyFilesBuildPhase section */
|
||||||
33CC110E2044A8840003C045 /* Bundle Framework */ = {
|
840109CF292B240500152837 /* Embed Libraries */ = {
|
||||||
isa = PBXCopyFilesBuildPhase;
|
isa = PBXCopyFilesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
dstPath = "";
|
dstPath = "";
|
||||||
dstSubfolderSpec = 10;
|
dstSubfolderSpec = 10;
|
||||||
files = (
|
files = (
|
||||||
CC13D4502847D5E800EF8B54 /* librustdesk.dylib in Bundle Framework */,
|
84010BA9292CF68300152837 /* liblibrustdesk.dylib in Embed Libraries */,
|
||||||
);
|
);
|
||||||
name = "Bundle Framework";
|
name = "Embed Libraries";
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
/* End PBXCopyFilesBuildPhase section */
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
@ -95,7 +60,7 @@
|
|||||||
295AD07E63F13855C270A0E0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
295AD07E63F13855C270A0E0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
|
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
|
||||||
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
|
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
|
||||||
33CC10ED2044A3C60003C045 /* flutter_hbb.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = flutter_hbb.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
33CC10ED2044A3C60003C045 /* rustdesk.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = rustdesk.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
|
33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
|
||||||
33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
||||||
@ -109,9 +74,9 @@
|
|||||||
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
|
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
|
||||||
7436B85D94E8F7B5A9324869 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
7436B85D94E8F7B5A9324869 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
|
||||||
|
84010BA7292CF66600152837 /* liblibrustdesk.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = liblibrustdesk.dylib; path = ../../target/release/liblibrustdesk.dylib; sourceTree = "<group>"; };
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
|
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
|
||||||
C3BB669FF6190AE1B11BCAEA /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
C3BB669FF6190AE1B11BCAEA /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||||
CC13D42E2847C8C200EF8B54 /* rustdesk.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = rustdesk.xcodeproj; sourceTree = SOURCE_ROOT; };
|
|
||||||
CCB6FE9A2848A6B800E58D48 /* bridge_generated.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bridge_generated.h; path = Runner/bridge_generated.h; sourceTree = "<group>"; };
|
CCB6FE9A2848A6B800E58D48 /* bridge_generated.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bridge_generated.h; path = Runner/bridge_generated.h; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
@ -120,8 +85,8 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
CC13D44B2847D53E00EF8B54 /* librustdesk.dylib in Frameworks */,
|
|
||||||
C5E54335B73C89F72DB1B606 /* Pods_Runner.framework in Frameworks */,
|
C5E54335B73C89F72DB1B606 /* Pods_Runner.framework in Frameworks */,
|
||||||
|
84010BA8292CF66600152837 /* liblibrustdesk.dylib in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@ -154,7 +119,7 @@
|
|||||||
33CC10EE2044A3C60003C045 /* Products */ = {
|
33CC10EE2044A3C60003C045 /* Products */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
33CC10ED2044A3C60003C045 /* flutter_hbb.app */,
|
33CC10ED2044A3C60003C045 /* rustdesk.app */,
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -184,7 +149,6 @@
|
|||||||
33FAB671232836740065AC1E /* Runner */ = {
|
33FAB671232836740065AC1E /* Runner */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
CC13D42E2847C8C200EF8B54 /* rustdesk.xcodeproj */,
|
|
||||||
33CC10F02044A3C60003C045 /* AppDelegate.swift */,
|
33CC10F02044A3C60003C045 /* AppDelegate.swift */,
|
||||||
33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
|
33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
|
||||||
33E51913231747F40026EE4D /* DebugProfile.entitlements */,
|
33E51913231747F40026EE4D /* DebugProfile.entitlements */,
|
||||||
@ -205,20 +169,10 @@
|
|||||||
path = Pods;
|
path = Pods;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
CC13D42F2847C8C200EF8B54 /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
CC13D4362847C8C200EF8B54 /* librustdesk.dylib */,
|
|
||||||
CC13D4382847C8C200EF8B54 /* liblibrustdesk_static.a */,
|
|
||||||
CC13D43A2847C8C200EF8B54 /* naming */,
|
|
||||||
CC13D43C2847C8C200EF8B54 /* rustdesk */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
D73912EC22F37F3D000D13A0 /* Frameworks */ = {
|
D73912EC22F37F3D000D13A0 /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
84010BA7292CF66600152837 /* liblibrustdesk.dylib */,
|
||||||
26C84465887F29AE938039CB /* Pods_Runner.framework */,
|
26C84465887F29AE938039CB /* Pods_Runner.framework */,
|
||||||
);
|
);
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
@ -235,19 +189,18 @@
|
|||||||
33CC10E92044A3C60003C045 /* Sources */,
|
33CC10E92044A3C60003C045 /* Sources */,
|
||||||
33CC10EA2044A3C60003C045 /* Frameworks */,
|
33CC10EA2044A3C60003C045 /* Frameworks */,
|
||||||
33CC10EB2044A3C60003C045 /* Resources */,
|
33CC10EB2044A3C60003C045 /* Resources */,
|
||||||
33CC110E2044A8840003C045 /* Bundle Framework */,
|
|
||||||
3399D490228B24CF009A79C7 /* ShellScript */,
|
3399D490228B24CF009A79C7 /* ShellScript */,
|
||||||
|
840109CF292B240500152837 /* Embed Libraries */,
|
||||||
4688A20DD8E4F3E900927B2C /* [CP] Embed Pods Frameworks */,
|
4688A20DD8E4F3E900927B2C /* [CP] Embed Pods Frameworks */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
CC13D43E2847C8CB00EF8B54 /* PBXTargetDependency */,
|
|
||||||
33CC11202044C79F0003C045 /* PBXTargetDependency */,
|
33CC11202044C79F0003C045 /* PBXTargetDependency */,
|
||||||
);
|
);
|
||||||
name = Runner;
|
name = Runner;
|
||||||
productName = Runner;
|
productName = Runner;
|
||||||
productReference = 33CC10ED2044A3C60003C045 /* flutter_hbb.app */;
|
productReference = 33CC10ED2044A3C60003C045 /* rustdesk.app */;
|
||||||
productType = "com.apple.product-type.application";
|
productType = "com.apple.product-type.application";
|
||||||
};
|
};
|
||||||
/* End PBXNativeTarget section */
|
/* End PBXNativeTarget section */
|
||||||
@ -287,12 +240,6 @@
|
|||||||
mainGroup = 33CC10E42044A3C60003C045;
|
mainGroup = 33CC10E42044A3C60003C045;
|
||||||
productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
|
productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
|
||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
projectReferences = (
|
|
||||||
{
|
|
||||||
ProductGroup = CC13D42F2847C8C200EF8B54 /* Products */;
|
|
||||||
ProjectRef = CC13D42E2847C8C200EF8B54 /* rustdesk.xcodeproj */;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
targets = (
|
targets = (
|
||||||
33CC10EC2044A3C60003C045 /* Runner */,
|
33CC10EC2044A3C60003C045 /* Runner */,
|
||||||
@ -301,37 +248,6 @@
|
|||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
|
|
||||||
/* Begin PBXReferenceProxy section */
|
|
||||||
CC13D4362847C8C200EF8B54 /* librustdesk.dylib */ = {
|
|
||||||
isa = PBXReferenceProxy;
|
|
||||||
fileType = "compiled.mach-o.dylib";
|
|
||||||
path = librustdesk.dylib;
|
|
||||||
remoteRef = CC13D4352847C8C200EF8B54 /* PBXContainerItemProxy */;
|
|
||||||
sourceTree = BUILT_PRODUCTS_DIR;
|
|
||||||
};
|
|
||||||
CC13D4382847C8C200EF8B54 /* liblibrustdesk_static.a */ = {
|
|
||||||
isa = PBXReferenceProxy;
|
|
||||||
fileType = archive.ar;
|
|
||||||
path = liblibrustdesk_static.a;
|
|
||||||
remoteRef = CC13D4372847C8C200EF8B54 /* PBXContainerItemProxy */;
|
|
||||||
sourceTree = BUILT_PRODUCTS_DIR;
|
|
||||||
};
|
|
||||||
CC13D43A2847C8C200EF8B54 /* naming */ = {
|
|
||||||
isa = PBXReferenceProxy;
|
|
||||||
fileType = "compiled.mach-o.executable";
|
|
||||||
path = naming;
|
|
||||||
remoteRef = CC13D4392847C8C200EF8B54 /* PBXContainerItemProxy */;
|
|
||||||
sourceTree = BUILT_PRODUCTS_DIR;
|
|
||||||
};
|
|
||||||
CC13D43C2847C8C200EF8B54 /* rustdesk */ = {
|
|
||||||
isa = PBXReferenceProxy;
|
|
||||||
fileType = "compiled.mach-o.executable";
|
|
||||||
path = rustdesk;
|
|
||||||
remoteRef = CC13D43B2847C8C200EF8B54 /* PBXContainerItemProxy */;
|
|
||||||
sourceTree = BUILT_PRODUCTS_DIR;
|
|
||||||
};
|
|
||||||
/* End PBXReferenceProxy section */
|
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
33CC10EB2044A3C60003C045 /* Resources */ = {
|
33CC10EB2044A3C60003C045 /* Resources */ = {
|
||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
@ -442,11 +358,6 @@
|
|||||||
target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
|
target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
|
||||||
targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
|
targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
|
||||||
};
|
};
|
||||||
CC13D43E2847C8CB00EF8B54 /* PBXTargetDependency */ = {
|
|
||||||
isa = PBXTargetDependency;
|
|
||||||
name = "librustdesk-cdylib";
|
|
||||||
targetProxy = CC13D43D2847C8CB00EF8B54 /* PBXContainerItemProxy */;
|
|
||||||
};
|
|
||||||
/* End PBXTargetDependency section */
|
/* End PBXTargetDependency section */
|
||||||
|
|
||||||
/* Begin PBXVariantGroup section */
|
/* Begin PBXVariantGroup section */
|
||||||
@ -467,6 +378,7 @@
|
|||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
ARCHS = x86_64;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
@ -502,6 +414,7 @@
|
|||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
SDKROOT = macosx;
|
SDKROOT = macosx;
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||||
@ -522,6 +435,12 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
../../target/profile,
|
||||||
|
);
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.rustdesk;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
};
|
};
|
||||||
@ -540,6 +459,7 @@
|
|||||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
ARCHS = x86_64;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
@ -579,7 +499,7 @@
|
|||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
MTL_ENABLE_DEBUG_INFO = YES;
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
SDKROOT = macosx;
|
SDKROOT = macosx;
|
||||||
@ -593,6 +513,7 @@
|
|||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
ARCHS = x86_64;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
@ -626,8 +547,9 @@
|
|||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
SDKROOT = macosx;
|
SDKROOT = macosx;
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||||
@ -648,6 +570,12 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
../../target/debug,
|
||||||
|
);
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.rustdesk;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
"SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = Runner/bridge_generated.h;
|
"SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = Runner/bridge_generated.h;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
@ -669,6 +597,12 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
../../target/release,
|
||||||
|
);
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.rustdesk;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
"SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = Runner/bridge_generated.h;
|
"SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = Runner/bridge_generated.h;
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||||
BuildableName = "flutter_hbb.app"
|
BuildableName = "rustdesk.app"
|
||||||
BlueprintName = "Runner"
|
BlueprintName = "Runner"
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
@ -31,7 +31,7 @@
|
|||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||||
BuildableName = "flutter_hbb.app"
|
BuildableName = "rustdesk.app"
|
||||||
BlueprintName = "Runner"
|
BlueprintName = "Runner"
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
@ -54,7 +54,7 @@
|
|||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||||
BuildableName = "flutter_hbb.app"
|
BuildableName = "rustdesk.app"
|
||||||
BlueprintName = "Runner"
|
BlueprintName = "Runner"
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
@ -71,7 +71,7 @@
|
|||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||||
BuildableName = "flutter_hbb.app"
|
BuildableName = "rustdesk.app"
|
||||||
BlueprintName = "Runner"
|
BlueprintName = "Runner"
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
|
|||||||
@ -11,4 +11,4 @@ PRODUCT_NAME = rustdesk
|
|||||||
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.flutterHbb
|
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.flutterHbb
|
||||||
|
|
||||||
// The copyright displayed in application information
|
// The copyright displayed in application information
|
||||||
PRODUCT_COPYRIGHT = Copyright © 2022 com.carriez. All rights reserved.
|
PRODUCT_COPYRIGHT = Copyright © 2022 Purslane Ltd. All rights reserved.
|
||||||
|
|||||||
@ -18,16 +18,6 @@
|
|||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
<string>$(FLUTTER_BUILD_NAME)</string>
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
|
||||||
<key>LSMinimumSystemVersion</key>
|
|
||||||
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
|
||||||
<key>NSHumanReadableCopyright</key>
|
|
||||||
<string>$(PRODUCT_COPYRIGHT)</string>
|
|
||||||
<key>NSMainNibFile</key>
|
|
||||||
<string>MainMenu</string>
|
|
||||||
<key>NSPrincipalClass</key>
|
|
||||||
<string>NSApplication</string>
|
|
||||||
<key>CFBundleURLTypes</key>
|
<key>CFBundleURLTypes</key>
|
||||||
<array>
|
<array>
|
||||||
<dict>
|
<dict>
|
||||||
@ -41,5 +31,15 @@
|
|||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
||||||
|
<key>LSMinimumSystemVersion</key>
|
||||||
|
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
||||||
|
<key>NSHumanReadableCopyright</key>
|
||||||
|
<string>$(PRODUCT_COPYRIGHT)</string>
|
||||||
|
<key>NSMainNibFile</key>
|
||||||
|
<string>MainMenu</string>
|
||||||
|
<key>NSPrincipalClass</key>
|
||||||
|
<string>NSApplication</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@ -1,7 +1,22 @@
|
|||||||
import Cocoa
|
import Cocoa
|
||||||
import FlutterMacOS
|
import FlutterMacOS
|
||||||
|
import desktop_multi_window
|
||||||
// import bitsdojo_window_macos
|
// import bitsdojo_window_macos
|
||||||
|
|
||||||
|
import desktop_drop
|
||||||
|
import device_info_plus_macos
|
||||||
|
import flutter_custom_cursor
|
||||||
|
import package_info_plus_macos
|
||||||
|
import path_provider_macos
|
||||||
|
import screen_retriever
|
||||||
|
import sqflite
|
||||||
|
import tray_manager
|
||||||
|
import uni_links_desktop
|
||||||
|
import url_launcher_macos
|
||||||
|
import wakelock_macos
|
||||||
|
import window_manager
|
||||||
|
import window_size
|
||||||
|
|
||||||
class MainFlutterWindow: NSWindow {
|
class MainFlutterWindow: NSWindow {
|
||||||
override func awakeFromNib() {
|
override func awakeFromNib() {
|
||||||
if (!rustdesk_core_main()){
|
if (!rustdesk_core_main()){
|
||||||
@ -14,6 +29,22 @@ class MainFlutterWindow: NSWindow {
|
|||||||
self.setFrame(windowFrame, display: true)
|
self.setFrame(windowFrame, display: true)
|
||||||
|
|
||||||
RegisterGeneratedPlugins(registry: flutterViewController)
|
RegisterGeneratedPlugins(registry: flutterViewController)
|
||||||
|
|
||||||
|
FlutterMultiWindowPlugin.setOnWindowCreatedCallback { controller in
|
||||||
|
// Register the plugin which you want access from other isolate.
|
||||||
|
// DesktopLifecyclePlugin.register(with: controller.registrar(forPlugin: "DesktopLifecyclePlugin"))
|
||||||
|
DesktopDropPlugin.register(with: controller.registrar(forPlugin: "DesktopDropPlugin"))
|
||||||
|
DeviceInfoPlusMacosPlugin.register(with: controller.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
|
||||||
|
FlutterCustomCursorPlugin.register(with: controller.registrar(forPlugin: "FlutterCustomCursorPlugin"))
|
||||||
|
FLTPackageInfoPlusPlugin.register(with: controller.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))
|
||||||
|
PathProviderPlugin.register(with: controller.registrar(forPlugin: "PathProviderPlugin"))
|
||||||
|
SqflitePlugin.register(with: controller.registrar(forPlugin: "SqflitePlugin"))
|
||||||
|
TrayManagerPlugin.register(with: controller.registrar(forPlugin: "TrayManagerPlugin"))
|
||||||
|
UniLinksDesktopPlugin.register(with: controller.registrar(forPlugin: "UniLinksDesktopPlugin"))
|
||||||
|
UrlLauncherPlugin.register(with: controller.registrar(forPlugin: "UrlLauncherPlugin"))
|
||||||
|
WakelockMacosPlugin.register(with: controller.registrar(forPlugin: "WakelockMacosPlugin"))
|
||||||
|
WindowSizePlugin.register(with: controller.registrar(forPlugin: "WindowSizePlugin"))
|
||||||
|
}
|
||||||
|
|
||||||
super.awakeFromNib()
|
super.awakeFromNib()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,37 +6,8 @@
|
|||||||
objectVersion = 53;
|
objectVersion = 53;
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
|
||||||
CA6061C6409F12977AAB839F /* Cargo.toml in Sources */ = {isa = PBXBuildFile; fileRef = CA603C4309E13EF4668187A5 /* Cargo.toml */; settings = {COMPILER_FLAGS = "--lib"; }; };
|
|
||||||
CA6061C6409FC858B7409EE3 /* Cargo.toml in Sources */ = {isa = PBXBuildFile; fileRef = CA603C4309E13EF4668187A5 /* Cargo.toml */; settings = {COMPILER_FLAGS = "--bin naming"; }; };
|
|
||||||
CA6061C6409FC9FA710A2219 /* Cargo.toml in Sources */ = {isa = PBXBuildFile; fileRef = CA603C4309E13EF4668187A5 /* Cargo.toml */; settings = {COMPILER_FLAGS = "--bin rustdesk"; }; };
|
|
||||||
CA6061C6409FD6691E4C3FF1 /* Cargo.toml in Sources */ = {isa = PBXBuildFile; fileRef = CA603C4309E13EF4668187A5 /* Cargo.toml */; settings = {COMPILER_FLAGS = "--lib"; }; };
|
|
||||||
/* End PBXBuildFile section */
|
|
||||||
|
|
||||||
/* Begin PBXBuildRule section */
|
|
||||||
CA603C4309E1AC6C1400ACA8 /* PBXBuildRule */ = {
|
|
||||||
isa = PBXBuildRule;
|
|
||||||
compilerSpec = com.apple.compilers.proxy.script;
|
|
||||||
dependencyFile = "$(DERIVED_FILE_DIR)/$(CARGO_XCODE_TARGET_ARCH)-$(EXECUTABLE_NAME).d";
|
|
||||||
filePatterns = "*/Cargo.toml";
|
|
||||||
fileType = pattern.proxy;
|
|
||||||
inputFiles = (
|
|
||||||
);
|
|
||||||
isEditable = 0;
|
|
||||||
name = "Cargo project build";
|
|
||||||
outputFiles = (
|
|
||||||
"$(OBJECT_FILE_DIR)/$(CARGO_XCODE_TARGET_ARCH)-$(EXECUTABLE_NAME)",
|
|
||||||
);
|
|
||||||
script = "# generated with cargo-xcode 1.4.1\n\nset -eu; export PATH=$PATH:~/.cargo/bin:/usr/local/bin;\nif [ \"${IS_MACCATALYST-NO}\" = YES ]; then\n CARGO_XCODE_TARGET_TRIPLE=\"${CARGO_XCODE_TARGET_ARCH}-apple-ios-macabi\"\nelse\n CARGO_XCODE_TARGET_TRIPLE=\"${CARGO_XCODE_TARGET_ARCH}-apple-${CARGO_XCODE_TARGET_OS}\"\nfi\nif [ \"$CARGO_XCODE_TARGET_OS\" != \"darwin\" ]; then\n PATH=\"${PATH/\\/Contents\\/Developer\\/Toolchains\\/XcodeDefault.xctoolchain\\/usr\\/bin:/xcode-provided-ld-cant-link-lSystem-for-the-host-build-script:}\"\nfi\nPATH=\"$PATH:/opt/homebrew/bin\" # Rust projects often depend on extra tools like nasm, which Xcode lacks\nif [ \"$CARGO_XCODE_BUILD_MODE\" == release ]; then\n OTHER_INPUT_FILE_FLAGS=\"${OTHER_INPUT_FILE_FLAGS} --release\"\nfi\nif command -v rustup &> /dev/null; then\n if ! rustup target list --installed | egrep -q \"${CARGO_XCODE_TARGET_TRIPLE}\"; then\n echo \"warning: this build requires rustup toolchain for $CARGO_XCODE_TARGET_TRIPLE, but it isn't installed\"\n rustup target add \"${CARGO_XCODE_TARGET_TRIPLE}\" || echo >&2 \"warning: can't install $CARGO_XCODE_TARGET_TRIPLE\"\n fi\nfi\nif [ \"$ACTION\" = clean ]; then\n ( set -x; cargo clean --manifest-path=\"$SCRIPT_INPUT_FILE\" ${OTHER_INPUT_FILE_FLAGS} --target=\"${CARGO_XCODE_TARGET_TRIPLE}\"; );\nelse\n ( set -x; cargo build --manifest-path=\"$SCRIPT_INPUT_FILE\" --features=\"${CARGO_XCODE_FEATURES:-}\" ${OTHER_INPUT_FILE_FLAGS} --target=\"${CARGO_XCODE_TARGET_TRIPLE}\"; );\nfi\n# it's too hard to explain Cargo's actual exe path to Xcode build graph, so hardlink to a known-good path instead\nBUILT_SRC=\"${CARGO_TARGET_DIR}/${CARGO_XCODE_TARGET_TRIPLE}/${CARGO_XCODE_BUILD_MODE}/${CARGO_XCODE_CARGO_FILE_NAME}\"\nln -f -- \"$BUILT_SRC\" \"$SCRIPT_OUTPUT_FILE_0\"\n\n# xcode generates dep file, but for its own path, so append our rename to it\nDEP_FILE_SRC=\"${CARGO_TARGET_DIR}/${CARGO_XCODE_TARGET_TRIPLE}/${CARGO_XCODE_BUILD_MODE}/${CARGO_XCODE_CARGO_DEP_FILE_NAME}\"\nif [ -f \"$DEP_FILE_SRC\" ]; then\n DEP_FILE_DST=\"${DERIVED_FILE_DIR}/${CARGO_XCODE_TARGET_ARCH}-${EXECUTABLE_NAME}.d\"\n cp -f \"$DEP_FILE_SRC\" \"$DEP_FILE_DST\"\n echo >> \"$DEP_FILE_DST\" \"$SCRIPT_OUTPUT_FILE_0: $BUILT_SRC\"\nfi\n\n# lipo script needs to know all the platform-specific files that have been built\n# archs is in the file name, so that paths don't stay around after archs change\n# must match input for LipoScript\nFILE_LIST=\"${DERIVED_FILE_DIR}/${ARCHS}-${EXECUTABLE_NAME}.xcfilelist\"\ntouch \"$FILE_LIST\"\nif ! egrep -q \"$SCRIPT_OUTPUT_FILE_0\" \"$FILE_LIST\" ; then\n echo >> \"$FILE_LIST\" \"$SCRIPT_OUTPUT_FILE_0\"\nfi\n";
|
|
||||||
};
|
|
||||||
/* End PBXBuildRule section */
|
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
ADDEDBA66A6E1 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; };
|
ADDEDBA66A6E1 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; };
|
||||||
CA604C7415FB2A3731F5016A /* liblibrustdesk_static.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblibrustdesk_static.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
CA6071B5A0F5A7A3EF2297AA /* librustdesk.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = librustdesk.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
CA60D3BC5386B357B2AB834F /* rustdesk */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = rustdesk; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
CA60D3BC5386D3D7DBD96893 /* naming */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = naming; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
@ -51,10 +22,6 @@
|
|||||||
CA603C4309E122869D176AE5 /* Products */ = {
|
CA603C4309E122869D176AE5 /* Products */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
CA6071B5A0F5A7A3EF2297AA /* librustdesk.dylib */,
|
|
||||||
CA604C7415FB2A3731F5016A /* liblibrustdesk_static.a */,
|
|
||||||
CA60D3BC5386D3D7DBD96893 /* naming */,
|
|
||||||
CA60D3BC5386B357B2AB834F /* rustdesk */,
|
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -70,7 +37,6 @@
|
|||||||
CA603C4309E1D65BC3C892A8 = {
|
CA603C4309E1D65BC3C892A8 = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
CA603C4309E13EF4668187A5 /* Cargo.toml */,
|
|
||||||
CA603C4309E122869D176AE5 /* Products */,
|
CA603C4309E122869D176AE5 /* Products */,
|
||||||
CA603C4309E198AF0B5890DB /* Frameworks */,
|
CA603C4309E198AF0B5890DB /* Frameworks */,
|
||||||
);
|
);
|
||||||
@ -78,100 +44,11 @@
|
|||||||
};
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
|
||||||
CA604C7415FB12977AAB839F /* librustdesk-staticlib */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = CA6028B9540B12977AAB839F /* Build configuration list for PBXNativeTarget "librustdesk-staticlib" */;
|
|
||||||
buildPhases = (
|
|
||||||
CA6033723F8212977AAB839F /* Sources */,
|
|
||||||
CA603C4309E1AF6EBB7F357C /* Universal Binary lipo */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
CA603C4309E1AC6C1400ACA8 /* PBXBuildRule */,
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = "librustdesk-staticlib";
|
|
||||||
productName = liblibrustdesk_static.a;
|
|
||||||
productReference = CA604C7415FB2A3731F5016A /* liblibrustdesk_static.a */;
|
|
||||||
productType = "com.apple.product-type.library.static";
|
|
||||||
};
|
|
||||||
CA6071B5A0F5D6691E4C3FF1 /* librustdesk-cdylib */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = CA6028B9540BD6691E4C3FF1 /* Build configuration list for PBXNativeTarget "librustdesk-cdylib" */;
|
|
||||||
buildPhases = (
|
|
||||||
CA6033723F82D6691E4C3FF1 /* Sources */,
|
|
||||||
CA603C4309E1AF6EBB7F357C /* Universal Binary lipo */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
CA603C4309E1AC6C1400ACA8 /* PBXBuildRule */,
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = "librustdesk-cdylib";
|
|
||||||
productName = librustdesk.dylib;
|
|
||||||
productReference = CA6071B5A0F5A7A3EF2297AA /* librustdesk.dylib */;
|
|
||||||
productType = "com.apple.product-type.library.dynamic";
|
|
||||||
};
|
|
||||||
CA60D3BC5386C858B7409EE3 /* naming-bin */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = CA6028B9540BC858B7409EE3 /* Build configuration list for PBXNativeTarget "naming-bin" */;
|
|
||||||
buildPhases = (
|
|
||||||
CA6033723F82C858B7409EE3 /* Sources */,
|
|
||||||
CA603C4309E1AF6EBB7F357C /* Universal Binary lipo */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
CA603C4309E1AC6C1400ACA8 /* PBXBuildRule */,
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = "naming-bin";
|
|
||||||
productName = naming;
|
|
||||||
productReference = CA60D3BC5386D3D7DBD96893 /* naming */;
|
|
||||||
productType = "com.apple.product-type.tool";
|
|
||||||
};
|
|
||||||
CA60D3BC5386C9FA710A2219 /* rustdesk-bin */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = CA6028B9540BC9FA710A2219 /* Build configuration list for PBXNativeTarget "rustdesk-bin" */;
|
|
||||||
buildPhases = (
|
|
||||||
CA6033723F82C9FA710A2219 /* Sources */,
|
|
||||||
CA603C4309E1AF6EBB7F357C /* Universal Binary lipo */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
CA603C4309E1AC6C1400ACA8 /* PBXBuildRule */,
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = "rustdesk-bin";
|
|
||||||
productName = rustdesk;
|
|
||||||
productReference = CA60D3BC5386B357B2AB834F /* rustdesk */;
|
|
||||||
productType = "com.apple.product-type.tool";
|
|
||||||
};
|
|
||||||
/* End PBXNativeTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
/* Begin PBXProject section */
|
||||||
CA603C4309E1E04653AD465F /* Project object */ = {
|
CA603C4309E1E04653AD465F /* Project object */ = {
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
LastUpgradeCheck = 1300;
|
LastUpgradeCheck = 1300;
|
||||||
TargetAttributes = {
|
|
||||||
CA604C7415FB12977AAB839F = {
|
|
||||||
CreatedOnToolsVersion = 9.2;
|
|
||||||
ProvisioningStyle = Automatic;
|
|
||||||
};
|
|
||||||
CA6071B5A0F5D6691E4C3FF1 = {
|
|
||||||
CreatedOnToolsVersion = 9.2;
|
|
||||||
ProvisioningStyle = Automatic;
|
|
||||||
};
|
|
||||||
CA60D3BC5386C858B7409EE3 = {
|
|
||||||
CreatedOnToolsVersion = 9.2;
|
|
||||||
ProvisioningStyle = Automatic;
|
|
||||||
};
|
|
||||||
CA60D3BC5386C9FA710A2219 = {
|
|
||||||
CreatedOnToolsVersion = 9.2;
|
|
||||||
ProvisioningStyle = Automatic;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
buildConfigurationList = CA603C4309E180E02D6C7F57 /* Build configuration list for PBXProject "rustdesk" */;
|
buildConfigurationList = CA603C4309E180E02D6C7F57 /* Build configuration list for PBXProject "rustdesk" */;
|
||||||
compatibilityVersion = "Xcode 11.4";
|
compatibilityVersion = "Xcode 11.4";
|
||||||
@ -186,161 +63,11 @@
|
|||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
targets = (
|
targets = (
|
||||||
CA6071B5A0F5D6691E4C3FF1 /* librustdesk-cdylib */,
|
|
||||||
CA604C7415FB12977AAB839F /* librustdesk-staticlib */,
|
|
||||||
CA60D3BC5386C858B7409EE3 /* naming-bin */,
|
|
||||||
CA60D3BC5386C9FA710A2219 /* rustdesk-bin */,
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
|
||||||
CA603C4309E1AF6EBB7F357C /* Universal Binary lipo */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
"$(DERIVED_FILE_DIR)/$(ARCHS)-$(EXECUTABLE_NAME).xcfilelist",
|
|
||||||
);
|
|
||||||
name = "Universal Binary lipo";
|
|
||||||
outputFileListPaths = (
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
"$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)",
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "# generated with cargo-xcode 1.4.1\nset -eux; cat \"$DERIVED_FILE_DIR/$ARCHS-$EXECUTABLE_NAME.xcfilelist\" | tr '\\n' '\\0' | xargs -0 lipo -create -output \"$TARGET_BUILD_DIR/$EXECUTABLE_PATH\"";
|
|
||||||
};
|
|
||||||
/* End PBXShellScriptBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
|
||||||
CA6033723F8212977AAB839F /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
CA6061C6409F12977AAB839F /* Cargo.toml in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
CA6033723F82C858B7409EE3 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
CA6061C6409FC858B7409EE3 /* Cargo.toml in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
CA6033723F82C9FA710A2219 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
CA6061C6409FC9FA710A2219 /* Cargo.toml in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
CA6033723F82D6691E4C3FF1 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
CA6061C6409FD6691E4C3FF1 /* Cargo.toml in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXSourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
CA604B55B26012977AAB839F /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CARGO_XCODE_CARGO_DEP_FILE_NAME = liblibrustdesk.d;
|
|
||||||
CARGO_XCODE_CARGO_FILE_NAME = liblibrustdesk.a;
|
|
||||||
INSTALL_GROUP = "";
|
|
||||||
INSTALL_MODE_FLAG = "";
|
|
||||||
INSTALL_OWNER = "";
|
|
||||||
PRODUCT_NAME = librustdesk_static;
|
|
||||||
SKIP_INSTALL = YES;
|
|
||||||
SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos appletvsimulator appletvos";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
CA604B55B260C858B7409EE3 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CARGO_XCODE_CARGO_DEP_FILE_NAME = naming.d;
|
|
||||||
CARGO_XCODE_CARGO_FILE_NAME = naming;
|
|
||||||
PRODUCT_NAME = naming;
|
|
||||||
SUPPORTED_PLATFORMS = macosx;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
CA604B55B260C9FA710A2219 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CARGO_XCODE_CARGO_DEP_FILE_NAME = rustdesk.d;
|
|
||||||
CARGO_XCODE_CARGO_FILE_NAME = rustdesk;
|
|
||||||
PRODUCT_NAME = rustdesk;
|
|
||||||
SUPPORTED_PLATFORMS = macosx;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
CA604B55B260D6691E4C3FF1 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CARGO_XCODE_CARGO_DEP_FILE_NAME = liblibrustdesk.d;
|
|
||||||
CARGO_XCODE_CARGO_FILE_NAME = liblibrustdesk.dylib;
|
|
||||||
PRODUCT_NAME = librustdesk;
|
|
||||||
SUPPORTED_PLATFORMS = macosx;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
CA60583BB9CE12977AAB839F /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CARGO_XCODE_CARGO_DEP_FILE_NAME = liblibrustdesk.d;
|
|
||||||
CARGO_XCODE_CARGO_FILE_NAME = liblibrustdesk.a;
|
|
||||||
INSTALL_GROUP = "";
|
|
||||||
INSTALL_MODE_FLAG = "";
|
|
||||||
INSTALL_OWNER = "";
|
|
||||||
PRODUCT_NAME = librustdesk_static;
|
|
||||||
SKIP_INSTALL = YES;
|
|
||||||
SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos appletvsimulator appletvos";
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
CA60583BB9CEC858B7409EE3 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CARGO_XCODE_CARGO_DEP_FILE_NAME = naming.d;
|
|
||||||
CARGO_XCODE_CARGO_FILE_NAME = naming;
|
|
||||||
PRODUCT_NAME = naming;
|
|
||||||
SUPPORTED_PLATFORMS = macosx;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
CA60583BB9CEC9FA710A2219 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CARGO_XCODE_CARGO_DEP_FILE_NAME = rustdesk.d;
|
|
||||||
CARGO_XCODE_CARGO_FILE_NAME = rustdesk;
|
|
||||||
PRODUCT_NAME = rustdesk;
|
|
||||||
SUPPORTED_PLATFORMS = macosx;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
CA60583BB9CED6691E4C3FF1 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CARGO_XCODE_CARGO_DEP_FILE_NAME = liblibrustdesk.d;
|
|
||||||
CARGO_XCODE_CARGO_FILE_NAME = liblibrustdesk.dylib;
|
|
||||||
PRODUCT_NAME = librustdesk;
|
|
||||||
SUPPORTED_PLATFORMS = macosx;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
CA608F3F78EE228BE02872F8 /* Debug */ = {
|
CA608F3F78EE228BE02872F8 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
@ -387,42 +114,6 @@
|
|||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
/* Begin XCConfigurationList section */
|
||||||
CA6028B9540B12977AAB839F /* Build configuration list for PBXNativeTarget "librustdesk-staticlib" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
CA60583BB9CE12977AAB839F /* Release */,
|
|
||||||
CA604B55B26012977AAB839F /* Debug */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
CA6028B9540BC858B7409EE3 /* Build configuration list for PBXNativeTarget "naming-bin" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
CA60583BB9CEC858B7409EE3 /* Release */,
|
|
||||||
CA604B55B260C858B7409EE3 /* Debug */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
CA6028B9540BC9FA710A2219 /* Build configuration list for PBXNativeTarget "rustdesk-bin" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
CA60583BB9CEC9FA710A2219 /* Release */,
|
|
||||||
CA604B55B260C9FA710A2219 /* Debug */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
CA6028B9540BD6691E4C3FF1 /* Build configuration list for PBXNativeTarget "librustdesk-cdylib" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
CA60583BB9CED6691E4C3FF1 /* Release */,
|
|
||||||
CA604B55B260D6691E4C3FF1 /* Debug */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
CA603C4309E180E02D6C7F57 /* Build configuration list for PBXProject "rustdesk" */ = {
|
CA603C4309E180E02D6C7F57 /* Build configuration list for PBXProject "rustdesk" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -40,7 +40,6 @@ dependencies:
|
|||||||
#firebase_analytics: ^9.1.5
|
#firebase_analytics: ^9.1.5
|
||||||
package_info_plus: ^1.4.2
|
package_info_plus: ^1.4.2
|
||||||
url_launcher: ^6.0.9
|
url_launcher: ^6.0.9
|
||||||
shared_preferences: ^2.0.6
|
|
||||||
toggle_switch: ^1.4.0
|
toggle_switch: ^1.4.0
|
||||||
dash_chat_2: ^0.0.14
|
dash_chat_2: ^0.0.14
|
||||||
draggable_float_widget: ^0.0.2
|
draggable_float_widget: ^0.0.2
|
||||||
@ -64,7 +63,7 @@ dependencies:
|
|||||||
desktop_multi_window:
|
desktop_multi_window:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/Kingtous/rustdesk_desktop_multi_window
|
url: https://github.com/Kingtous/rustdesk_desktop_multi_window
|
||||||
ref: 0831243da7231c82ea56ebaeb36e650620d4a23b
|
ref: 8ee8eb59cabf6ac83a13fe002de7d4a231263a58
|
||||||
freezed_annotation: ^2.0.3
|
freezed_annotation: ^2.0.3
|
||||||
tray_manager:
|
tray_manager:
|
||||||
git:
|
git:
|
||||||
@ -73,7 +72,7 @@ dependencies:
|
|||||||
flutter_custom_cursor:
|
flutter_custom_cursor:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/Kingtous/rustdesk_flutter_custom_cursor
|
url: https://github.com/Kingtous/rustdesk_flutter_custom_cursor
|
||||||
ref: dec2166e881c47d922e1edc484d10d2cd5c2103b
|
ref: bfb19c84a8244771488bc05cc5f9c9b5e0324cfd
|
||||||
window_size:
|
window_size:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/google/flutter-desktop-embedding.git
|
url: https://github.com/google/flutter-desktop-embedding.git
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# Project-level configuration.
|
# Project-level configuration.
|
||||||
cmake_minimum_required(VERSION 3.14)
|
cmake_minimum_required(VERSION 3.14)
|
||||||
project(flutter_hbb LANGUAGES CXX)
|
project(rustdesk LANGUAGES CXX)
|
||||||
|
|
||||||
# The name of the executable created for the application. Change this to change
|
# The name of the executable created for the application. Change this to change
|
||||||
# the on-disk name of your application.
|
# the on-disk name of your application.
|
||||||
@ -28,6 +28,18 @@ set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
|
|||||||
set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
|
set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
|
||||||
set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}")
|
set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}")
|
||||||
set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}")
|
set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}")
|
||||||
|
# Replace /MD flags to /MT to use static vcruntine
|
||||||
|
set(CompilerFlags
|
||||||
|
CMAKE_CXX_FLAGS
|
||||||
|
CMAKE_CXX_FLAGS_DEBUG
|
||||||
|
CMAKE_CXX_FLAGS_RELEASE
|
||||||
|
CMAKE_C_FLAGS
|
||||||
|
CMAKE_C_FLAGS_DEBUG
|
||||||
|
CMAKE_C_FLAGS_RELEASE
|
||||||
|
)
|
||||||
|
foreach(CompilerFlag ${CompilerFlags})
|
||||||
|
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
# Use Unicode for all projects.
|
# Use Unicode for all projects.
|
||||||
add_definitions(-DUNICODE -D_UNICODE)
|
add_definitions(-DUNICODE -D_UNICODE)
|
||||||
@ -41,6 +53,8 @@ function(APPLY_STANDARD_SETTINGS TARGET)
|
|||||||
target_compile_features(${TARGET} PUBLIC cxx_std_17)
|
target_compile_features(${TARGET} PUBLIC cxx_std_17)
|
||||||
target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100")
|
target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100")
|
||||||
target_compile_options(${TARGET} PRIVATE /EHsc)
|
target_compile_options(${TARGET} PRIVATE /EHsc)
|
||||||
|
# Disable VC140_1
|
||||||
|
target_compile_options(${TARGET} PRIVATE /d2FH4-)
|
||||||
target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0")
|
target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0")
|
||||||
target_compile_definitions(${TARGET} PRIVATE "$<$<CONFIG:Debug>:_DEBUG>")
|
target_compile_definitions(${TARGET} PRIVATE "$<$<CONFIG:Debug>:_DEBUG>")
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|||||||
@ -18,7 +18,7 @@ fn build_c_impl() {
|
|||||||
if build.get_compiler().is_like_msvc() {
|
if build.get_compiler().is_like_msvc() {
|
||||||
build.define("WIN32", "");
|
build.define("WIN32", "");
|
||||||
// build.define("_AMD64_", "");
|
// build.define("_AMD64_", "");
|
||||||
build.flag("-Zi");
|
build.flag("-Z7");
|
||||||
build.flag("-GR-");
|
build.flag("-GR-");
|
||||||
// build.flag("-std:c++11");
|
// build.flag("-std:c++11");
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -580,6 +580,63 @@ impl Enigo {
|
|||||||
_ => u16::MAX,
|
_ => u16::MAX,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn mouse_scroll_impl(&mut self, length: i32, is_track_pad: bool, is_horizontal: bool) {
|
||||||
|
let mut scroll_direction = -1; // 1 left -1 right;
|
||||||
|
let mut length = length;
|
||||||
|
|
||||||
|
if length < 0 {
|
||||||
|
length *= -1;
|
||||||
|
scroll_direction *= -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fix scroll distance for track pad
|
||||||
|
if is_track_pad {
|
||||||
|
length *= 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(src) = self.event_source.as_ref() {
|
||||||
|
for _ in 0..length {
|
||||||
|
unsafe {
|
||||||
|
let units = if is_track_pad {
|
||||||
|
ScrollUnit::Pixel
|
||||||
|
} else {
|
||||||
|
ScrollUnit::Line
|
||||||
|
};
|
||||||
|
let mouse_ev = if is_horizontal {
|
||||||
|
CGEventCreateScrollWheelEvent(
|
||||||
|
&src,
|
||||||
|
units,
|
||||||
|
2, // CGWheelCount 1 = y 2 = xy 3 = xyz
|
||||||
|
0,
|
||||||
|
scroll_direction,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
CGEventCreateScrollWheelEvent(
|
||||||
|
&src,
|
||||||
|
units,
|
||||||
|
1, // CGWheelCount 1 = y 2 = xy 3 = xyz
|
||||||
|
scroll_direction,
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
CGEventPost(CGEventTapLocation::HID, mouse_ev);
|
||||||
|
CFRelease(mouse_ev as *const std::ffi::c_void);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// handle scroll vertically
|
||||||
|
pub fn mouse_scroll_y(&mut self, length: i32, is_track_pad: bool) {
|
||||||
|
self.mouse_scroll_impl(length, is_track_pad, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// handle scroll horizontally
|
||||||
|
pub fn mouse_scroll_x(&mut self, length: i32, is_track_pad: bool) {
|
||||||
|
self.mouse_scroll_impl(length, is_track_pad, true)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|||||||
@ -9,9 +9,9 @@ use std::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use directories_next::ProjectDirs;
|
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
|
use serde as de;
|
||||||
use serde_derive::{Deserialize, Serialize};
|
use serde_derive::{Deserialize, Serialize};
|
||||||
use sodiumoxide::base64;
|
use sodiumoxide::base64;
|
||||||
use sodiumoxide::crypto::sign;
|
use sodiumoxide::crypto::sign;
|
||||||
@ -83,6 +83,26 @@ pub const RS_PUB_KEY: &'static str = "OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmB
|
|||||||
pub const RENDEZVOUS_PORT: i32 = 21116;
|
pub const RENDEZVOUS_PORT: i32 = 21116;
|
||||||
pub const RELAY_PORT: i32 = 21117;
|
pub const RELAY_PORT: i32 = 21117;
|
||||||
|
|
||||||
|
macro_rules! serde_field_string {
|
||||||
|
($default_func:ident, $de_func:ident, $default_expr:expr) => {
|
||||||
|
fn $default_func() -> String {
|
||||||
|
$default_expr
|
||||||
|
}
|
||||||
|
|
||||||
|
fn $de_func<'de, D>(deserializer: D) -> Result<String, D::Error>
|
||||||
|
where
|
||||||
|
D: de::Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let s: &str = de::Deserialize::deserialize(deserializer)?;
|
||||||
|
Ok(if s.is_empty() {
|
||||||
|
Self::$default_func()
|
||||||
|
} else {
|
||||||
|
s.to_owned()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
||||||
pub enum NetworkType {
|
pub enum NetworkType {
|
||||||
Direct,
|
Direct,
|
||||||
@ -145,9 +165,20 @@ pub struct PeerConfig {
|
|||||||
pub size_ft: Size,
|
pub size_ft: Size,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub size_pf: Size,
|
pub size_pf: Size,
|
||||||
#[serde(default)]
|
#[serde(
|
||||||
pub view_style: String, // original (default), scale
|
default = "PeerConfig::default_view_style",
|
||||||
#[serde(default)]
|
deserialize_with = "PeerConfig::deserialize_view_style"
|
||||||
|
)]
|
||||||
|
pub view_style: String,
|
||||||
|
#[serde(
|
||||||
|
default = "PeerConfig::default_scroll_style",
|
||||||
|
deserialize_with = "PeerConfig::deserialize_scroll_style"
|
||||||
|
)]
|
||||||
|
pub scroll_style: String,
|
||||||
|
#[serde(
|
||||||
|
default = "PeerConfig::default_image_quality",
|
||||||
|
deserialize_with = "PeerConfig::deserialize_image_quality"
|
||||||
|
)]
|
||||||
pub image_quality: String,
|
pub image_quality: String,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub custom_image_quality: Vec<i32>,
|
pub custom_image_quality: Vec<i32>,
|
||||||
@ -170,9 +201,12 @@ pub struct PeerConfig {
|
|||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub show_quality_monitor: bool,
|
pub show_quality_monitor: bool,
|
||||||
|
|
||||||
// the other scalar value must before this
|
// The other scalar value must before this
|
||||||
#[serde(default)]
|
#[serde(default, deserialize_with = "PeerConfig::deserialize_options")]
|
||||||
pub options: HashMap<String, String>,
|
pub options: HashMap<String, String>,
|
||||||
|
// Various data for flutter ui
|
||||||
|
#[serde(default)]
|
||||||
|
pub ui_flutter: HashMap<String, String>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub info: PeerInfoSerde,
|
pub info: PeerInfoSerde,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
@ -375,12 +409,15 @@ impl Config {
|
|||||||
pub fn get_home() -> PathBuf {
|
pub fn get_home() -> PathBuf {
|
||||||
#[cfg(any(target_os = "android", target_os = "ios"))]
|
#[cfg(any(target_os = "android", target_os = "ios"))]
|
||||||
return Self::path(APP_HOME_DIR.read().unwrap().as_str());
|
return Self::path(APP_HOME_DIR.read().unwrap().as_str());
|
||||||
if let Some(path) = dirs_next::home_dir() {
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
patch(path)
|
{
|
||||||
} else if let Ok(path) = std::env::current_dir() {
|
if let Some(path) = dirs_next::home_dir() {
|
||||||
path
|
patch(path)
|
||||||
} else {
|
} else if let Ok(path) = std::env::current_dir() {
|
||||||
std::env::temp_dir()
|
path
|
||||||
|
} else {
|
||||||
|
std::env::temp_dir()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,17 +428,22 @@ impl Config {
|
|||||||
path.push(p);
|
path.push(p);
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
#[cfg(not(target_os = "macos"))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
let org = "";
|
{
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(not(target_os = "macos"))]
|
||||||
let org = ORG.read().unwrap().clone();
|
let org = "";
|
||||||
// /var/root for root
|
#[cfg(target_os = "macos")]
|
||||||
if let Some(project) = ProjectDirs::from("", &org, &*APP_NAME.read().unwrap()) {
|
let org = ORG.read().unwrap().clone();
|
||||||
let mut path = patch(project.config_dir().to_path_buf());
|
// /var/root for root
|
||||||
path.push(p);
|
if let Some(project) =
|
||||||
return path;
|
directories_next::ProjectDirs::from("", &org, &*APP_NAME.read().unwrap())
|
||||||
|
{
|
||||||
|
let mut path = patch(project.config_dir().to_path_buf());
|
||||||
|
path.push(p);
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
return "".into();
|
||||||
}
|
}
|
||||||
return "".into();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unreachable_code)]
|
#[allow(unreachable_code)]
|
||||||
@ -580,16 +622,19 @@ impl Config {
|
|||||||
.to_string(),
|
.to_string(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
let mut id = 0u32;
|
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
if let Ok(Some(ma)) = mac_address::get_mac_address() {
|
{
|
||||||
for x in &ma.bytes()[2..] {
|
let mut id = 0u32;
|
||||||
id = (id << 8) | (*x as u32);
|
if let Ok(Some(ma)) = mac_address::get_mac_address() {
|
||||||
|
for x in &ma.bytes()[2..] {
|
||||||
|
id = (id << 8) | (*x as u32);
|
||||||
|
}
|
||||||
|
id = id & 0x1FFFFFFF;
|
||||||
|
Some(id.to_string())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
}
|
}
|
||||||
id = id & 0x1FFFFFFF;
|
|
||||||
Some(id.to_string())
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -909,6 +954,33 @@ impl PeerConfig {
|
|||||||
}
|
}
|
||||||
Default::default()
|
Default::default()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
serde_field_string!(
|
||||||
|
default_view_style,
|
||||||
|
deserialize_view_style,
|
||||||
|
"original".to_owned()
|
||||||
|
);
|
||||||
|
serde_field_string!(
|
||||||
|
default_scroll_style,
|
||||||
|
deserialize_scroll_style,
|
||||||
|
"scrollauto".to_owned()
|
||||||
|
);
|
||||||
|
serde_field_string!(
|
||||||
|
default_image_quality,
|
||||||
|
deserialize_image_quality,
|
||||||
|
"balanced".to_owned()
|
||||||
|
);
|
||||||
|
|
||||||
|
fn deserialize_options<'de, D>(deserializer: D) -> Result<HashMap<String, String>, D::Error>
|
||||||
|
where
|
||||||
|
D: de::Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let mut mp: HashMap<String, String> = de::Deserialize::deserialize(deserializer)?;
|
||||||
|
if !mp.contains_key("codec-preference") {
|
||||||
|
mp.insert("codec-preference".to_owned(), "auto".to_owned());
|
||||||
|
}
|
||||||
|
Ok(mp)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
|
||||||
@ -921,6 +993,9 @@ pub struct LocalConfig {
|
|||||||
pub fav: Vec<String>,
|
pub fav: Vec<String>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
options: HashMap<String, String>,
|
options: HashMap<String, String>,
|
||||||
|
// Various data for flutter ui
|
||||||
|
#[serde(default)]
|
||||||
|
ui_flutter: HashMap<String, String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LocalConfig {
|
impl LocalConfig {
|
||||||
@ -992,6 +1067,27 @@ impl LocalConfig {
|
|||||||
config.store();
|
config.store();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_flutter_config(k: &str) -> String {
|
||||||
|
if let Some(v) = LOCAL_CONFIG.read().unwrap().ui_flutter.get(k) {
|
||||||
|
v.clone()
|
||||||
|
} else {
|
||||||
|
"".to_owned()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_flutter_config(k: String, v: String) {
|
||||||
|
let mut config = LOCAL_CONFIG.write().unwrap();
|
||||||
|
let v2 = if v.is_empty() { None } else { Some(&v) };
|
||||||
|
if v2 != config.ui_flutter.get(&k) {
|
||||||
|
if v2.is_none() {
|
||||||
|
config.ui_flutter.remove(&k);
|
||||||
|
} else {
|
||||||
|
config.ui_flutter.insert(k, v);
|
||||||
|
}
|
||||||
|
config.store();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
|
||||||
|
|||||||
@ -380,7 +380,7 @@ impl TransferJob {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn write(&mut self, block: FileTransferBlock, raw: Option<&[u8]>) -> ResultType<()> {
|
pub async fn write(&mut self, block: FileTransferBlock) -> ResultType<()> {
|
||||||
if block.id != self.id {
|
if block.id != self.id {
|
||||||
bail!("Wrong id");
|
bail!("Wrong id");
|
||||||
}
|
}
|
||||||
@ -402,20 +402,15 @@ impl TransferJob {
|
|||||||
let path = format!("{}.download", get_string(&path));
|
let path = format!("{}.download", get_string(&path));
|
||||||
self.file = Some(File::create(&path).await?);
|
self.file = Some(File::create(&path).await?);
|
||||||
}
|
}
|
||||||
let data = if let Some(data) = raw {
|
|
||||||
data
|
|
||||||
} else {
|
|
||||||
&block.data
|
|
||||||
};
|
|
||||||
if block.compressed {
|
if block.compressed {
|
||||||
let tmp = decompress(data);
|
let tmp = decompress(&block.data);
|
||||||
self.file.as_mut().unwrap().write_all(&tmp).await?;
|
self.file.as_mut().unwrap().write_all(&tmp).await?;
|
||||||
self.finished_size += tmp.len() as u64;
|
self.finished_size += tmp.len() as u64;
|
||||||
} else {
|
} else {
|
||||||
self.file.as_mut().unwrap().write_all(data).await?;
|
self.file.as_mut().unwrap().write_all(&block.data).await?;
|
||||||
self.finished_size += data.len() as u64;
|
self.finished_size += block.data.len() as u64;
|
||||||
}
|
}
|
||||||
self.transferred += data.len() as u64;
|
self.transferred += block.data.len() as u64;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -161,19 +161,23 @@ pub fn get_version_from_url(url: &str) -> String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn gen_version() {
|
pub fn gen_version() {
|
||||||
|
use std::io::prelude::*;
|
||||||
let mut file = File::create("./src/version.rs").unwrap();
|
let mut file = File::create("./src/version.rs").unwrap();
|
||||||
for line in read_lines("Cargo.toml").unwrap() {
|
for line in read_lines("Cargo.toml").unwrap() {
|
||||||
if let Ok(line) = line {
|
if let Ok(line) = line {
|
||||||
let ab: Vec<&str> = line.split("=").map(|x| x.trim()).collect();
|
let ab: Vec<&str> = line.split("=").map(|x| x.trim()).collect();
|
||||||
if ab.len() == 2 && ab[0] == "version" {
|
if ab.len() == 2 && ab[0] == "version" {
|
||||||
use std::io::prelude::*;
|
file.write_all(format!("pub const VERSION: &str = {};\n", ab[1]).as_bytes())
|
||||||
file.write_all(format!("pub const VERSION: &str = {};", ab[1]).as_bytes())
|
|
||||||
.ok();
|
.ok();
|
||||||
file.sync_all().ok();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// generate build date
|
||||||
|
let build_date = format!("{}", chrono::Local::now().format("%Y-%m-%d %H:%M"));
|
||||||
|
file.write_all(format!("pub const BUILD_DATE: &str = \"{}\";", build_date).as_bytes())
|
||||||
|
.ok();
|
||||||
|
file.sync_all().ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
|
fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
|
||||||
|
|||||||
@ -13,6 +13,13 @@ enum VerificationMethod {
|
|||||||
UseBothPasswords,
|
UseBothPasswords,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
|
pub enum ApproveMode {
|
||||||
|
Both,
|
||||||
|
Password,
|
||||||
|
Click,
|
||||||
|
}
|
||||||
|
|
||||||
// Should only be called in server
|
// Should only be called in server
|
||||||
pub fn update_temporary_password() {
|
pub fn update_temporary_password() {
|
||||||
*TEMPORARY_PASSWORD.write().unwrap() = Config::get_auto_password(temporary_password_length());
|
*TEMPORARY_PASSWORD.write().unwrap() = Config::get_auto_password(temporary_password_length());
|
||||||
@ -58,6 +65,23 @@ pub fn has_valid_password() -> bool {
|
|||||||
|| permanent_enabled() && !Config::get_permanent_password().is_empty()
|
|| permanent_enabled() && !Config::get_permanent_password().is_empty()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn approve_mode() -> ApproveMode {
|
||||||
|
let mode = Config::get_option("approve-mode");
|
||||||
|
if mode == "password" {
|
||||||
|
ApproveMode::Password
|
||||||
|
} else if mode == "click" {
|
||||||
|
ApproveMode::Click
|
||||||
|
} else {
|
||||||
|
ApproveMode::Both
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn hide_cm() -> bool {
|
||||||
|
approve_mode() == ApproveMode::Password
|
||||||
|
&& verification_method() == VerificationMethod::OnlyUsePermanentPassword
|
||||||
|
&& !Config::get_option("allow-hide-cm").is_empty()
|
||||||
|
}
|
||||||
|
|
||||||
const VERSION_LEN: usize = 2;
|
const VERSION_LEN: usize = 2;
|
||||||
|
|
||||||
pub fn encrypt_str_or_original(s: &str, version: &str) -> String {
|
pub fn encrypt_str_or_original(s: &str, version: &str) -> String {
|
||||||
|
|||||||
@ -64,6 +64,7 @@ fn main() {
|
|||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
let click_setup = args.is_empty() && arg_exe.to_lowercase().ends_with("install.exe");
|
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 reader = BinaryReader::default();
|
let reader = BinaryReader::default();
|
||||||
if let Some(exe) = setup(
|
if let Some(exe) = setup(
|
||||||
@ -72,7 +73,9 @@ fn main() {
|
|||||||
click_setup || args.contains(&"--silent-install".to_owned()),
|
click_setup || args.contains(&"--silent-install".to_owned()),
|
||||||
) {
|
) {
|
||||||
if click_setup {
|
if click_setup {
|
||||||
args = vec!["--install".to_owned()]
|
args = vec!["--install".to_owned()];
|
||||||
|
} else if quick_support {
|
||||||
|
args = vec!["--quick_support".to_owned()];
|
||||||
}
|
}
|
||||||
execute(exe, args);
|
execute(exe, args);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,3 @@
|
|||||||
pub mod ffi;
|
pub mod ffi;
|
||||||
use std::sync::RwLock;
|
|
||||||
|
|
||||||
pub use ffi::*;
|
pub use ffi::*;
|
||||||
|
|
||||||
use lazy_static::lazy_static;
|
|
||||||
|
|||||||
@ -61,7 +61,7 @@ impl TraitCapturer for Capturer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Frame<'a>(&'a [u8]);
|
pub struct Frame<'a>(pub &'a [u8]);
|
||||||
|
|
||||||
impl<'a> ops::Deref for Frame<'a> {
|
impl<'a> ops::Deref for Frame<'a> {
|
||||||
type Target = [u8];
|
type Target = [u8];
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
use hbb_common::anyhow::{anyhow, Context};
|
use hbb_common::anyhow::{anyhow, Context};
|
||||||
use hbb_common::message_proto::{EncodedVideoFrame, EncodedVideoFrames, Message, VideoFrame};
|
use hbb_common::message_proto::{EncodedVideoFrame, EncodedVideoFrames, Message, VideoFrame};
|
||||||
use hbb_common::{ResultType, get_time};
|
use hbb_common::{get_time, ResultType};
|
||||||
|
|
||||||
use crate::codec::EncoderApi;
|
use crate::codec::EncoderApi;
|
||||||
use crate::STRIDE_ALIGN;
|
use crate::STRIDE_ALIGN;
|
||||||
@ -233,7 +233,9 @@ impl EncoderApi for VpxEncoder {
|
|||||||
|
|
||||||
impl VpxEncoder {
|
impl VpxEncoder {
|
||||||
pub fn encode(&mut self, pts: i64, data: &[u8], stride_align: usize) -> Result<EncodeFrames> {
|
pub fn encode(&mut self, pts: i64, data: &[u8], stride_align: usize) -> Result<EncodeFrames> {
|
||||||
assert!(2 * data.len() >= 3 * self.width * self.height);
|
if 2 * data.len() < 3 * self.width * self.height {
|
||||||
|
return Err(Error::FailedCall("len not enough".to_string()));
|
||||||
|
}
|
||||||
|
|
||||||
let mut image = Default::default();
|
let mut image = Default::default();
|
||||||
call_vpx_ptr!(vpx_img_wrap(
|
call_vpx_ptr!(vpx_img_wrap(
|
||||||
|
|||||||
1358
libs/virtual_display/Cargo.lock
generated
Normal file
1358
libs/virtual_display/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -5,12 +5,7 @@ edition = "2021"
|
|||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[build-dependencies]
|
|
||||||
cc = "1.0"
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
thiserror = "1.0.30"
|
|
||||||
lazy_static = "1.4"
|
lazy_static = "1.4"
|
||||||
serde = "1.0"
|
libloading = "0.7"
|
||||||
serde_derive = "1.0"
|
|
||||||
hbb_common = { path = "../hbb_common" }
|
hbb_common = { path = "../hbb_common" }
|
||||||
|
|||||||
@ -1,32 +1,3 @@
|
|||||||
# virtual display
|
# virtual display
|
||||||
|
|
||||||
Virtual display may be used on computers that do not have a monitor.
|
[doc](./dylib/README.md)
|
||||||
|
|
||||||
[Development reference](https://github.com/pavlobu/deskreen/discussions/86)
|
|
||||||
|
|
||||||
## windows
|
|
||||||
|
|
||||||
### win10
|
|
||||||
|
|
||||||
Win10 provides [Indirect Display Driver Model](https://msdn.microsoft.com/en-us/library/windows/hardware/mt761968(v=vs.85).aspx).
|
|
||||||
|
|
||||||
This lib uses [this project](https://github.com/fufesou/RustDeskIddDriver) as the driver.
|
|
||||||
|
|
||||||
|
|
||||||
**NOTE**: Versions before Win10 1607. Try follow [this method](https://github.com/fanxiushu/xdisp_virt/tree/master/indirect_display).
|
|
||||||
|
|
||||||
|
|
||||||
#### tested platforms
|
|
||||||
|
|
||||||
- [x] 19041
|
|
||||||
- [x] 19043
|
|
||||||
|
|
||||||
### win7
|
|
||||||
|
|
||||||
TODO
|
|
||||||
|
|
||||||
[WDDM](https://docs.microsoft.com/en-us/windows-hardware/drivers/display/windows-vista-display-driver-model-design-guide).
|
|
||||||
|
|
||||||
## X11
|
|
||||||
|
|
||||||
## OSX
|
|
||||||
|
|||||||
19
libs/virtual_display/dylib/Cargo.toml
Normal file
19
libs/virtual_display/dylib/Cargo.toml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
[package]
|
||||||
|
name = "dylib_virtual_display"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
crate-type = ["cdylib", "staticlib", "rlib"]
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
cc = "1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
thiserror = "1.0.30"
|
||||||
|
lazy_static = "1.4"
|
||||||
|
serde = "1.0"
|
||||||
|
serde_derive = "1.0"
|
||||||
|
hbb_common = { path = "../../hbb_common" }
|
||||||
32
libs/virtual_display/dylib/README.md
Normal file
32
libs/virtual_display/dylib/README.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# virtual display
|
||||||
|
|
||||||
|
Virtual display may be used on computers that do not have a monitor.
|
||||||
|
|
||||||
|
[Development reference](https://github.com/pavlobu/deskreen/discussions/86)
|
||||||
|
|
||||||
|
## windows
|
||||||
|
|
||||||
|
### win10
|
||||||
|
|
||||||
|
Win10 provides [Indirect Display Driver Model](https://msdn.microsoft.com/en-us/library/windows/hardware/mt761968(v=vs.85).aspx).
|
||||||
|
|
||||||
|
This lib uses [this project](https://github.com/fufesou/RustDeskIddDriver) as the driver.
|
||||||
|
|
||||||
|
|
||||||
|
**NOTE**: Versions before Win10 1607. Try follow [this method](https://github.com/fanxiushu/xdisp_virt/tree/master/indirect_display).
|
||||||
|
|
||||||
|
|
||||||
|
#### tested platforms
|
||||||
|
|
||||||
|
- [x] 19041
|
||||||
|
- [x] 19043
|
||||||
|
|
||||||
|
### win7
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
[WDDM](https://docs.microsoft.com/en-us/windows-hardware/drivers/display/windows-vista-display-driver-model-design-guide).
|
||||||
|
|
||||||
|
## X11
|
||||||
|
|
||||||
|
## OSX
|
||||||
@ -13,7 +13,7 @@ fn build_c_impl() {
|
|||||||
|
|
||||||
if build.get_compiler().is_like_msvc() {
|
if build.get_compiler().is_like_msvc() {
|
||||||
build.define("WIN32", "");
|
build.define("WIN32", "");
|
||||||
build.flag("-Zi");
|
build.flag("-Z7");
|
||||||
build.flag("-GR-");
|
build.flag("-GR-");
|
||||||
// build.flag("-std:c++11");
|
// build.flag("-std:c++11");
|
||||||
} else {
|
} else {
|
||||||
@ -24,7 +24,7 @@ fn build_c_impl() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
build.compile("xxx");
|
build.compile("win_virtual_display");
|
||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
println!("cargo:rerun-if-changed=src/win10/IddController.c");
|
println!("cargo:rerun-if-changed=src/win10/IddController.c");
|
||||||
@ -1,5 +1,5 @@
|
|||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
use virtual_display::win10::{idd, DRIVER_INSTALL_PATH};
|
use dylib_virtual_display::win10::{idd, DRIVER_INSTALL_PATH};
|
||||||
|
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
use std::{
|
use std::{
|
||||||
207
libs/virtual_display/dylib/src/lib.rs
Normal file
207
libs/virtual_display/dylib/src/lib.rs
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
#[cfg(windows)]
|
||||||
|
pub mod win10;
|
||||||
|
|
||||||
|
use hbb_common::{bail, lazy_static, ResultType};
|
||||||
|
use std::{path::Path, sync::Mutex};
|
||||||
|
|
||||||
|
lazy_static::lazy_static! {
|
||||||
|
// If device is uninstalled though "Device Manager" Window.
|
||||||
|
// Rustdesk is unable to handle device any more...
|
||||||
|
static ref H_SW_DEVICE: Mutex<u64> = Mutex::new(0);
|
||||||
|
static ref MONITOR_PLUGIN: Mutex<Vec<u32>> = Mutex::new(Vec::new());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
#[cfg(windows)]
|
||||||
|
pub fn get_dirver_install_path() -> &'static str {
|
||||||
|
win10::DRIVER_INSTALL_PATH
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn download_driver() -> ResultType<()> {
|
||||||
|
#[cfg(windows)]
|
||||||
|
let _download_url = win10::DRIVER_DOWNLOAD_URL;
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
let _download_url = "";
|
||||||
|
|
||||||
|
// process download and report progress
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn install_update_driver(_reboot_required: &mut bool) -> ResultType<()> {
|
||||||
|
#[cfg(windows)]
|
||||||
|
let install_path = win10::DRIVER_INSTALL_PATH;
|
||||||
|
#[cfg(not(windows))]
|
||||||
|
let install_path = "";
|
||||||
|
|
||||||
|
let abs_path = Path::new(install_path).canonicalize()?;
|
||||||
|
if !abs_path.exists() {
|
||||||
|
bail!("{} not exists", install_path)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(windows)]
|
||||||
|
unsafe {
|
||||||
|
{
|
||||||
|
// Device must be created before install driver.
|
||||||
|
// https://github.com/fufesou/RustDeskIddDriver/issues/1
|
||||||
|
if let Err(e) = create_device() {
|
||||||
|
bail!("{}", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
let full_install_path: Vec<u16> = abs_path
|
||||||
|
.to_string_lossy()
|
||||||
|
.as_ref()
|
||||||
|
.encode_utf16()
|
||||||
|
.chain(Some(0).into_iter())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let mut reboot_required_tmp = win10::idd::FALSE;
|
||||||
|
if win10::idd::InstallUpdate(full_install_path.as_ptr() as _, &mut reboot_required_tmp)
|
||||||
|
== win10::idd::FALSE
|
||||||
|
{
|
||||||
|
bail!("{}", win10::get_last_msg()?);
|
||||||
|
}
|
||||||
|
*_reboot_required = reboot_required_tmp == win10::idd::TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn uninstall_driver(_reboot_required: &mut bool) -> ResultType<()> {
|
||||||
|
#[cfg(windows)]
|
||||||
|
let install_path = win10::DRIVER_INSTALL_PATH;
|
||||||
|
#[cfg(not(windows))]
|
||||||
|
let install_path = "";
|
||||||
|
|
||||||
|
let abs_path = Path::new(install_path).canonicalize()?;
|
||||||
|
if !abs_path.exists() {
|
||||||
|
bail!("{} not exists", install_path)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(windows)]
|
||||||
|
unsafe {
|
||||||
|
{
|
||||||
|
let full_install_path: Vec<u16> = abs_path
|
||||||
|
.to_string_lossy()
|
||||||
|
.as_ref()
|
||||||
|
.encode_utf16()
|
||||||
|
.chain(Some(0).into_iter())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let mut reboot_required_tmp = win10::idd::FALSE;
|
||||||
|
if win10::idd::Uninstall(full_install_path.as_ptr() as _, &mut reboot_required_tmp)
|
||||||
|
== win10::idd::FALSE
|
||||||
|
{
|
||||||
|
bail!("{}", win10::get_last_msg()?);
|
||||||
|
}
|
||||||
|
*_reboot_required = reboot_required_tmp == win10::idd::TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn is_device_created() -> bool {
|
||||||
|
#[cfg(windows)]
|
||||||
|
return *H_SW_DEVICE.lock().unwrap() != 0;
|
||||||
|
#[cfg(not(windows))]
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn create_device() -> ResultType<()> {
|
||||||
|
if is_device_created() {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
#[cfg(windows)]
|
||||||
|
unsafe {
|
||||||
|
let mut lock_device = H_SW_DEVICE.lock().unwrap();
|
||||||
|
let mut h_sw_device = *lock_device as win10::idd::HSWDEVICE;
|
||||||
|
if win10::idd::DeviceCreate(&mut h_sw_device) == win10::idd::FALSE {
|
||||||
|
bail!("{}", win10::get_last_msg()?);
|
||||||
|
} else {
|
||||||
|
*lock_device = h_sw_device as u64;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn close_device() {
|
||||||
|
#[cfg(windows)]
|
||||||
|
unsafe {
|
||||||
|
win10::idd::DeviceClose(*H_SW_DEVICE.lock().unwrap() as win10::idd::HSWDEVICE);
|
||||||
|
*H_SW_DEVICE.lock().unwrap() = 0;
|
||||||
|
MONITOR_PLUGIN.lock().unwrap().clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn plug_in_monitor() -> ResultType<()> {
|
||||||
|
#[cfg(windows)]
|
||||||
|
unsafe {
|
||||||
|
let monitor_index = 0 as u32;
|
||||||
|
let mut plug_in_monitors = MONITOR_PLUGIN.lock().unwrap();
|
||||||
|
for i in 0..plug_in_monitors.len() {
|
||||||
|
if let Some(d) = plug_in_monitors.get(i) {
|
||||||
|
if *d == monitor_index {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if win10::idd::MonitorPlugIn(monitor_index, 0, 30) == win10::idd::FALSE {
|
||||||
|
bail!("{}", win10::get_last_msg()?);
|
||||||
|
}
|
||||||
|
(*plug_in_monitors).push(monitor_index);
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn plug_out_monitor() -> ResultType<()> {
|
||||||
|
#[cfg(windows)]
|
||||||
|
unsafe {
|
||||||
|
let monitor_index = 0 as u32;
|
||||||
|
if win10::idd::MonitorPlugOut(monitor_index) == win10::idd::FALSE {
|
||||||
|
bail!("{}", win10::get_last_msg()?);
|
||||||
|
}
|
||||||
|
let mut plug_in_monitors = MONITOR_PLUGIN.lock().unwrap();
|
||||||
|
for i in 0..plug_in_monitors.len() {
|
||||||
|
if let Some(d) = plug_in_monitors.get(i) {
|
||||||
|
if *d == monitor_index {
|
||||||
|
plug_in_monitors.remove(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn update_monitor_modes() -> ResultType<()> {
|
||||||
|
#[cfg(windows)]
|
||||||
|
unsafe {
|
||||||
|
let monitor_index = 0 as u32;
|
||||||
|
let mut modes = vec![win10::idd::MonitorMode {
|
||||||
|
width: 1920,
|
||||||
|
height: 1080,
|
||||||
|
sync: 60,
|
||||||
|
}];
|
||||||
|
if win10::idd::FALSE
|
||||||
|
== win10::idd::MonitorModesUpdate(
|
||||||
|
monitor_index as win10::idd::UINT,
|
||||||
|
modes.len() as win10::idd::UINT,
|
||||||
|
modes.as_mut_ptr(),
|
||||||
|
)
|
||||||
|
{
|
||||||
|
bail!("{}", win10::get_last_msg()?);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
@ -1,192 +1,125 @@
|
|||||||
#[cfg(windows)]
|
use hbb_common::{bail, ResultType};
|
||||||
pub mod win10;
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
use hbb_common::{bail, lazy_static, ResultType};
|
const LIB_NAME_VIRTUAL_DISPLAY: &str = "dylib_virtual_display";
|
||||||
use std::{path::Path, sync::Mutex};
|
|
||||||
|
|
||||||
lazy_static::lazy_static! {
|
lazy_static::lazy_static! {
|
||||||
// If device is uninstalled though "Device Manager" Window.
|
static ref LIB_VIRTUAL_DISPLAY: Arc<Mutex<Result<libloading::Library, libloading::Error>>> = {
|
||||||
// Rustdesk is unable to handle device any more...
|
Arc::new(Mutex::new(unsafe { libloading::Library::new(get_lib_name()) }))
|
||||||
static ref H_SW_DEVICE: Mutex<u64> = Mutex::new(0);
|
};
|
||||||
static ref MONITOR_PLUGIN: Mutex<Vec<u32>> = Mutex::new(Vec::new());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn download_driver() -> ResultType<()> {
|
#[cfg(target_os = "windows")]
|
||||||
#[cfg(windows)]
|
fn get_lib_name() -> String {
|
||||||
let _download_url = win10::DRIVER_DOWNLOAD_URL;
|
format!("{}.dll", LIB_NAME_VIRTUAL_DISPLAY)
|
||||||
#[cfg(target_os = "linux")]
|
|
||||||
let _download_url = "";
|
|
||||||
|
|
||||||
// process download and report progress
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn install_update_driver(_reboot_required: &mut bool) -> ResultType<()> {
|
#[cfg(target_os = "linux")]
|
||||||
#[cfg(windows)]
|
fn get_lib_name() -> String {
|
||||||
let install_path = win10::DRIVER_INSTALL_PATH;
|
format!("lib{}.so", LIB_NAME_VIRTUAL_DISPLAY)
|
||||||
#[cfg(not(windows))]
|
|
||||||
let install_path = "";
|
|
||||||
|
|
||||||
let abs_path = Path::new(install_path).canonicalize()?;
|
|
||||||
if !abs_path.exists() {
|
|
||||||
bail!("{} not exists", install_path)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(windows)]
|
|
||||||
unsafe {
|
|
||||||
{
|
|
||||||
// Device must be created before install driver.
|
|
||||||
// https://github.com/fufesou/RustDeskIddDriver/issues/1
|
|
||||||
if let Err(e) = create_device() {
|
|
||||||
bail!("{}", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
let full_install_path: Vec<u16> = abs_path
|
|
||||||
.to_string_lossy()
|
|
||||||
.as_ref()
|
|
||||||
.encode_utf16()
|
|
||||||
.chain(Some(0).into_iter())
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
let mut reboot_required_tmp = win10::idd::FALSE;
|
|
||||||
if win10::idd::InstallUpdate(full_install_path.as_ptr() as _, &mut reboot_required_tmp)
|
|
||||||
== win10::idd::FALSE
|
|
||||||
{
|
|
||||||
bail!("{}", win10::get_last_msg()?);
|
|
||||||
}
|
|
||||||
*_reboot_required = reboot_required_tmp == win10::idd::TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn uninstall_driver(_reboot_required: &mut bool) -> ResultType<()> {
|
#[cfg(target_os = "macos")]
|
||||||
#[cfg(windows)]
|
fn get_lib_name() -> String {
|
||||||
let install_path = win10::DRIVER_INSTALL_PATH;
|
format!("lib{}.dylib", LIB_NAME_VIRTUAL_DISPLAY)
|
||||||
#[cfg(not(windows))]
|
}
|
||||||
let install_path = "";
|
|
||||||
|
|
||||||
let abs_path = Path::new(install_path).canonicalize()?;
|
fn try_reload_lib() {
|
||||||
if !abs_path.exists() {
|
let mut lock = LIB_VIRTUAL_DISPLAY.lock().unwrap();
|
||||||
bail!("{} not exists", install_path)
|
if lock.is_err() {
|
||||||
|
*lock = unsafe { libloading::Library::new(get_lib_name()) };
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
unsafe {
|
pub fn get_dirver_install_path() -> ResultType<&'static str> {
|
||||||
{
|
try_reload_lib();
|
||||||
let full_install_path: Vec<u16> = abs_path
|
match &*LIB_VIRTUAL_DISPLAY.lock().unwrap() {
|
||||||
.to_string_lossy()
|
Ok(lib) => unsafe {
|
||||||
.as_ref()
|
match lib.get::<libloading::Symbol<fn() -> &'static str>>(b"get_dirver_install_path") {
|
||||||
.encode_utf16()
|
Ok(func) => Ok(func()),
|
||||||
.chain(Some(0).into_iter())
|
Err(e) => bail!("Failed to load func get_dirver_install_path, {}", e),
|
||||||
.collect();
|
|
||||||
|
|
||||||
let mut reboot_required_tmp = win10::idd::FALSE;
|
|
||||||
if win10::idd::Uninstall(full_install_path.as_ptr() as _, &mut reboot_required_tmp)
|
|
||||||
== win10::idd::FALSE
|
|
||||||
{
|
|
||||||
bail!("{}", win10::get_last_msg()?);
|
|
||||||
}
|
}
|
||||||
*_reboot_required = reboot_required_tmp == win10::idd::TRUE;
|
},
|
||||||
}
|
Err(e) => bail!("Failed to load library {}, {}", LIB_NAME_VIRTUAL_DISPLAY, e),
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_device_created() -> bool {
|
pub fn is_device_created() -> bool {
|
||||||
#[cfg(windows)]
|
try_reload_lib();
|
||||||
return *H_SW_DEVICE.lock().unwrap() != 0;
|
match &*LIB_VIRTUAL_DISPLAY.lock().unwrap() {
|
||||||
#[cfg(not(windows))]
|
Ok(lib) => unsafe {
|
||||||
return false;
|
match lib.get::<libloading::Symbol<fn() -> bool>>(b"is_device_created") {
|
||||||
}
|
Ok(func) => func(),
|
||||||
|
Err(..) => false,
|
||||||
pub fn create_device() -> ResultType<()> {
|
}
|
||||||
if is_device_created() {
|
},
|
||||||
return Ok(());
|
Err(..) => false,
|
||||||
}
|
}
|
||||||
#[cfg(windows)]
|
|
||||||
unsafe {
|
|
||||||
let mut lock_device = H_SW_DEVICE.lock().unwrap();
|
|
||||||
let mut h_sw_device = *lock_device as win10::idd::HSWDEVICE;
|
|
||||||
if win10::idd::DeviceCreate(&mut h_sw_device) == win10::idd::FALSE {
|
|
||||||
bail!("{}", win10::get_last_msg()?);
|
|
||||||
} else {
|
|
||||||
*lock_device = h_sw_device as u64;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn close_device() {
|
pub fn close_device() {
|
||||||
#[cfg(windows)]
|
try_reload_lib();
|
||||||
unsafe {
|
match &*LIB_VIRTUAL_DISPLAY.lock().unwrap() {
|
||||||
win10::idd::DeviceClose(*H_SW_DEVICE.lock().unwrap() as win10::idd::HSWDEVICE);
|
Ok(lib) => unsafe {
|
||||||
*H_SW_DEVICE.lock().unwrap() = 0;
|
match lib.get::<libloading::Symbol<fn()>>(b"close_device") {
|
||||||
MONITOR_PLUGIN.lock().unwrap().clear();
|
Ok(func) => func(),
|
||||||
|
Err(..) => {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Err(..) => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn plug_in_monitor() -> ResultType<()> {
|
macro_rules! def_func_result {
|
||||||
#[cfg(windows)]
|
($func:ident, $name: tt) => {
|
||||||
unsafe {
|
pub fn $func() -> ResultType<()> {
|
||||||
let monitor_index = 0 as u32;
|
try_reload_lib();
|
||||||
let mut plug_in_monitors = MONITOR_PLUGIN.lock().unwrap();
|
match &*LIB_VIRTUAL_DISPLAY.lock().unwrap() {
|
||||||
for i in 0..plug_in_monitors.len() {
|
Ok(lib) => unsafe {
|
||||||
if let Some(d) = plug_in_monitors.get(i) {
|
match lib.get::<libloading::Symbol<fn() -> ResultType<()>>>($name.as_bytes()) {
|
||||||
if *d == monitor_index {
|
Ok(func) => func(),
|
||||||
return Ok(());
|
Err(e) => bail!("Failed to load func {}, {}", $name, e),
|
||||||
}
|
}
|
||||||
};
|
},
|
||||||
|
Err(e) => bail!("Failed to load library {}, {}", LIB_NAME_VIRTUAL_DISPLAY, e),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if win10::idd::MonitorPlugIn(monitor_index, 0, 30) == win10::idd::FALSE {
|
};
|
||||||
bail!("{}", win10::get_last_msg()?);
|
|
||||||
}
|
|
||||||
(*plug_in_monitors).push(monitor_index);
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn plug_out_monitor() -> ResultType<()> {
|
pub fn install_update_driver(reboot_required: &mut bool) -> ResultType<()> {
|
||||||
#[cfg(windows)]
|
try_reload_lib();
|
||||||
unsafe {
|
match &*LIB_VIRTUAL_DISPLAY.lock().unwrap() {
|
||||||
let monitor_index = 0 as u32;
|
Ok(lib) => unsafe {
|
||||||
if win10::idd::MonitorPlugOut(monitor_index) == win10::idd::FALSE {
|
match lib.get::<libloading::Symbol<fn(&mut bool) -> ResultType<()>>>(
|
||||||
bail!("{}", win10::get_last_msg()?);
|
b"install_update_driver",
|
||||||
}
|
) {
|
||||||
let mut plug_in_monitors = MONITOR_PLUGIN.lock().unwrap();
|
Ok(func) => func(reboot_required),
|
||||||
for i in 0..plug_in_monitors.len() {
|
Err(e) => bail!("Failed to load func install_update_driver, {}", e),
|
||||||
if let Some(d) = plug_in_monitors.get(i) {
|
}
|
||||||
if *d == monitor_index {
|
},
|
||||||
plug_in_monitors.remove(i);
|
Err(e) => bail!("Failed to load library {}, {}", LIB_NAME_VIRTUAL_DISPLAY, e),
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_monitor_modes() -> ResultType<()> {
|
pub fn uninstall_driver(reboot_required: &mut bool) -> ResultType<()> {
|
||||||
#[cfg(windows)]
|
try_reload_lib();
|
||||||
unsafe {
|
match &*LIB_VIRTUAL_DISPLAY.lock().unwrap() {
|
||||||
let monitor_index = 0 as u32;
|
Ok(lib) => unsafe {
|
||||||
let mut modes = vec![win10::idd::MonitorMode {
|
match lib
|
||||||
width: 1920,
|
.get::<libloading::Symbol<fn(&mut bool) -> ResultType<()>>>(b"uninstall_driver")
|
||||||
height: 1080,
|
{
|
||||||
sync: 60,
|
Ok(func) => func(reboot_required),
|
||||||
}];
|
Err(e) => bail!("Failed to load func uninstall_driver, {}", e),
|
||||||
if win10::idd::FALSE
|
}
|
||||||
== win10::idd::MonitorModesUpdate(
|
},
|
||||||
monitor_index as win10::idd::UINT,
|
Err(e) => bail!("Failed to load library {}, {}", LIB_NAME_VIRTUAL_DISPLAY, e),
|
||||||
modes.len() as win10::idd::UINT,
|
|
||||||
modes.as_mut_ptr(),
|
|
||||||
)
|
|
||||||
{
|
|
||||||
bail!("{}", win10::get_last_msg()?);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def_func_result!(download_driver, "download_driver");
|
||||||
|
def_func_result!(create_device, "create_device");
|
||||||
|
def_func_result!(plug_in_monitor, "plug_in_monitor");
|
||||||
|
def_func_result!(plug_out_monitor, "plug_out_monitor");
|
||||||
|
def_func_result!(update_monitor_modes, "update_monitor_modes");
|
||||||
|
|||||||
@ -3,8 +3,8 @@ Version: 1.2.0
|
|||||||
Release: 0
|
Release: 0
|
||||||
Summary: RPM package
|
Summary: RPM package
|
||||||
License: GPL-3.0
|
License: GPL-3.0
|
||||||
Requires: gtk3 libxcb libxdo libXfixes pipewire alsa-lib curl libappindicator libvdpau1 libva2
|
Requires: gtk3 libxcb libxdo libXfixes pipewire alsa-lib curl libappindicator-gtk3 libvdpau libva
|
||||||
|
Provides: libdesktop_drop_plugin.so()(64bit), libdesktop_multi_window_plugin.so()(64bit), libflutter_custom_cursor_plugin.so()(64bit), libflutter_linux_gtk.so()(64bit), libscreen_retriever_plugin.so()(64bit), libtray_manager_plugin.so()(64bit), liburl_launcher_linux_plugin.so()(64bit), libwindow_manager_plugin.so()(64bit), libwindow_size_plugin.so()(64bit)
|
||||||
|
|
||||||
%description
|
%description
|
||||||
The best open-source remote desktop client software, written in Rust.
|
The best open-source remote desktop client software, written in Rust.
|
||||||
@ -19,17 +19,14 @@ The best open-source remote desktop client software, written in Rust.
|
|||||||
|
|
||||||
%install
|
%install
|
||||||
|
|
||||||
mkdir -p "${buildroot}/usr/lib/rustdesk" && cp -r ${HBB}/flutter/build/linux/x64/release/bundle/* -t "${buildroot}/usr/lib/rustdesk"
|
mkdir -p "%{buildroot}/usr/lib/rustdesk" && cp -r ${HBB}/flutter/build/linux/x64/release/bundle/* -t "%{buildroot}/usr/lib/rustdesk"
|
||||||
mkdir -p "${buildroot}/usr/bin"
|
mkdir -p "%{buildroot}/usr/bin"
|
||||||
pushd ${buildroot} && ln -s /usr/lib/rustdesk/rustdesk usr/bin/rustdesk && popd
|
install -Dm 644 $HBB/res/rustdesk.service -t "%{buildroot}/usr/share/rustdesk/files"
|
||||||
install -Dm 644 $HBB/res/rustdesk.service -t "${buildroot}/usr/share/rustdesk/files"
|
install -Dm 644 $HBB/res/rustdesk.desktop -t "%{buildroot}/usr/share/rustdesk/files"
|
||||||
install -Dm 644 $HBB/res/rustdesk.desktop -t "${buildroot}/usr/share/rustdesk/files"
|
install -Dm 644 $HBB/res/rustdesk-link.desktop -t "%{buildroot}/usr/share/rustdesk/files"
|
||||||
install -Dm 644 $HBB/res/rustdesk-link.desktop -t "${buildroot}/usr/share/rustdesk/files"
|
install -Dm 644 $HBB/res/128x128@2x.png "%{buildroot}/usr/share/rustdesk/files/rustdesk.png"
|
||||||
install -Dm 644 $HBB/res/128x128@2x.png "${buildroot}/usr/share/rustdesk/files/rustdesk.png"
|
|
||||||
|
|
||||||
|
|
||||||
%files
|
%files
|
||||||
/usr/bin/rustdesk
|
|
||||||
/usr/lib/rustdesk/*
|
/usr/lib/rustdesk/*
|
||||||
/usr/share/rustdesk/files/rustdesk.service
|
/usr/share/rustdesk/files/rustdesk.service
|
||||||
/usr/share/rustdesk/files/rustdesk.png
|
/usr/share/rustdesk/files/rustdesk.png
|
||||||
@ -56,6 +53,7 @@ esac
|
|||||||
cp /usr/share/rustdesk/files/rustdesk.service /etc/systemd/system/rustdesk.service
|
cp /usr/share/rustdesk/files/rustdesk.service /etc/systemd/system/rustdesk.service
|
||||||
cp /usr/share/rustdesk/files/rustdesk.desktop /usr/share/applications/
|
cp /usr/share/rustdesk/files/rustdesk.desktop /usr/share/applications/
|
||||||
cp /usr/share/rustdesk/files/rustdesk-link.desktop /usr/share/applications/
|
cp /usr/share/rustdesk/files/rustdesk-link.desktop /usr/share/applications/
|
||||||
|
ln -s /usr/lib/rustdesk/rustdesk /usr/bin/rustdesk
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl enable rustdesk
|
systemctl enable rustdesk
|
||||||
systemctl start rustdesk
|
systemctl start rustdesk
|
||||||
@ -80,6 +78,7 @@ case "$1" in
|
|||||||
# for uninstall
|
# for uninstall
|
||||||
rm /usr/share/applications/rustdesk.desktop || true
|
rm /usr/share/applications/rustdesk.desktop || true
|
||||||
rm /usr/share/applications/rustdesk-link.desktop || true
|
rm /usr/share/applications/rustdesk-link.desktop || true
|
||||||
|
rm /usr/bin/rustdesk || true
|
||||||
update-desktop-database
|
update-desktop-database
|
||||||
;;
|
;;
|
||||||
1)
|
1)
|
||||||
|
|||||||
@ -6,6 +6,7 @@ use cpal::{
|
|||||||
};
|
};
|
||||||
use magnum_opus::{Channels::*, Decoder as AudioDecoder};
|
use magnum_opus::{Channels::*, Decoder as AudioDecoder};
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::{Digest, Sha256};
|
||||||
|
#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))]
|
||||||
use std::sync::atomic::Ordering;
|
use std::sync::atomic::Ordering;
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
@ -973,6 +974,8 @@ impl LoginConfigHandler {
|
|||||||
self.save_config(config);
|
self.save_config(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//to-do: too many dup code below.
|
||||||
|
|
||||||
/// Save view style to the current config.
|
/// Save view style to the current config.
|
||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
@ -984,6 +987,43 @@ impl LoginConfigHandler {
|
|||||||
self.save_config(config);
|
self.save_config(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Save scroll style to the current config.
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `value` - The view style to be saved.
|
||||||
|
pub fn save_scroll_style(&mut self, value: String) {
|
||||||
|
let mut config = self.load_config();
|
||||||
|
config.scroll_style = value;
|
||||||
|
self.save_config(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set a ui config of flutter for handler's [`PeerConfig`].
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `k` - key of option
|
||||||
|
/// * `v` - value of option
|
||||||
|
pub fn save_ui_flutter(&mut self, k: String, v: String) {
|
||||||
|
let mut config = self.load_config();
|
||||||
|
config.ui_flutter.insert(k, v);
|
||||||
|
self.save_config(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get a ui config of flutter for handler's [`PeerConfig`].
|
||||||
|
/// Return String if the option is found, otherwise return "".
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `k` - key of option
|
||||||
|
pub fn get_ui_flutter(&self, k: &str) -> String {
|
||||||
|
if let Some(v) = self.config.ui_flutter.get(k) {
|
||||||
|
v.clone()
|
||||||
|
} else {
|
||||||
|
"".to_owned()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Toggle an option in the handler.
|
/// Toggle an option in the handler.
|
||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
@ -1100,6 +1140,9 @@ impl LoginConfigHandler {
|
|||||||
msg.custom_image_quality = quality << 8;
|
msg.custom_image_quality = quality << 8;
|
||||||
n += 1;
|
n += 1;
|
||||||
}
|
}
|
||||||
|
if let Some(custom_fps) = self.options.get("custom-fps") {
|
||||||
|
msg.custom_fps = custom_fps.parse().unwrap_or(30);
|
||||||
|
}
|
||||||
if self.get_toggle_option("show-remote-cursor") {
|
if self.get_toggle_option("show-remote-cursor") {
|
||||||
msg.show_remote_cursor = BoolOption::Yes.into();
|
msg.show_remote_cursor = BoolOption::Yes.into();
|
||||||
n += 1;
|
n += 1;
|
||||||
@ -1294,6 +1337,15 @@ impl LoginConfigHandler {
|
|||||||
self.password = Default::default();
|
self.password = Default::default();
|
||||||
interface.msgbox("re-input-password", err, "Do you want to enter again?", "");
|
interface.msgbox("re-input-password", err, "Do you want to enter again?", "");
|
||||||
true
|
true
|
||||||
|
} else if err == "No Password Access" {
|
||||||
|
self.password = Default::default();
|
||||||
|
interface.msgbox(
|
||||||
|
"wait-remote-accept-nook",
|
||||||
|
"Prompt",
|
||||||
|
"Please wait for the remote side to accept your session request...",
|
||||||
|
"",
|
||||||
|
);
|
||||||
|
true
|
||||||
} else {
|
} else {
|
||||||
if err.contains(SCRAP_X11_REQUIRED) {
|
if err.contains(SCRAP_X11_REQUIRED) {
|
||||||
interface.msgbox("error", "Login Error", err, SCRAP_X11_REF_URL);
|
interface.msgbox("error", "Login Error", err, SCRAP_X11_REF_URL);
|
||||||
@ -1391,11 +1443,7 @@ impl LoginConfigHandler {
|
|||||||
username: self.id.clone(),
|
username: self.id.clone(),
|
||||||
password: password.into(),
|
password: password.into(),
|
||||||
my_id,
|
my_id,
|
||||||
my_name: if cfg!(windows) {
|
my_name: crate::username(),
|
||||||
crate::platform::get_active_username()
|
|
||||||
} else {
|
|
||||||
crate::username()
|
|
||||||
},
|
|
||||||
option: self.get_option_message(true).into(),
|
option: self.get_option_message(true).into(),
|
||||||
session_id: self.session_id,
|
session_id: self.session_id,
|
||||||
version: crate::VERSION.to_string(),
|
version: crate::VERSION.to_string(),
|
||||||
@ -1529,13 +1577,37 @@ pub async fn handle_test_delay(t: TestDelay, peer: &mut Stream) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Whether is track pad scrolling.
|
||||||
|
#[inline]
|
||||||
|
#[cfg(all(target_os = "macos"))]
|
||||||
|
fn check_scroll_on_mac(mask: i32, x: i32, y: i32) -> bool {
|
||||||
|
// flutter version we set mask type bit to 4 when track pad scrolling.
|
||||||
|
if mask & 7 == 4 {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if mask & 3 != 3 {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
let btn = mask >> 3;
|
||||||
|
if y == -1 {
|
||||||
|
btn != 0xff88 && btn != -0x780000
|
||||||
|
} else if y == 1 {
|
||||||
|
btn != 0x78 && btn != 0x780000
|
||||||
|
} else if x != 0 {
|
||||||
|
// No mouse support horizontal scrolling.
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Send mouse data.
|
/// Send mouse data.
|
||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
///
|
///
|
||||||
/// * `mask` - Mouse event.
|
/// * `mask` - Mouse event.
|
||||||
/// * mask = buttons << 3 | type
|
/// * mask = buttons << 3 | type
|
||||||
/// * type, 1: down, 2: up, 3: wheel
|
/// * type, 1: down, 2: up, 3: wheel, 4: trackpad
|
||||||
/// * buttons, 1: left, 2: right, 4: middle
|
/// * buttons, 1: left, 2: right, 4: middle
|
||||||
/// * `x` - X coordinate.
|
/// * `x` - X coordinate.
|
||||||
/// * `y` - Y coordinate.
|
/// * `y` - Y coordinate.
|
||||||
@ -1574,6 +1646,10 @@ pub fn send_mouse(
|
|||||||
if command {
|
if command {
|
||||||
mouse_event.modifiers.push(ControlKey::Meta.into());
|
mouse_event.modifiers.push(ControlKey::Meta.into());
|
||||||
}
|
}
|
||||||
|
#[cfg(all(target_os = "macos"))]
|
||||||
|
if check_scroll_on_mac(mask, x, y) {
|
||||||
|
mouse_event.modifiers.push(ControlKey::Scroll.into());
|
||||||
|
}
|
||||||
msg_out.set_mouse_event(mouse_event);
|
msg_out.set_mouse_event(mouse_event);
|
||||||
interface.send(Data::Message(msg_out));
|
interface.send(Data::Message(msg_out));
|
||||||
}
|
}
|
||||||
@ -1947,6 +2023,7 @@ fn decode_id_pk(signed: &[u8], key: &sign::PublicKey) -> ResultType<(String, [u8
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))]
|
||||||
pub fn disable_keyboard_listening() {
|
pub fn disable_keyboard_listening() {
|
||||||
crate::ui_session_interface::KEYBOARD_HOOKED.store(true, Ordering::SeqCst);
|
crate::ui_session_interface::KEYBOARD_HOOKED.store(true, Ordering::SeqCst);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,17 +20,14 @@ use hbb_common::fs::{
|
|||||||
use hbb_common::message_proto::permission_info::Permission;
|
use hbb_common::message_proto::permission_info::Permission;
|
||||||
use hbb_common::protobuf::Message as _;
|
use hbb_common::protobuf::Message as _;
|
||||||
use hbb_common::rendezvous_proto::ConnType;
|
use hbb_common::rendezvous_proto::ConnType;
|
||||||
|
#[cfg(windows)]
|
||||||
|
use hbb_common::tokio::sync::Mutex as TokioMutex;
|
||||||
use hbb_common::tokio::{
|
use hbb_common::tokio::{
|
||||||
self,
|
self,
|
||||||
sync::mpsc,
|
sync::mpsc,
|
||||||
sync::Mutex as TokioMutex,
|
|
||||||
time::{self, Duration, Instant, Interval},
|
time::{self, Duration, Instant, Interval},
|
||||||
};
|
};
|
||||||
use hbb_common::{
|
use hbb_common::{allow_err, message_proto::*, sleep};
|
||||||
allow_err,
|
|
||||||
message_proto::*,
|
|
||||||
sleep,
|
|
||||||
};
|
|
||||||
use hbb_common::{fs, log, Stream};
|
use hbb_common::{fs, log, Stream};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
@ -918,13 +915,8 @@ impl<T: InvokeUiSession> Remote<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(file_response::Union::Block(block)) => {
|
Some(file_response::Union::Block(block)) => {
|
||||||
log::info!(
|
|
||||||
"file response block, file id:{}, file num: {}",
|
|
||||||
block.id,
|
|
||||||
block.file_num
|
|
||||||
);
|
|
||||||
if let Some(job) = fs::get_job(block.id, &mut self.write_jobs) {
|
if let Some(job) = fs::get_job(block.id, &mut self.write_jobs) {
|
||||||
if let Err(_err) = job.write(block, None).await {
|
if let Err(_err) = job.write(block).await {
|
||||||
// to-do: add "skip" for writing job
|
// to-do: add "skip" for writing job
|
||||||
}
|
}
|
||||||
self.update_jobs_status();
|
self.update_jobs_status();
|
||||||
@ -997,23 +989,31 @@ impl<T: InvokeUiSession> Remote<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(misc::Union::Uac(uac)) => {
|
Some(misc::Union::Uac(uac)) => {
|
||||||
|
let msgtype = "custom-uac-nocancel";
|
||||||
|
let title = "Prompt";
|
||||||
|
let text = "Please wait for confirmation of UAC...";
|
||||||
|
let link = "";
|
||||||
if uac {
|
if uac {
|
||||||
self.handler.msgbox(
|
self.handler.msgbox(msgtype, title, text, link);
|
||||||
"custom-uac-nocancel",
|
} else {
|
||||||
"Warning",
|
self.handler
|
||||||
"uac_warning",
|
.cancel_msgbox(
|
||||||
"",
|
&format!("{}-{}-{}-{}", msgtype, title, text, link,),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(misc::Union::ForegroundWindowElevated(elevated)) => {
|
Some(misc::Union::ForegroundWindowElevated(elevated)) => {
|
||||||
|
let msgtype = "custom-elevated-foreground-nocancel";
|
||||||
|
let title = "Prompt";
|
||||||
|
let text = "elevated_foreground_window_tip";
|
||||||
|
let link = "";
|
||||||
if elevated {
|
if elevated {
|
||||||
self.handler.msgbox(
|
self.handler.msgbox(msgtype, title, text, link);
|
||||||
"custom-elevated-foreground-nocancel",
|
} else {
|
||||||
"Warning",
|
self.handler
|
||||||
"elevated_foreground_window_warning",
|
.cancel_msgbox(
|
||||||
"",
|
&format!("{}-{}-{}-{}", msgtype, title, text, link,),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
@ -1187,7 +1187,7 @@ impl<T: InvokeUiSession> Remote<T> {
|
|||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
fn handle_cliprdr_msg(&self, clip: hbb_common::message_proto::Cliprdr) {
|
fn handle_cliprdr_msg(&self, clip: hbb_common::message_proto::Cliprdr) {
|
||||||
if !self.handler.lc.read().unwrap().disable_clipboard {
|
if !self.handler.lc.read().unwrap().disable_clipboard {
|
||||||
#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))]
|
#[cfg(feature = "flutter")]
|
||||||
if let Some(hbb_common::message_proto::cliprdr::Union::FormatList(_)) = &clip.union {
|
if let Some(hbb_common::message_proto::cliprdr::Union::FormatList(_)) = &clip.union {
|
||||||
if self.client_conn_id
|
if self.client_conn_id
|
||||||
!= clipboard::get_client_conn_id(&crate::flutter::get_cur_session_id())
|
!= clipboard::get_client_conn_id(&crate::flutter::get_cur_session_id())
|
||||||
|
|||||||
@ -6,10 +6,12 @@ use std::{
|
|||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
pub use arboard::Clipboard as ClipboardContext;
|
pub use arboard::Clipboard as ClipboardContext;
|
||||||
|
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
use hbb_common::compress::decompress;
|
||||||
use hbb_common::{
|
use hbb_common::{
|
||||||
allow_err,
|
allow_err,
|
||||||
anyhow::bail,
|
anyhow::bail,
|
||||||
compress::{compress as compress_func, decompress},
|
compress::{compress as compress_func},
|
||||||
config::{self, Config, COMPRESS_LEVEL, RENDEZVOUS_TIMEOUT},
|
config::{self, Config, COMPRESS_LEVEL, RENDEZVOUS_TIMEOUT},
|
||||||
get_version_number, log,
|
get_version_number, log,
|
||||||
message_proto::*,
|
message_proto::*,
|
||||||
|
|||||||
@ -1,6 +1,10 @@
|
|||||||
use hbb_common::log;
|
use hbb_common::log;
|
||||||
|
|
||||||
// shared by flutter and sciter main function
|
/// shared by flutter and sciter main function
|
||||||
|
///
|
||||||
|
/// [Note]
|
||||||
|
/// If it returns [`None`], then the process will terminate, and flutter gui will not be started.
|
||||||
|
/// If it returns [`Some`], then the process will continue, and flutter gui will be started.
|
||||||
pub fn core_main() -> Option<Vec<String>> {
|
pub fn core_main() -> Option<Vec<String>> {
|
||||||
// https://docs.rs/flexi_logger/latest/flexi_logger/error_info/index.html#write
|
// https://docs.rs/flexi_logger/latest/flexi_logger/error_info/index.html#write
|
||||||
// though async logger more efficient, but it also causes more problems, disable it for now
|
// though async logger more efficient, but it also causes more problems, disable it for now
|
||||||
@ -10,6 +14,7 @@ pub fn core_main() -> Option<Vec<String>> {
|
|||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
let mut _is_elevate = false;
|
let mut _is_elevate = false;
|
||||||
let mut _is_run_as_system = false;
|
let mut _is_run_as_system = false;
|
||||||
|
let mut _is_quick_support = false;
|
||||||
let mut _is_flutter_connect = false;
|
let mut _is_flutter_connect = false;
|
||||||
let mut arg_exe = Default::default();
|
let mut arg_exe = Default::default();
|
||||||
for arg in std::env::args() {
|
for arg in std::env::args() {
|
||||||
@ -25,6 +30,8 @@ pub fn core_main() -> Option<Vec<String>> {
|
|||||||
_is_elevate = true;
|
_is_elevate = true;
|
||||||
} else if arg == "--run-as-system" {
|
} else if arg == "--run-as-system" {
|
||||||
_is_run_as_system = true;
|
_is_run_as_system = true;
|
||||||
|
} else if arg == "--quick_support" {
|
||||||
|
_is_quick_support = true;
|
||||||
} else {
|
} else {
|
||||||
args.push(arg);
|
args.push(arg);
|
||||||
}
|
}
|
||||||
@ -36,6 +43,11 @@ pub fn core_main() -> Option<Vec<String>> {
|
|||||||
return core_main_invoke_new_connection(std::env::args());
|
return core_main_invoke_new_connection(std::env::args());
|
||||||
}
|
}
|
||||||
let click_setup = cfg!(windows) && args.is_empty() && crate::common::is_setup(&arg_exe);
|
let click_setup = cfg!(windows) && args.is_empty() && crate::common::is_setup(&arg_exe);
|
||||||
|
#[cfg(not(feature = "flutter"))]
|
||||||
|
{
|
||||||
|
_is_quick_support =
|
||||||
|
cfg!(windows) && args.is_empty() && arg_exe.to_lowercase().ends_with("qs.exe");
|
||||||
|
}
|
||||||
if click_setup {
|
if click_setup {
|
||||||
args.push("--install".to_owned());
|
args.push("--install".to_owned());
|
||||||
flutter_args.push("--install".to_string());
|
flutter_args.push("--install".to_string());
|
||||||
@ -76,6 +88,22 @@ pub fn core_main() -> Option<Vec<String>> {
|
|||||||
.ok();
|
.ok();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(windows)]
|
||||||
|
if !crate::platform::is_installed()
|
||||||
|
&& args.is_empty()
|
||||||
|
&& _is_quick_support
|
||||||
|
&& !_is_elevate
|
||||||
|
&& !_is_run_as_system
|
||||||
|
{
|
||||||
|
if let Err(e) = crate::portable_service::client::start_portable_service() {
|
||||||
|
log::error!("Failed to start portable service:{:?}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[cfg(windows)]
|
||||||
|
if !crate::platform::is_installed() && (_is_elevate || _is_run_as_system) {
|
||||||
|
crate::platform::elevate_or_run_as_system(click_setup, _is_elevate, _is_run_as_system);
|
||||||
|
return None;
|
||||||
|
}
|
||||||
if args.is_empty() {
|
if args.is_empty() {
|
||||||
std::thread::spawn(move || crate::start_server(false));
|
std::thread::spawn(move || crate::start_server(false));
|
||||||
} else {
|
} else {
|
||||||
@ -122,7 +150,14 @@ pub fn core_main() -> Option<Vec<String>> {
|
|||||||
hbb_common::allow_err!(crate::rc::extract_resources(&args[1]));
|
hbb_common::allow_err!(crate::rc::extract_resources(&args[1]));
|
||||||
return None;
|
return None;
|
||||||
} else if args[0] == "--tray" {
|
} else if args[0] == "--tray" {
|
||||||
crate::tray::start_tray(crate::ui_interface::OPTIONS.clone());
|
crate::tray::start_tray();
|
||||||
|
return None;
|
||||||
|
} else if args[0] == "--portable-service" {
|
||||||
|
crate::platform::elevate_or_run_as_system(
|
||||||
|
click_setup,
|
||||||
|
_is_elevate,
|
||||||
|
_is_run_as_system,
|
||||||
|
);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -147,14 +182,21 @@ pub fn core_main() -> Option<Vec<String>> {
|
|||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
{
|
{
|
||||||
std::thread::spawn(move || crate::start_server(true));
|
std::thread::spawn(move || crate::start_server(true));
|
||||||
// to-do: for flutter, starting tray not ready yet, or we can reuse sciter's tray implementation.
|
crate::tray::make_tray();
|
||||||
|
return None;
|
||||||
}
|
}
|
||||||
#[cfg(all(target_os = "linux"))]
|
#[cfg(target_os = "linux")]
|
||||||
{
|
{
|
||||||
let handler = std::thread::spawn(move || crate::start_server(true));
|
let handler = std::thread::spawn(move || crate::start_server(true));
|
||||||
crate::tray::start_tray(crate::ui_interface::OPTIONS.clone());
|
// Show the tray in linux only when current user is a normal user
|
||||||
// revent server exit when encountering errors from tray
|
// [Note]
|
||||||
handler.join();
|
// As for GNOME, the tray cannot be shown in user's status bar.
|
||||||
|
// As for KDE, the tray can be shown without user's theme.
|
||||||
|
if !crate::platform::is_root() {
|
||||||
|
crate::tray::start_tray();
|
||||||
|
}
|
||||||
|
// prevent server exit when encountering errors from tray
|
||||||
|
hbb_common::allow_err!(handler.join());
|
||||||
}
|
}
|
||||||
} else if args[0] == "--import-config" {
|
} else if args[0] == "--import-config" {
|
||||||
if args.len() == 2 {
|
if args.len() == 2 {
|
||||||
@ -184,6 +226,7 @@ pub fn core_main() -> Option<Vec<String>> {
|
|||||||
// meanwhile, return true to call flutter window to show control panel
|
// meanwhile, return true to call flutter window to show control panel
|
||||||
#[cfg(feature = "flutter")]
|
#[cfg(feature = "flutter")]
|
||||||
crate::flutter::connection_manager::start_listen_ipc_thread();
|
crate::flutter::connection_manager::start_listen_ipc_thread();
|
||||||
|
crate::ui_interface::start_option_status_sync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//_async_logger_holder.map(|x| x.flush());
|
//_async_logger_holder.map(|x| x.flush());
|
||||||
@ -223,6 +266,8 @@ fn import_config(path: &str) {
|
|||||||
///
|
///
|
||||||
/// [Note]
|
/// [Note]
|
||||||
/// this is for invoke new connection from dbus.
|
/// this is for invoke new connection from dbus.
|
||||||
|
/// If it returns [`None`], then the process will terminate, and flutter gui will not be started.
|
||||||
|
/// If it returns [`Some`], then the process will continue, and flutter gui will be started.
|
||||||
#[cfg(feature = "flutter")]
|
#[cfg(feature = "flutter")]
|
||||||
fn core_main_invoke_new_connection(mut args: std::env::Args) -> Option<Vec<String>> {
|
fn core_main_invoke_new_connection(mut args: std::env::Args) -> Option<Vec<String>> {
|
||||||
args.position(|element| {
|
args.position(|element| {
|
||||||
@ -249,5 +294,19 @@ fn core_main_invoke_new_connection(mut args: std::env::Args) -> Option<Vec<Strin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return None;
|
#[cfg(windows)]
|
||||||
|
{
|
||||||
|
use winapi::um::winuser::WM_USER;
|
||||||
|
let uni_links = format!("rustdesk://connection/new/{}", peer_id);
|
||||||
|
let res = crate::platform::send_message_to_hnwd(
|
||||||
|
"FLUTTER_RUNNER_WIN32_WINDOW",
|
||||||
|
"RustDesk",
|
||||||
|
(WM_USER + 2) as _, // refered from unilinks desktop pub
|
||||||
|
uni_links.as_str(),
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
return if res { None } else { Some(Vec::new()) };
|
||||||
|
}
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
return Some(Vec::new());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -54,6 +54,7 @@ pub extern "C" fn rustdesk_core_main(args_len: *mut c_int) -> *mut *mut c_char {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// https://gist.github.com/iskakaushik/1c5b8aa75c77479c33c4320913eebef6
|
// https://gist.github.com/iskakaushik/1c5b8aa75c77479c33c4320913eebef6
|
||||||
|
#[cfg(windows)]
|
||||||
fn rust_args_to_c_args(args: Vec<String>, outlen: *mut c_int) -> *mut *mut c_char {
|
fn rust_args_to_c_args(args: Vec<String>, outlen: *mut c_int) -> *mut *mut c_char {
|
||||||
let mut v = vec![];
|
let mut v = vec![];
|
||||||
|
|
||||||
@ -227,7 +228,7 @@ impl InvokeUiSession for FlutterHandler {
|
|||||||
id: i32,
|
id: i32,
|
||||||
entries: &Vec<FileEntry>,
|
entries: &Vec<FileEntry>,
|
||||||
path: String,
|
path: String,
|
||||||
is_local: bool,
|
#[allow(unused_variables)] is_local: bool,
|
||||||
only_count: bool,
|
only_count: bool,
|
||||||
) {
|
) {
|
||||||
// TODO opt
|
// TODO opt
|
||||||
@ -325,6 +326,10 @@ impl InvokeUiSession for FlutterHandler {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn cancel_msgbox(&self, tag: &str) {
|
||||||
|
self.push_event("cancel_msgbox", vec![("tag", tag)]);
|
||||||
|
}
|
||||||
|
|
||||||
fn new_message(&self, msg: String) {
|
fn new_message(&self, msg: String) {
|
||||||
self.push_event("chat_client_mode", vec![("text", &msg)]);
|
self.push_event("chat_client_mode", vec![("text", &msg)]);
|
||||||
}
|
}
|
||||||
@ -404,7 +409,7 @@ pub fn session_start_(id: &str, event_stream: StreamSink<EventToUI>) -> ResultTy
|
|||||||
*session.event_stream.write().unwrap() = Some(event_stream);
|
*session.event_stream.write().unwrap() = Some(event_stream);
|
||||||
let session = session.clone();
|
let session = session.clone();
|
||||||
std::thread::spawn(move || {
|
std::thread::spawn(move || {
|
||||||
// if flutter : disable keyboard listen
|
// if flutter : disable keyboard listen
|
||||||
crate::client::disable_keyboard_listening();
|
crate::client::disable_keyboard_listening();
|
||||||
io_loop(session);
|
io_loop(session);
|
||||||
});
|
});
|
||||||
@ -467,6 +472,10 @@ pub mod connection_manager {
|
|||||||
fn change_language(&self) {
|
fn change_language(&self) {
|
||||||
self.push_event("language", vec![]);
|
self.push_event("language", vec![]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn show_elevation(&self, show: bool) {
|
||||||
|
self.push_event("show_elevation", vec![("show", &show.to_string())]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FlutterHandler {
|
impl FlutterHandler {
|
||||||
|
|||||||
@ -16,15 +16,13 @@ use hbb_common::{
|
|||||||
// use crate::hbbs_http::account::AuthResult;
|
// use crate::hbbs_http::account::AuthResult;
|
||||||
|
|
||||||
use crate::flutter::{self, SESSIONS};
|
use crate::flutter::{self, SESSIONS};
|
||||||
#[cfg(target_os = "android")]
|
|
||||||
use crate::start_server;
|
|
||||||
use crate::ui_interface::{self, *};
|
use crate::ui_interface::{self, *};
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
use crate::ui_session_interface::CUR_SESSION;
|
||||||
use crate::{
|
use crate::{
|
||||||
client::file_trait::FileManager,
|
client::file_trait::FileManager,
|
||||||
flutter::{make_fd_to_json, session_add, session_start_},
|
flutter::{make_fd_to_json, session_add, session_start_},
|
||||||
};
|
};
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
|
||||||
use crate::ui_session_interface::CUR_SESSION;
|
|
||||||
fn initialize(app_dir: &str) {
|
fn initialize(app_dir: &str) {
|
||||||
*config::APP_DIR.write().unwrap() = app_dir.to_owned();
|
*config::APP_DIR.write().unwrap() = app_dir.to_owned();
|
||||||
#[cfg(target_os = "android")]
|
#[cfg(target_os = "android")]
|
||||||
@ -158,10 +156,61 @@ pub fn session_reconnect(id: String) {
|
|||||||
|
|
||||||
pub fn session_toggle_option(id: String, value: String) {
|
pub fn session_toggle_option(id: String, value: String) {
|
||||||
if let Some(session) = SESSIONS.write().unwrap().get_mut(&id) {
|
if let Some(session) = SESSIONS.write().unwrap().get_mut(&id) {
|
||||||
|
log::warn!("toggle option {}", value);
|
||||||
session.toggle_option(value);
|
session.toggle_option(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn session_get_flutter_config(id: String, k: String) -> Option<String> {
|
||||||
|
if let Some(session) = SESSIONS.read().unwrap().get(&id) {
|
||||||
|
Some(session.get_flutter_config(k))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn session_set_flutter_config(id: String, k: String, v: String) {
|
||||||
|
if let Some(session) = SESSIONS.write().unwrap().get_mut(&id) {
|
||||||
|
session.save_flutter_config(k, v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_local_flutter_config(k: String) -> SyncReturn<String> {
|
||||||
|
SyncReturn(ui_interface::get_local_flutter_config(k))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_local_flutter_config(k: String, v: String) {
|
||||||
|
ui_interface::set_local_flutter_config(k, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn session_get_view_style(id: String) -> Option<String> {
|
||||||
|
if let Some(session) = SESSIONS.read().unwrap().get(&id) {
|
||||||
|
Some(session.get_view_style())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn session_set_view_style(id: String, value: String) {
|
||||||
|
if let Some(session) = SESSIONS.write().unwrap().get_mut(&id) {
|
||||||
|
session.save_view_style(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn session_get_scroll_style(id: String) -> Option<String> {
|
||||||
|
if let Some(session) = SESSIONS.read().unwrap().get(&id) {
|
||||||
|
Some(session.get_scroll_style())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn session_set_scroll_style(id: String, value: String) {
|
||||||
|
if let Some(session) = SESSIONS.write().unwrap().get_mut(&id) {
|
||||||
|
session.save_scroll_style(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn session_get_image_quality(id: String) -> Option<String> {
|
pub fn session_get_image_quality(id: String) -> Option<String> {
|
||||||
if let Some(session) = SESSIONS.read().unwrap().get(&id) {
|
if let Some(session) = SESSIONS.read().unwrap().get(&id) {
|
||||||
Some(session.get_image_quality())
|
Some(session.get_image_quality())
|
||||||
@ -418,7 +467,7 @@ pub fn session_resume_job(id: String, act_id: i32, is_remote: bool) {
|
|||||||
pub fn main_get_sound_inputs() -> Vec<String> {
|
pub fn main_get_sound_inputs() -> Vec<String> {
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
return get_sound_inputs();
|
return get_sound_inputs();
|
||||||
#[cfg(any(target_os = "android", target_os = "linux"))]
|
#[cfg(any(target_os = "android", target_os = "ios"))]
|
||||||
vec![String::from("")]
|
vec![String::from("")]
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -514,7 +563,7 @@ pub fn main_get_connect_status() -> String {
|
|||||||
|
|
||||||
pub fn main_check_connect_status() {
|
pub fn main_check_connect_status() {
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
check_mouse_time(); // avoid multi calls
|
start_option_status_sync(); // avoid multi calls
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main_is_using_public_server() -> bool {
|
pub fn main_is_using_public_server() -> bool {
|
||||||
@ -537,8 +586,8 @@ pub fn main_post_request(url: String, body: String, header: String) {
|
|||||||
post_request(url, body, header)
|
post_request(url, body, header)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main_get_local_option(key: String) -> String {
|
pub fn main_get_local_option(key: String) -> SyncReturn<String> {
|
||||||
get_local_option(key)
|
SyncReturn(get_local_option(key))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main_set_local_option(key: String, value: String) {
|
pub fn main_set_local_option(key: String, value: String) {
|
||||||
@ -570,6 +619,15 @@ pub fn main_set_peer_option_sync(id: String, key: String, value: String) -> Sync
|
|||||||
SyncReturn(true)
|
SyncReturn(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn main_set_peer_alias(id: String, alias: String) {
|
||||||
|
main_broadcast_message(&HashMap::from([
|
||||||
|
("name", "alias"),
|
||||||
|
("id", &id),
|
||||||
|
("alias", &alias),
|
||||||
|
]));
|
||||||
|
set_peer_option(id, "alias".to_owned(), alias)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn main_forget_password(id: String) {
|
pub fn main_forget_password(id: String) {
|
||||||
forget_password(id)
|
forget_password(id)
|
||||||
}
|
}
|
||||||
@ -811,7 +869,12 @@ pub fn main_is_root() -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_double_click_time() -> SyncReturn<i32> {
|
pub fn get_double_click_time() -> SyncReturn<i32> {
|
||||||
SyncReturn(crate::platform::get_double_click_time() as _)
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
{
|
||||||
|
return SyncReturn(crate::platform::get_double_click_time() as _);
|
||||||
|
}
|
||||||
|
#[cfg(any(target_os = "android", target_os = "ios"))]
|
||||||
|
SyncReturn(500i32)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main_start_dbus_server() {
|
pub fn main_start_dbus_server() {
|
||||||
@ -845,6 +908,7 @@ pub fn session_send_mouse(id: String, msg: String) {
|
|||||||
"down" => 1,
|
"down" => 1,
|
||||||
"up" => 2,
|
"up" => 2,
|
||||||
"wheel" => 3,
|
"wheel" => 3,
|
||||||
|
"trackpad" => 4,
|
||||||
_ => 0,
|
_ => 0,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -943,6 +1007,11 @@ pub fn main_wol(id: String) {
|
|||||||
crate::lan::send_wol(id)
|
crate::lan::send_wol(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn main_create_shortcut(_id: String) {
|
||||||
|
#[cfg(windows)]
|
||||||
|
create_shortcut(_id);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn cm_send_chat(conn_id: i32, msg: String) {
|
pub fn cm_send_chat(conn_id: i32, msg: String) {
|
||||||
crate::ui_cm_interface::send_chat(conn_id, msg);
|
crate::ui_cm_interface::send_chat(conn_id, msg);
|
||||||
}
|
}
|
||||||
@ -975,6 +1044,14 @@ pub fn cm_switch_permission(conn_id: i32, name: String, enabled: bool) {
|
|||||||
crate::ui_cm_interface::switch_permission(conn_id, name, enabled)
|
crate::ui_cm_interface::switch_permission(conn_id, name, enabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn cm_can_elevate() -> SyncReturn<bool> {
|
||||||
|
SyncReturn(crate::ui_cm_interface::can_elevate())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn cm_elevate_portable(conn_id: i32) {
|
||||||
|
crate::ui_cm_interface::elevate_portable(conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn main_get_icon() -> String {
|
pub fn main_get_icon() -> String {
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios", feature = "cli")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios", feature = "cli")))]
|
||||||
return ui_interface::get_icon();
|
return ui_interface::get_icon();
|
||||||
@ -982,6 +1059,10 @@ pub fn main_get_icon() -> String {
|
|||||||
return String::new();
|
return String::new();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn main_get_build_date() -> String {
|
||||||
|
crate::BUILD_DATE.to_string()
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
unsafe extern "C" fn translate(name: *const c_char, locale: *const c_char) -> *const c_char {
|
unsafe extern "C" fn translate(name: *const c_char, locale: *const c_char) -> *const c_char {
|
||||||
let name = CStr::from_ptr(name);
|
let name = CStr::from_ptr(name);
|
||||||
@ -1017,11 +1098,15 @@ pub fn version_to_number(v: String) -> i64 {
|
|||||||
hbb_common::get_version_number(&v)
|
hbb_common::get_version_number(&v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn option_synced() -> bool {
|
||||||
|
crate::ui_interface::option_synced()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn main_is_installed() -> SyncReturn<bool> {
|
pub fn main_is_installed() -> SyncReturn<bool> {
|
||||||
SyncReturn(is_installed())
|
SyncReturn(is_installed())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main_start_grab_keyboard(){
|
pub fn main_start_grab_keyboard() {
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
crate::ui_session_interface::global_grab_keyboard();
|
crate::ui_session_interface::global_grab_keyboard();
|
||||||
}
|
}
|
||||||
@ -1098,6 +1183,12 @@ pub fn main_account_auth_result() -> String {
|
|||||||
account_auth_result()
|
account_auth_result()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn main_on_main_window_close() {
|
||||||
|
// may called more than one times
|
||||||
|
#[cfg(windows)]
|
||||||
|
crate::portable_service::client::drop_portable_service_shared_memory();
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "android")]
|
#[cfg(target_os = "android")]
|
||||||
pub mod server_side {
|
pub mod server_side {
|
||||||
use jni::{
|
use jni::{
|
||||||
@ -1106,7 +1197,7 @@ pub mod server_side {
|
|||||||
JNIEnv,
|
JNIEnv,
|
||||||
};
|
};
|
||||||
|
|
||||||
use hbb_common::{config::Config, log};
|
use hbb_common::log;
|
||||||
|
|
||||||
use crate::start_server;
|
use crate::start_server;
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
use super::HbbHttpResponse;
|
use super::HbbHttpResponse;
|
||||||
use hbb_common::{
|
use hbb_common::{
|
||||||
config::{Config, LocalConfig},
|
config::{Config, LocalConfig},
|
||||||
log, sleep, tokio, ResultType,
|
log, ResultType,
|
||||||
};
|
};
|
||||||
use reqwest::blocking::Client;
|
use reqwest::blocking::Client;
|
||||||
use serde_derive::{Deserialize, Serialize};
|
use serde_derive::{Deserialize, Serialize};
|
||||||
|
|||||||
14
src/ipc.rs
14
src/ipc.rs
@ -130,6 +130,19 @@ pub enum DataControl {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
#[serde(tag = "t", content = "c")]
|
||||||
|
pub enum DataPortableService {
|
||||||
|
Ping,
|
||||||
|
Pong,
|
||||||
|
ConnCount(Option<usize>),
|
||||||
|
Mouse(Vec<u8>),
|
||||||
|
Key(Vec<u8>),
|
||||||
|
RequestStart,
|
||||||
|
WillClose,
|
||||||
|
CmShowElevation(bool),
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
#[serde(tag = "t", content = "c")]
|
#[serde(tag = "t", content = "c")]
|
||||||
pub enum Data {
|
pub enum Data {
|
||||||
@ -187,6 +200,7 @@ pub enum Data {
|
|||||||
Language(String),
|
Language(String),
|
||||||
Empty,
|
Empty,
|
||||||
Disconnected,
|
Disconnected,
|
||||||
|
DataPortableService(DataPortableService),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::main(flavor = "current_thread")]
|
#[tokio::main(flavor = "current_thread")]
|
||||||
|
|||||||
@ -24,6 +24,7 @@ mod vn;
|
|||||||
mod kz;
|
mod kz;
|
||||||
mod ua;
|
mod ua;
|
||||||
mod fa;
|
mod fa;
|
||||||
|
mod ca;
|
||||||
|
|
||||||
lazy_static::lazy_static! {
|
lazy_static::lazy_static! {
|
||||||
pub static ref LANGS: Value =
|
pub static ref LANGS: Value =
|
||||||
@ -51,6 +52,7 @@ lazy_static::lazy_static! {
|
|||||||
("kz", "Қазақ"),
|
("kz", "Қазақ"),
|
||||||
("ua", "Українська"),
|
("ua", "Українська"),
|
||||||
("fa", "فارسی"),
|
("fa", "فارسی"),
|
||||||
|
("ca", "Català"),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,6 +104,7 @@ pub fn translate_locale(name: String, locale: &str) -> String {
|
|||||||
"kz" => kz::T.deref(),
|
"kz" => kz::T.deref(),
|
||||||
"ua" => ua::T.deref(),
|
"ua" => ua::T.deref(),
|
||||||
"fa" => fa::T.deref(),
|
"fa" => fa::T.deref(),
|
||||||
|
"ca" => ca::T.deref(),
|
||||||
_ => en::T.deref(),
|
_ => en::T.deref(),
|
||||||
};
|
};
|
||||||
if let Some(v) = m.get(&name as &str) {
|
if let Some(v) = m.get(&name as &str) {
|
||||||
|
|||||||
400
src/lang/ca.rs
Normal file
400
src/lang/ca.rs
Normal file
@ -0,0 +1,400 @@
|
|||||||
|
lazy_static::lazy_static! {
|
||||||
|
pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||||
|
[
|
||||||
|
("Status", "Estat"),
|
||||||
|
("Your Desktop", "EL teu escriptori"),
|
||||||
|
("desk_tip", "Pots accedir al teu escriptori amb aquest ID i contrasenya."),
|
||||||
|
("Password", "Contrasenya"),
|
||||||
|
("Ready", "Llest"),
|
||||||
|
("Established", "Establert"),
|
||||||
|
("connecting_status", "Connexió a la xarxa RustDesk en progrés..."),
|
||||||
|
("Enable Service", "Habilitar Servei"),
|
||||||
|
("Start Service", "Iniciar Servei"),
|
||||||
|
("Service is running", "El servei s'està executant"),
|
||||||
|
("Service is not running", "El servei no s'està executant"),
|
||||||
|
("not_ready_status", "No està llest. Comprova la teva connexió"),
|
||||||
|
("Control Remote Desktop", "Controlar escriptori remot"),
|
||||||
|
("Transfer File", "Transferir arxiu"),
|
||||||
|
("Connect", "Connectar"),
|
||||||
|
("Recent Sessions", "Sessions recents"),
|
||||||
|
("Address Book", "Directori"),
|
||||||
|
("Confirmation", "Confirmació"),
|
||||||
|
("TCP Tunneling", "Túnel TCP"),
|
||||||
|
("Remove", "Eliminar"),
|
||||||
|
("Refresh random password", "Actualitzar contrasenya aleatòria"),
|
||||||
|
("Set your own password", "Estableix la teva pròpia contrasenya"),
|
||||||
|
("Enable Keyboard/Mouse", "Habilitar teclat/ratolí"),
|
||||||
|
("Enable Clipboard", "Habilitar portapapers"),
|
||||||
|
("Enable File Transfer", "Habilitar transferència d'arxius"),
|
||||||
|
("Enable TCP Tunneling", "Habilitar túnel TCP"),
|
||||||
|
("IP Whitelisting", "Direccions IP admeses"),
|
||||||
|
("ID/Relay Server", "Servidor ID/Relay"),
|
||||||
|
("Import Server Config", "Importar configuració de servidor"),
|
||||||
|
("Export Server Config", "Exportar configuració del servidor"),
|
||||||
|
("Import server configuration successfully", "Configuració de servidor importada amb èxit"),
|
||||||
|
("Export server configuration successfully", "Configuració de servidor exportada con èxit"),
|
||||||
|
("Invalid server configuration", "Configuració de servidor incorrecta"),
|
||||||
|
("Clipboard is empty", "El portapapers està buit"),
|
||||||
|
("Stop service", "Aturar servei"),
|
||||||
|
("Change ID", "Canviar ID"),
|
||||||
|
("Website", "Lloc web"),
|
||||||
|
("About", "Sobre"),
|
||||||
|
("Mute", "Silenciar"),
|
||||||
|
("Audio Input", "Entrada d'àudio"),
|
||||||
|
("Enhancements", "Millores"),
|
||||||
|
("Hardware Codec", "Còdec de hardware"),
|
||||||
|
("Adaptive Bitrate", "Tasa de bits adaptativa"),
|
||||||
|
("ID Server", "Servidor de IDs"),
|
||||||
|
("Relay Server", "Servidor Relay"),
|
||||||
|
("API Server", "Servidor API"),
|
||||||
|
("invalid_http", "ha de començar amb http:// o https://"),
|
||||||
|
("Invalid IP", "IP incorrecta"),
|
||||||
|
("id_change_tip", "Només pots utilitzar caràcters a-z, A-Z, 0-9 e _ (guionet baix). El primer caràcter ha de ser a-z o A-Z. La longitut ha d'estar entre 6 i 16 caràcters."),
|
||||||
|
("Invalid format", "Format incorrecte"),
|
||||||
|
("server_not_support", "Encara no és compatible amb el servidor"),
|
||||||
|
("Not available", "No disponible"),
|
||||||
|
("Too frequent", "Massa comú"),
|
||||||
|
("Cancel", "Cancel·lar"),
|
||||||
|
("Skip", "Saltar"),
|
||||||
|
("Close", "Tancar"),
|
||||||
|
("Retry", "Reintentar"),
|
||||||
|
("OK", ""),
|
||||||
|
("Password Required", "Es necessita la contrasenya"),
|
||||||
|
("Please enter your password", "Si us plau, introdueixi la seva contrasenya"),
|
||||||
|
("Remember password", "Recordar contrasenya"),
|
||||||
|
("Wrong Password", "Contrasenya incorrecta"),
|
||||||
|
("Do you want to enter again?", "Vol tornar a entrar?"),
|
||||||
|
("Connection Error", "Error de connexió"),
|
||||||
|
("Error", ""),
|
||||||
|
("Reset by the peer", "Reestablert pel peer"),
|
||||||
|
("Connecting...", "Connectant..."),
|
||||||
|
("Connection in progress. Please wait.", "Connexió en procés. Esperi."),
|
||||||
|
("Please try 1 minute later", "Torni a provar-ho d'aquí un minut"),
|
||||||
|
("Login Error", "Error d'inicio de sessió"),
|
||||||
|
("Successful", "Exitós"),
|
||||||
|
("Connected, waiting for image...", "Connectant, esperant imatge..."),
|
||||||
|
("Name", "Nom"),
|
||||||
|
("Type", "Tipus"),
|
||||||
|
("Modified", "Modificat"),
|
||||||
|
("Size", "Grandària"),
|
||||||
|
("Show Hidden Files", "Mostrar arxius ocults"),
|
||||||
|
("Receive", "Rebre"),
|
||||||
|
("Send", "Enviar"),
|
||||||
|
("Refresh File", "Actualitzar arxiu"),
|
||||||
|
("Local", ""),
|
||||||
|
("Remote", "Remot"),
|
||||||
|
("Remote Computer", "Ordinador remot"),
|
||||||
|
("Local Computer", "Ordinador local"),
|
||||||
|
("Confirm Delete", "Confirma eliminació"),
|
||||||
|
("Delete", "Eliminar"),
|
||||||
|
("Properties", "Propietats"),
|
||||||
|
("Multi Select", "Selecció múltiple"),
|
||||||
|
("Select All", "Selecciona-ho Tot"),
|
||||||
|
("Unselect All", "Deselecciona-ho Tot"),
|
||||||
|
("Empty Directory", "Directori buit"),
|
||||||
|
("Not an empty directory", "No és un directori buit"),
|
||||||
|
("Are you sure you want to delete this file?", "Estàs segur que vols eliminar aquest arxiu?"),
|
||||||
|
("Are you sure you want to delete this empty directory?", "Estàs segur que vols eliminar aquest directori buit?"),
|
||||||
|
("Are you sure you want to delete the file of this directory?", "Estàs segur que vols eliminar aquest arxiu d'aquest directori?"),
|
||||||
|
("Do this for all conflicts", "Fes això per a tots els conflictes"),
|
||||||
|
("This is irreversible!", "Això és irreversible!"),
|
||||||
|
("Deleting", "Eliminant"),
|
||||||
|
("files", "arxius"),
|
||||||
|
("Waiting", "Esperant"),
|
||||||
|
("Finished", "Acabat"),
|
||||||
|
("Speed", "Velocitat"),
|
||||||
|
("Custom Image Quality", "Qualitat d'imatge personalitzada"),
|
||||||
|
("Privacy mode", "Mode privat"),
|
||||||
|
("Block user input", "Bloquejar entrada d'usuari"),
|
||||||
|
("Unblock user input", "Desbloquejar entrada d'usuari"),
|
||||||
|
("Adjust Window", "Ajustar finestra"),
|
||||||
|
("Original", "Original"),
|
||||||
|
("Shrink", "Reduir"),
|
||||||
|
("Stretch", "Estirar"),
|
||||||
|
("Scrollbar", "Barra de desplaçament"),
|
||||||
|
("ScrollAuto", "Desplaçament automàtico"),
|
||||||
|
("Good image quality", "Bona qualitat d'imatge"),
|
||||||
|
("Balanced", "Equilibrat"),
|
||||||
|
("Optimize reaction time", "Optimitzar el temps de reacció"),
|
||||||
|
("Custom", "Personalitzat"),
|
||||||
|
("Show remote cursor", "Mostrar cursor remot"),
|
||||||
|
("Show quality monitor", "Mostrar qualitat del monitor"),
|
||||||
|
("Disable clipboard", "Deshabilitar portapapers"),
|
||||||
|
("Lock after session end", "Bloquejar després del final de la sessió"),
|
||||||
|
("Insert", "Inserir"),
|
||||||
|
("Insert Lock", "Inserir bloqueig"),
|
||||||
|
("Refresh", "Actualitzar"),
|
||||||
|
("ID does not exist", "L'ID no existeix"),
|
||||||
|
("Failed to connect to rendezvous server", "No es pot connectar al servidor rendezvous"),
|
||||||
|
("Please try later", "Siusplau provi-ho més tard"),
|
||||||
|
("Remote desktop is offline", "L'escriptori remot està desconecctat"),
|
||||||
|
("Key mismatch", "La clau no coincideix"),
|
||||||
|
("Timeout", "Temps esgotat"),
|
||||||
|
("Failed to connect to relay server", "No es pot connectar al servidor de relay"),
|
||||||
|
("Failed to connect via rendezvous server", "No es pot connectar a través del servidor de rendezvous"),
|
||||||
|
("Failed to connect via relay server", "No es pot connectar a través del servidor de relay"),
|
||||||
|
("Failed to make direct connection to remote desktop", "No s'ha pogut establir una connexió directa amb l'escriptori remot"),
|
||||||
|
("Set Password", "Configurar la contrasenya"),
|
||||||
|
("OS Password", "contrasenya del sistema operatiu"),
|
||||||
|
("install_tip", ""),
|
||||||
|
("Click to upgrade", "Clicar per actualitzar"),
|
||||||
|
("Click to download", "Clicar per descarregar"),
|
||||||
|
("Click to update", "Clicar per refrescar"),
|
||||||
|
("Configure", "Configurar"),
|
||||||
|
("config_acc", ""),
|
||||||
|
("config_screen", ""),
|
||||||
|
("Installing ...", "Instal·lant ..."),
|
||||||
|
("Install", "Instal·lar"),
|
||||||
|
("Installation", "Instal·lació"),
|
||||||
|
("Installation Path", "Ruta d'instal·lació"),
|
||||||
|
("Create start menu shortcuts", "Crear accessos directes al menú d'inici"),
|
||||||
|
("Create desktop icon", "Crear icona d'escriptori"),
|
||||||
|
("agreement_tip", ""),
|
||||||
|
("Accept and Install", "Acceptar i instal·lar"),
|
||||||
|
("End-user license agreement", "Acord de llicència d'usuario final"),
|
||||||
|
("Generating ...", "Generant ..."),
|
||||||
|
("Your installation is lower version.", "La seva instal·lació és una versión inferior."),
|
||||||
|
("not_close_tcp_tip", ""),
|
||||||
|
("Listening ...", "Escoltant..."),
|
||||||
|
("Remote Host", "Hoste remot"),
|
||||||
|
("Remote Port", "Port remot"),
|
||||||
|
("Action", "Acció"),
|
||||||
|
("Add", "Afegirr"),
|
||||||
|
("Local Port", "Port local"),
|
||||||
|
("Local Address", "Adreça Local"),
|
||||||
|
("Change Local Port", "Canviar Port Local"),
|
||||||
|
("setup_server_tip", ""),
|
||||||
|
("Too short, at least 6 characters.", "Massa curt, almenys 6 caràcters."),
|
||||||
|
("The confirmation is not identical.", "La confirmación no coincideix."),
|
||||||
|
("Permissions", "Permisos"),
|
||||||
|
("Accept", "Acceptar"),
|
||||||
|
("Dismiss", "Cancel·lar"),
|
||||||
|
("Disconnect", "Desconnectar"),
|
||||||
|
("Allow using keyboard and mouse", "Permetre l'ús del teclat i ratolí"),
|
||||||
|
("Allow using clipboard", "Permetre usar portapapers"),
|
||||||
|
("Allow hearing sound", "Permetre escoltar so"),
|
||||||
|
("Allow file copy and paste", "Permetre copiar i enganxar arxius"),
|
||||||
|
("Connected", "Connectat"),
|
||||||
|
("Direct and encrypted connection", "Connexió directa i xifrada"),
|
||||||
|
("Relayed and encrypted connection", "connexió retransmesa i xifrada"),
|
||||||
|
("Direct and unencrypted connection", "connexió directa i sense xifrar"),
|
||||||
|
("Relayed and unencrypted connection", "connexió retransmesa i sense xifrar"),
|
||||||
|
("Enter Remote ID", "Introduixi l'ID remot"),
|
||||||
|
("Enter your password", "Introdueixi la seva contrasenya"),
|
||||||
|
("Logging in...", "Iniciant sessió..."),
|
||||||
|
("Enable RDP session sharing", "Habilitar l'ús compartit de sessions RDP"),
|
||||||
|
("Auto Login", "Inici de sessió automàtic"),
|
||||||
|
("Enable Direct IP Access", "Habilitar accés IP directe"),
|
||||||
|
("Rename", "Renombrar"),
|
||||||
|
("Space", "Espai"),
|
||||||
|
("Create Desktop Shortcut", "Crear accés directe a l'escriptori"),
|
||||||
|
("Change Path", "Cnviar ruta"),
|
||||||
|
("Create Folder", "Crear carpeta"),
|
||||||
|
("Please enter the folder name", "Indiqui el nom de la carpeta"),
|
||||||
|
("Fix it", "Soluciona-ho"),
|
||||||
|
("Warning", "Avís"),
|
||||||
|
("Login screen using Wayland is not supported", "La pantalla d'inici de sessió amb Wayland no és compatible"),
|
||||||
|
("Reboot required", "Cal reiniciar"),
|
||||||
|
("Unsupported display server ", "Servidor de visualització no compatible"),
|
||||||
|
("x11 expected", "x11 necessari"),
|
||||||
|
("Port", ""),
|
||||||
|
("Settings", "Ajustaments"),
|
||||||
|
("Username", " Nom d'usuari"),
|
||||||
|
("Invalid port", "Port incorrecte"),
|
||||||
|
("Closed manually by the peer", "Tancat manualment pel peer"),
|
||||||
|
("Enable remote configuration modification", "Habilitar modificació remota de configuració"),
|
||||||
|
("Run without install", "Executar sense instal·lar"),
|
||||||
|
("Always connected via relay", "Connectat sempre a través de relay"),
|
||||||
|
("Always connect via relay", "Connecta sempre a través de relay"),
|
||||||
|
("whitelist_tip", ""),
|
||||||
|
("Login", "Inicia sessió"),
|
||||||
|
("Logout", "Sortir"),
|
||||||
|
("Tags", ""),
|
||||||
|
("Search ID", "Cerca ID"),
|
||||||
|
("Current Wayland display server is not supported", "El servidor de visualització actual de Wayland no és compatible"),
|
||||||
|
("whitelist_sep", ""),
|
||||||
|
("Add ID", "Afegir ID"),
|
||||||
|
("Add Tag", "Afegir tag"),
|
||||||
|
("Unselect all tags", "Deseleccionar tots els tags"),
|
||||||
|
("Network error", "Error de xarxa"),
|
||||||
|
("Username missed", "Nom d'usuari oblidat"),
|
||||||
|
("Password missed", "Contrasenya oblidada"),
|
||||||
|
("Wrong credentials", "Credencials incorrectes"),
|
||||||
|
("Edit Tag", "Editar tag"),
|
||||||
|
("Unremember Password", "Contrasenya oblidada"),
|
||||||
|
("Favorites", "Preferits"),
|
||||||
|
("Add to Favorites", "Afegir a preferits"),
|
||||||
|
("Remove from Favorites", "Treure de preferits"),
|
||||||
|
("Empty", "Buit"),
|
||||||
|
("Invalid folder name", "Nom de carpeta incorrecte"),
|
||||||
|
("Socks5 Proxy", "Proxy Socks5"),
|
||||||
|
("Hostname", ""),
|
||||||
|
("Discovered", "Descobert"),
|
||||||
|
("install_daemon_tip", ""),
|
||||||
|
("Remote ID", "ID remot"),
|
||||||
|
("Paste", "Enganxar"),
|
||||||
|
("Paste here?", "Enganxar aquí?"),
|
||||||
|
("Are you sure to close the connection?", "Estàs segur que vols tancar la connexió?"),
|
||||||
|
("Download new version", "Descarregar nova versió"),
|
||||||
|
("Touch mode", "Mode tàctil"),
|
||||||
|
("Mouse mode", "Mode ratolí"),
|
||||||
|
("One-Finger Tap", "Toqui amb un dit"),
|
||||||
|
("Left Mouse", "Ratolí esquerra"),
|
||||||
|
("One-Long Tap", "Toc llarg"),
|
||||||
|
("Two-Finger Tap", "Toqui amb dos dits"),
|
||||||
|
("Right Mouse", "Botó dret"),
|
||||||
|
("One-Finger Move", "Moviment amb un dir"),
|
||||||
|
("Double Tap & Move", "Toqui dos cops i mogui"),
|
||||||
|
("Mouse Drag", "Arrastri amb el ratolí"),
|
||||||
|
("Three-Finger vertically", "Tres dits verticalment"),
|
||||||
|
("Mouse Wheel", "Roda del ratolí"),
|
||||||
|
("Two-Finger Move", "Moviment amb dos dits"),
|
||||||
|
("Canvas Move", "Moviment del llenç"),
|
||||||
|
("Pinch to Zoom", "Pessiga per fer zoom"),
|
||||||
|
("Canvas Zoom", "Ampliar llenç"),
|
||||||
|
("Reset canvas", "Reestablir llenç"),
|
||||||
|
("No permission of file transfer", "No tens permís de transferència de fitxers"),
|
||||||
|
("Note", "Nota"),
|
||||||
|
("Connection", "connexió"),
|
||||||
|
("Share Screen", "Compartir pantalla"),
|
||||||
|
("CLOSE", "TANCAR"),
|
||||||
|
("OPEN", "OBRIR"),
|
||||||
|
("Chat", "Xat"),
|
||||||
|
("Total", "Total"),
|
||||||
|
("items", "ítems"),
|
||||||
|
("Selected", "Seleccionat"),
|
||||||
|
("Screen Capture", "Captura de pantalla"),
|
||||||
|
("Input Control", "Control d'entrada"),
|
||||||
|
("Audio Capture", "Captura d'àudio"),
|
||||||
|
("File Connection", "connexió d'arxius"),
|
||||||
|
("Screen Connection", "connexió de pantalla"),
|
||||||
|
("Do you accept?", "Acceptes?"),
|
||||||
|
("Open System Setting", "Configuració del sistema obert"),
|
||||||
|
("How to get Android input permission?", "Com obtenir el permís d'entrada d'Android?"),
|
||||||
|
("android_input_permission_tip1", "Per a que un dispositiu remot controli el seu dispositiu Android amb el ratolí o tocs, cal permetre que RustDesk utilitzi el servei d' \"Accesibilitat\"."),
|
||||||
|
("android_input_permission_tip2", "Vagi a la pàgina de [Serveis instal·lats], activi el servici [RustDesk Input]."),
|
||||||
|
("android_new_connection_tip", "S'ha rebut una nova sol·licitud de control per al dispositiu actual."),
|
||||||
|
("android_service_will_start_tip", "Habilitar la captura de pantalla iniciarà el servei automàticament, i permetrà que altres dispositius sol·licitin una connexió des d'aquest dispositiu."),
|
||||||
|
("android_stop_service_tip", "Tancar el servei tancarà totes les connexions establertes."),
|
||||||
|
("android_version_audio_tip", "La versión actual de Android no admet la captura d'àudio, actualizi a Android 10 o superior."),
|
||||||
|
("android_start_service_tip", "Toqui el permís [Iniciar servei] o OBRIR [Captura de pantalla] per iniciar el servei d'ús compartit de pantalla."),
|
||||||
|
("Account", "Compte"),
|
||||||
|
("Overwrite", "Sobreescriure"),
|
||||||
|
("This file exists, skip or overwrite this file?", "Aquest arxiu ja existeix, ometre o sobreescriure l'arxiu?"),
|
||||||
|
("Quit", "Sortir"),
|
||||||
|
("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"),
|
||||||
|
("Help", "Ajuda"),
|
||||||
|
("Failed", "Ha fallat"),
|
||||||
|
("Succeeded", "Aconseguit"),
|
||||||
|
("Someone turns on privacy mode, exit", "Algú ha activat el mode de privacitat, surti"),
|
||||||
|
("Unsupported", "No suportat"),
|
||||||
|
("Peer denied", "Peer denegat"),
|
||||||
|
("Please install plugins", "Instal·li complements"),
|
||||||
|
("Peer exit", "El peer ha sortit"),
|
||||||
|
("Failed to turn off", "Error en apagar"),
|
||||||
|
("Turned off", "Apagat"),
|
||||||
|
("In privacy mode", "En mode de privacitat"),
|
||||||
|
("Out privacy mode", "Fora del mode de privacitat"),
|
||||||
|
("Language", "Idioma"),
|
||||||
|
("Keep RustDesk background service", "Mantenir RustDesk com a servei en segon pla"),
|
||||||
|
("Ignore Battery Optimizations", "Ignorar optimizacions de la bateria"),
|
||||||
|
("android_open_battery_optimizations_tip", ""),
|
||||||
|
("Connection not allowed", "Connexió no disponible"),
|
||||||
|
("Legacy mode", "Mode heretat"),
|
||||||
|
("Map mode", "Mode mapa"),
|
||||||
|
("Translate mode", "Mode traduit"),
|
||||||
|
("Use permanent password", "Utilitzar contrasenya permament"),
|
||||||
|
("Use both passwords", "Utilitzar ambdues contrasenyas"),
|
||||||
|
("Set permanent password", "Establir contrasenya permament"),
|
||||||
|
("Enable Remote Restart", "Activar reinici remot"),
|
||||||
|
("Allow remote restart", "Permetre reinici remot"),
|
||||||
|
("Restart Remote Device", "Reiniciar dispositiu"),
|
||||||
|
("Are you sure you want to restart", "Està segur que vol reiniciar?"),
|
||||||
|
("Restarting Remote Device", "Reiniciant dispositiu remot"),
|
||||||
|
("remote_restarting_tip", "Dispositiu remot reiniciant, tanqui aquest missatge i tornis a connectar amb la contrasenya."),
|
||||||
|
("Copied", "Copiat"),
|
||||||
|
("Exit Fullscreen", "Sortir de la pantalla completa"),
|
||||||
|
("Fullscreen", "Pantalla completa"),
|
||||||
|
("Mobile Actions", "Accions mòbils"),
|
||||||
|
("Select Monitor", "Seleccionar monitor"),
|
||||||
|
("Control Actions", "Accions de control"),
|
||||||
|
("Display Settings", "Configuració de pantalla"),
|
||||||
|
("Ratio", "Relació"),
|
||||||
|
("Image Quality", "Qualitat d'imatge"),
|
||||||
|
("Scroll Style", "Estil de desplaçament"),
|
||||||
|
("Show Menubar", "Mostra barra de menú"),
|
||||||
|
("Hide Menubar", "Amaga barra de menú"),
|
||||||
|
("Direct Connection", "Connexió directa"),
|
||||||
|
("Relay Connection", "Connexió Relay"),
|
||||||
|
("Secure Connection", "Connexió segura"),
|
||||||
|
("Insecure Connection", "Connexió insegura"),
|
||||||
|
("Scale original", "Escala original"),
|
||||||
|
("Scale adaptive", "Escala adaptativa"),
|
||||||
|
("General", ""),
|
||||||
|
("Security", "Seguritat"),
|
||||||
|
("Account", "Compte"),
|
||||||
|
("Theme", "Tema"),
|
||||||
|
("Dark Theme", "Tema Fosc"),
|
||||||
|
("Dark", "Fosc"),
|
||||||
|
("Light", "Clar"),
|
||||||
|
("Follow System", "Tema del sistema"),
|
||||||
|
("Enable hardware codec", "Habilitar còdec per hardware"),
|
||||||
|
("Unlock Security Settings", "Desbloquejar ajustaments de seguritat"),
|
||||||
|
("Enable Audio", "Habilitar àudio"),
|
||||||
|
("Unlock Network Settings", "Desbloquejar Ajustaments de Xarxa"),
|
||||||
|
("Server", "Servidor"),
|
||||||
|
("Direct IP Access", "Accés IP Directe"),
|
||||||
|
("Proxy", ""),
|
||||||
|
("Port", ""),
|
||||||
|
("Apply", "Aplicar"),
|
||||||
|
("Disconnect all devices?", "Desconnectar tots els dispositius?"),
|
||||||
|
("Clear", "Netejar"),
|
||||||
|
("Audio Input Device", "Dispositiu d'entrada d'àudio"),
|
||||||
|
("Deny remote access", "Denegar accés remot"),
|
||||||
|
("Use IP Whitelisting", "Utilitza llista de IPs admeses"),
|
||||||
|
("Network", "Xarxa"),
|
||||||
|
("Enable RDP", "Habilitar RDP"),
|
||||||
|
("Pin menubar", "Bloqueja barra de menú"),
|
||||||
|
("Unpin menubar", "Desbloquejar barra de menú"),
|
||||||
|
("Recording", "Gravant"),
|
||||||
|
("Directory", "Directori"),
|
||||||
|
("Automatically record incoming sessions", "Gravació automàtica de sessions entrants"),
|
||||||
|
("Change", "Canviar"),
|
||||||
|
("Start session recording", "Començar gravació de sessió"),
|
||||||
|
("Stop session recording", "Aturar gravació de sessió"),
|
||||||
|
("Enable Recording Session", "Habilitar gravació de sessió"),
|
||||||
|
("Allow recording session", "Permetre gravació de sessió"),
|
||||||
|
("Enable LAN Discovery", "Habilitar descobriment de LAN"),
|
||||||
|
("Deny LAN Discovery", "Denegar descobriment de LAN"),
|
||||||
|
("Write a message", "Escriure un missatge"),
|
||||||
|
("Prompt", ""),
|
||||||
|
("elevation_prompt", ""),
|
||||||
|
("uac_warning", ""),
|
||||||
|
("elevated_foreground_window_warning", ""),
|
||||||
|
("Disconnected", "Desconnectat"),
|
||||||
|
("Other", "Altre"),
|
||||||
|
("Confirm before closing multiple tabs", "Confirmar abans de tancar múltiples pestanyes"),
|
||||||
|
("Keyboard Settings", "Ajustaments de teclat"),
|
||||||
|
("Custom", "Personalitzat"),
|
||||||
|
("Full Access", "Acces complet"),
|
||||||
|
("Screen Share", "Compartir pantalla"),
|
||||||
|
("Wayland requires Ubuntu 21.04 or higher version.", "Wayland requereix Ubuntu 21.04 o una versió superior."),
|
||||||
|
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland requereix una versió superior de la distribución de Linux. Provi l'escriptori X11 o canvïi el seu sistema operatiu."),
|
||||||
|
("JumpLink", "Veure"),
|
||||||
|
("Please Select the screen to be shared(Operate on the peer side).", "Seleccioni la pantalla que es compartirà (Operar al costat del peer)."),
|
||||||
|
("Show RustDesk", "Mostrar RustDesk"),
|
||||||
|
("This PC", "Aquest PC"),
|
||||||
|
("or", "o"),
|
||||||
|
("Continue with", "Continuar amb"),
|
||||||
|
("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", ""),
|
||||||
|
].iter().cloned().collect();
|
||||||
|
}
|
||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", "传统模式"),
|
("Legacy mode", "传统模式"),
|
||||||
("Map mode", "1:1传输"),
|
("Map mode", "1:1传输"),
|
||||||
("Translate mode", "翻译模式"),
|
("Translate mode", "翻译模式"),
|
||||||
("Use temporary password", "使用临时密码"),
|
|
||||||
("Use permanent password", "使用固定密码"),
|
("Use permanent password", "使用固定密码"),
|
||||||
("Use both passwords", "同时使用两种密码"),
|
("Use both passwords", "同时使用两种密码"),
|
||||||
("Set permanent password", "设置固定密码"),
|
("Set permanent password", "设置固定密码"),
|
||||||
("Set temporary password length", "设置临时密码长度"),
|
|
||||||
("Enable Remote Restart", "允许远程重启"),
|
("Enable Remote Restart", "允许远程重启"),
|
||||||
("Allow remote restart", "允许远程重启"),
|
("Allow remote restart", "允许远程重启"),
|
||||||
("Restart Remote Device", "重启远程电脑"),
|
("Restart Remote Device", "重启远程电脑"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", "使用硬件编解码"),
|
("Enable hardware codec", "使用硬件编解码"),
|
||||||
("Unlock Security Settings", "解锁安全设置"),
|
("Unlock Security Settings", "解锁安全设置"),
|
||||||
("Enable Audio", "允许传输音频"),
|
("Enable Audio", "允许传输音频"),
|
||||||
("Temporary Password Length", "临时密码长度"),
|
|
||||||
("Unlock Network Settings", "解锁网络设置"),
|
("Unlock Network Settings", "解锁网络设置"),
|
||||||
("Server", "服务器"),
|
("Server", "服务器"),
|
||||||
("Direct IP Access", "IP直接访问"),
|
("Direct IP Access", "IP直接访问"),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", "拒绝局域网发现"),
|
("Deny LAN Discovery", "拒绝局域网发现"),
|
||||||
("Write a message", "输入聊天消息"),
|
("Write a message", "输入聊天消息"),
|
||||||
("Prompt", "提示"),
|
("Prompt", "提示"),
|
||||||
("elevation_prompt", "以当前用户权限运行软件,可能导致远端在访问本机时,没有足够的权限来操作部分窗口。"),
|
("Please wait for confirmation of UAC...", "请等待对方确认UAC..."),
|
||||||
("uac_warning", "暂时无法访问远端设备,因为远端设备正在请求用户账户权限,请等待对方关闭UAC窗口。为避免这个问题,建议在远端设备上安装或者以管理员权限运行本软件。"),
|
("elevated_foreground_window_tip", "远端桌面的当前窗口需要更高的权限才能操作, 暂时无法使用鼠标键盘, 可以请求对方最小化当前窗口, 或者在连接管理窗口点击提升。为避免这个问题,建议在远端设备上安装本软件。"),
|
||||||
("elevated_foreground_window_warning", "暂时无法使用鼠标键盘,因为远端桌面的当前窗口需要更高的权限才能操作, 可以请求对方最小化当前窗口。为避免这个问题,建议在远端设备上安装或者以管理员权限运行本软件。"),
|
|
||||||
("Disconnected", "会话已结束"),
|
("Disconnected", "会话已结束"),
|
||||||
("Other", "其他"),
|
("Other", "其他"),
|
||||||
("Confirm before closing multiple tabs", "关闭多个标签页时向您确认"),
|
("Confirm before closing multiple tabs", "关闭多个标签页时向您确认"),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", "此电脑"),
|
("This PC", "此电脑"),
|
||||||
("or", "或"),
|
("or", "或"),
|
||||||
("Continue with", "使用"),
|
("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", "在只允许密码连接并且只用固定密码的情况下才允许隐藏"),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", ""),
|
("Legacy mode", ""),
|
||||||
("Map mode", ""),
|
("Map mode", ""),
|
||||||
("Translate mode", ""),
|
("Translate mode", ""),
|
||||||
("Use temporary password", ""),
|
|
||||||
("Use permanent password", ""),
|
("Use permanent password", ""),
|
||||||
("Use both passwords", ""),
|
("Use both passwords", ""),
|
||||||
("Set permanent password", ""),
|
("Set permanent password", ""),
|
||||||
("Set temporary password length", ""),
|
|
||||||
("Enable Remote Restart", ""),
|
("Enable Remote Restart", ""),
|
||||||
("Allow remote restart", ""),
|
("Allow remote restart", ""),
|
||||||
("Restart Remote Device", ""),
|
("Restart Remote Device", ""),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", ""),
|
("Enable hardware codec", ""),
|
||||||
("Unlock Security Settings", ""),
|
("Unlock Security Settings", ""),
|
||||||
("Enable Audio", ""),
|
("Enable Audio", ""),
|
||||||
("Temporary Password Length", ""),
|
|
||||||
("Unlock Network Settings", ""),
|
("Unlock Network Settings", ""),
|
||||||
("Server", ""),
|
("Server", ""),
|
||||||
("Direct IP Access", ""),
|
("Direct IP Access", ""),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", ""),
|
("Deny LAN Discovery", ""),
|
||||||
("Write a message", ""),
|
("Write a message", ""),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
|
||||||
("Disconnected", ""),
|
("Disconnected", ""),
|
||||||
("Other", ""),
|
("Other", ""),
|
||||||
("Confirm before closing multiple tabs", ""),
|
("Confirm before closing multiple tabs", ""),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
("Continue with", ""),
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", "Bagudkompatibilitetstilstand"),
|
("Legacy mode", "Bagudkompatibilitetstilstand"),
|
||||||
("Map mode", ""),
|
("Map mode", ""),
|
||||||
("Translate mode", ""),
|
("Translate mode", ""),
|
||||||
("Use temporary password", "Brug midlertidig adgangskode"),
|
|
||||||
("Use permanent password", "Brug permanent adgangskode"),
|
("Use permanent password", "Brug permanent adgangskode"),
|
||||||
("Use both passwords", "Bug begge adgangskoder"),
|
("Use both passwords", "Bug begge adgangskoder"),
|
||||||
("Set permanent password", "Sæt permanent adgangskode"),
|
("Set permanent password", "Sæt permanent adgangskode"),
|
||||||
("Set temporary password length", "Sæt midlertidig adgangskode"),
|
|
||||||
("Enable Remote Restart", "Aktiver fjerngenstart"),
|
("Enable Remote Restart", "Aktiver fjerngenstart"),
|
||||||
("Allow remote restart", "Tillad fjerngenstart"),
|
("Allow remote restart", "Tillad fjerngenstart"),
|
||||||
("Restart Remote Device", "Genstart fjernenhed"),
|
("Restart Remote Device", "Genstart fjernenhed"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", "Aktiver hardware-codec"),
|
("Enable hardware codec", "Aktiver hardware-codec"),
|
||||||
("Unlock Security Settings", "Lås op for sikkerhedsinstillinger"),
|
("Unlock Security Settings", "Lås op for sikkerhedsinstillinger"),
|
||||||
("Enable Audio", "Aktiver Lyd"),
|
("Enable Audio", "Aktiver Lyd"),
|
||||||
("Temporary Password Length", "Midlertidig Adgangskode Længde"),
|
|
||||||
("Unlock Network Settings", "Lås op for Netværksinstillinger"),
|
("Unlock Network Settings", "Lås op for Netværksinstillinger"),
|
||||||
("Server", "Server"),
|
("Server", "Server"),
|
||||||
("Direct IP Access", "Direkte IP Adgang"),
|
("Direct IP Access", "Direkte IP Adgang"),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", "Afvis LAN Discovery"),
|
("Deny LAN Discovery", "Afvis LAN Discovery"),
|
||||||
("Write a message", "Skriv en besked"),
|
("Write a message", "Skriv en besked"),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
|
||||||
("Disconnected", "Afbrudt"),
|
("Disconnected", "Afbrudt"),
|
||||||
("Other", ""),
|
("Other", ""),
|
||||||
("Confirm before closing multiple tabs", ""),
|
("Confirm before closing multiple tabs", ""),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
("Continue with", ""),
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
[
|
[
|
||||||
("Status", "Status"),
|
("Status", "Status"),
|
||||||
("Your Desktop", "Ihr Desktop"),
|
("Your Desktop", "Ihr Desktop"),
|
||||||
("desk_tip", "Mit dieser ID und diesem Passwort können Sie auf Ihren Desktop zugreifen."),
|
("desk_tip", "Mit dieser ID und diesem Passwort kann auf Ihren Desktop zugegriffen werden."),
|
||||||
("Password", "Passwort"),
|
("Password", "Passwort"),
|
||||||
("Ready", "Bereit"),
|
("Ready", "Bereit"),
|
||||||
("Established", "Verbunden"),
|
("Established", "Verbunden"),
|
||||||
@ -12,7 +12,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Start Service", "Starte Vermittlungsdienst"),
|
("Start Service", "Starte Vermittlungsdienst"),
|
||||||
("Service is running", "Vermittlungsdienst aktiv"),
|
("Service is running", "Vermittlungsdienst aktiv"),
|
||||||
("Service is not running", "Vermittlungsdienst deaktiviert"),
|
("Service is not running", "Vermittlungsdienst deaktiviert"),
|
||||||
("not_ready_status", "Nicht bereit. Bitte überprüfen Sie Ihre Verbindung"),
|
("not_ready_status", "Nicht bereit. Bitte überprüfen Sie Ihre Netzwerkverbindung"),
|
||||||
("Control Remote Desktop", "Entfernten PC steuern"),
|
("Control Remote Desktop", "Entfernten PC steuern"),
|
||||||
("Transfer File", "Datei übertragen"),
|
("Transfer File", "Datei übertragen"),
|
||||||
("Connect", "Verbinden"),
|
("Connect", "Verbinden"),
|
||||||
@ -30,9 +30,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("IP Whitelisting", "IP-Whitelist"),
|
("IP Whitelisting", "IP-Whitelist"),
|
||||||
("ID/Relay Server", "ID/Vermittlungsserver"),
|
("ID/Relay Server", "ID/Vermittlungsserver"),
|
||||||
("Import Server Config", "Serverkonfiguration importieren"),
|
("Import Server Config", "Serverkonfiguration importieren"),
|
||||||
("Export Server Config", ""),
|
("Export Server Config", "Serverkonfiguration exportieren"),
|
||||||
("Import server configuration successfully", "Serverkonfiguration erfolgreich importiert"),
|
("Import server configuration successfully", "Serverkonfiguration erfolgreich importiert"),
|
||||||
("Export server configuration successfully", ""),
|
("Export server configuration successfully", "Serverkonfiguration erfolgreich exportiert"),
|
||||||
("Invalid server configuration", "Ungültige Serverkonfiguration"),
|
("Invalid server configuration", "Ungültige Serverkonfiguration"),
|
||||||
("Clipboard is empty", "Zwischenablage ist leer"),
|
("Clipboard is empty", "Zwischenablage ist leer"),
|
||||||
("Stop service", "Vermittlungsdienst deaktivieren"),
|
("Stop service", "Vermittlungsdienst deaktivieren"),
|
||||||
@ -67,12 +67,12 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Connection Error", "Verbindungsfehler"),
|
("Connection Error", "Verbindungsfehler"),
|
||||||
("Error", "Fehler"),
|
("Error", "Fehler"),
|
||||||
("Reset by the peer", "Verbindung wurde von der Gegenstelle zurückgesetzt"),
|
("Reset by the peer", "Verbindung wurde von der Gegenstelle zurückgesetzt"),
|
||||||
("Connecting...", "Verbinden..."),
|
("Connecting...", "Verbindung wird hergestellt..."),
|
||||||
("Connection in progress. Please wait.", "Die Verbindung wird hergestellt. Bitte warten..."),
|
("Connection in progress. Please wait.", "Die Verbindung wird hergestellt. Bitte warten..."),
|
||||||
("Please try 1 minute later", "Bitte versuchen Sie es später erneut"),
|
("Please try 1 minute later", "Bitte versuchen Sie es später erneut"),
|
||||||
("Login Error", "Anmeldefehler"),
|
("Login Error", "Anmeldefehler"),
|
||||||
("Successful", "Erfolgreich"),
|
("Successful", "Erfolgreich"),
|
||||||
("Connected, waiting for image...", "Verbunden, warte auf Bild..."),
|
("Connected, waiting for image...", "Verbindung hergestellt. Warten auf Bild..."),
|
||||||
("Name", "Name"),
|
("Name", "Name"),
|
||||||
("Type", "Typ"),
|
("Type", "Typ"),
|
||||||
("Modified", "Geändert"),
|
("Modified", "Geändert"),
|
||||||
@ -89,15 +89,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Delete", "Löschen"),
|
("Delete", "Löschen"),
|
||||||
("Properties", "Eigenschaften"),
|
("Properties", "Eigenschaften"),
|
||||||
("Multi Select", "Mehrfachauswahl"),
|
("Multi Select", "Mehrfachauswahl"),
|
||||||
("Select All", ""),
|
("Select All", "Alles auswählen"),
|
||||||
("Unselect All", ""),
|
("Unselect All", "Alles abwählen"),
|
||||||
("Empty Directory", "Leerer Ordner"),
|
("Empty Directory", "Leerer Ordner"),
|
||||||
("Not an empty directory", "Ordner ist nicht leer"),
|
("Not an empty directory", "Ordner ist nicht leer"),
|
||||||
("Are you sure you want to delete this file?", "Sind Sie sicher, dass Sie diese Datei löschen wollen?"),
|
("Are you sure you want to delete this file?", "Sind Sie sicher, dass Sie diese Datei löschen wollen?"),
|
||||||
("Are you sure you want to delete this empty directory?", "Sind Sie sicher, dass Sie diesen leeren Ordner löschen möchten?"),
|
("Are you sure you want to delete this empty directory?", "Sind Sie sicher, dass Sie diesen leeren Ordner löschen möchten?"),
|
||||||
("Are you sure you want to delete the file of this directory?", "Sind Sie sicher, dass Sie die Datei dieses Ordners löschen möchten?"),
|
("Are you sure you want to delete the file of this directory?", "Sind Sie sicher, dass Sie die Datei dieses Ordners löschen möchten?"),
|
||||||
("Do this for all conflicts", "Für alle Konflikte merken"),
|
("Do this for all conflicts", "Für alle Konflikte merken"),
|
||||||
("This is irreversible!", "Dies ist irreversibel!"),
|
("This is irreversible!", "Dies kann nicht rückgängig gemacht werden!"),
|
||||||
("Deleting", "Löschen"),
|
("Deleting", "Löschen"),
|
||||||
("files", "Dateien"),
|
("files", "Dateien"),
|
||||||
("Waiting", "Warten"),
|
("Waiting", "Warten"),
|
||||||
@ -113,14 +113,14 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Stretch", "Strecken"),
|
("Stretch", "Strecken"),
|
||||||
("Scrollbar", "Scrollleiste"),
|
("Scrollbar", "Scrollleiste"),
|
||||||
("ScrollAuto", "Automatisch scrollen"),
|
("ScrollAuto", "Automatisch scrollen"),
|
||||||
("Good image quality", "Qualität"),
|
("Good image quality", "Hohe Bildqualität"),
|
||||||
("Balanced", "Ausgeglichen"),
|
("Balanced", "Ausgeglichen"),
|
||||||
("Optimize reaction time", "Geschwindigkeit"),
|
("Optimize reaction time", "Geschwindigkeit"),
|
||||||
("Custom", ""),
|
("Custom", "Individuell"),
|
||||||
("Show remote cursor", "Entfernten Cursor anzeigen"),
|
("Show remote cursor", "Entfernten Cursor anzeigen"),
|
||||||
("Show quality monitor", "Qualitätsüberwachung anzeigen"),
|
("Show quality monitor", "Qualitätsüberwachung anzeigen"),
|
||||||
("Disable clipboard", "Zwischenablage deaktivieren"),
|
("Disable clipboard", "Zwischenablage deaktivieren"),
|
||||||
("Lock after session end", "Sperren nach Sitzungsende"),
|
("Lock after session end", "Nach Sitzungsende sperren"),
|
||||||
("Insert", "Einfügen"),
|
("Insert", "Einfügen"),
|
||||||
("Insert Lock", "Win+L (Sperren) senden"),
|
("Insert Lock", "Win+L (Sperren) senden"),
|
||||||
("Refresh", "Aktualisieren"),
|
("Refresh", "Aktualisieren"),
|
||||||
@ -136,7 +136,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Failed to make direct connection to remote desktop", "Direkte Verbindung zum entfernten PC fehlgeschlagen"),
|
("Failed to make direct connection to remote desktop", "Direkte Verbindung zum entfernten PC fehlgeschlagen"),
|
||||||
("Set Password", "Passwort festlegen"),
|
("Set Password", "Passwort festlegen"),
|
||||||
("OS Password", "Betriebssystem-Passwort"),
|
("OS Password", "Betriebssystem-Passwort"),
|
||||||
("install_tip", "Aufgrund der UAC kann RustDesk in manchen Fällen nicht ordnungsgemäß funktionieren. Um UAC zu vermeiden, klicken Sie bitte auf die Schaltfläche unten, um RustDesk auf dem System zu installieren"),
|
("install_tip", "Aufgrund der Benutzerkontensteuerung (UAC) kann RustDesk in manchen Fällen nicht ordnungsgemäß funktionieren. Um die Benutzerkontensteuerung zu umgehen, klicken Sie bitte auf die Schaltfläche unten, um RustDesk auf dem System zu installieren"),
|
||||||
("Click to upgrade", "Zum Aktualisieren anklicken"),
|
("Click to upgrade", "Zum Aktualisieren anklicken"),
|
||||||
("Click to download", "Zum Herunterladen klicken"),
|
("Click to download", "Zum Herunterladen klicken"),
|
||||||
("Click to update", "Zum Aktualisieren klicken"),
|
("Click to update", "Zum Aktualisieren klicken"),
|
||||||
@ -161,11 +161,11 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Action", "Aktion"),
|
("Action", "Aktion"),
|
||||||
("Add", "Hinzufügen"),
|
("Add", "Hinzufügen"),
|
||||||
("Local Port", "Lokaler Port"),
|
("Local Port", "Lokaler Port"),
|
||||||
("Local Address", "Lokale ddresse"),
|
("Local Address", "Lokale Addresse"),
|
||||||
("Change Local Port", "Lokalen Port ändern"),
|
("Change Local Port", "Lokalen Port ändern"),
|
||||||
("setup_server_tip", "Für eine schnellere Verbindung richten Sie bitte Ihren eigenen Verbindungsserver ein"),
|
("setup_server_tip", "Für eine schnellere Verbindung richten Sie bitte Ihren eigenen Verbindungsserver ein"),
|
||||||
("Too short, at least 6 characters.", "Zu kurz, mindestens 6 Zeichen."),
|
("Too short, at least 6 characters.", "Zu kurz, mindestens 6 Zeichen."),
|
||||||
("The confirmation is not identical.", "Die Passwörter sind nicht identisch."),
|
("The confirmation is not identical.", "Die Passwörter stimmen nicht überein."),
|
||||||
("Permissions", "Berechtigungen"),
|
("Permissions", "Berechtigungen"),
|
||||||
("Accept", "Akzeptieren"),
|
("Accept", "Akzeptieren"),
|
||||||
("Dismiss", "Ablehnen"),
|
("Dismiss", "Ablehnen"),
|
||||||
@ -181,7 +181,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Relayed and unencrypted connection", "Vermittelte und unverschlüsselte Verbindung"),
|
("Relayed and unencrypted connection", "Vermittelte und unverschlüsselte Verbindung"),
|
||||||
("Enter Remote ID", "Remote-ID eingeben"),
|
("Enter Remote ID", "Remote-ID eingeben"),
|
||||||
("Enter your password", "Geben Sie Ihr Passwort ein"),
|
("Enter your password", "Geben Sie Ihr Passwort ein"),
|
||||||
("Logging in...", "Anmeldung..."),
|
("Logging in...", "Anmelden..."),
|
||||||
("Enable RDP session sharing", "RDP-Sitzungsfreigabe aktivieren"),
|
("Enable RDP session sharing", "RDP-Sitzungsfreigabe aktivieren"),
|
||||||
("Auto Login", "Automatisch anmelden (nur gültig, wenn Sie \"Sperren nach Sitzungsende\" aktiviert haben)"),
|
("Auto Login", "Automatisch anmelden (nur gültig, wenn Sie \"Sperren nach Sitzungsende\" aktiviert haben)"),
|
||||||
("Enable Direct IP Access", "Direkten IP-Zugang aktivieren"),
|
("Enable Direct IP Access", "Direkten IP-Zugang aktivieren"),
|
||||||
@ -209,7 +209,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("whitelist_tip", "Nur IPs auf der Whitelist können zugreifen"),
|
("whitelist_tip", "Nur IPs auf der Whitelist können zugreifen"),
|
||||||
("Login", "Anmelden"),
|
("Login", "Anmelden"),
|
||||||
("Logout", "Abmelden"),
|
("Logout", "Abmelden"),
|
||||||
("Tags", "Stichworte"),
|
("Tags", "Schlagworte"),
|
||||||
("Search ID", "Suche ID"),
|
("Search ID", "Suche ID"),
|
||||||
("Current Wayland display server is not supported", "Der aktuelle Wayland-Anzeigeserver wird nicht unterstützt"),
|
("Current Wayland display server is not supported", "Der aktuelle Wayland-Anzeigeserver wird nicht unterstützt"),
|
||||||
("whitelist_sep", "Getrennt durch Komma, Semikolon, Leerzeichen oder Zeilenumbruch"),
|
("whitelist_sep", "Getrennt durch Komma, Semikolon, Leerzeichen oder Zeilenumbruch"),
|
||||||
@ -220,15 +220,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Username missed", "Benutzername vergessen"),
|
("Username missed", "Benutzername vergessen"),
|
||||||
("Password missed", "Passwort vergessen"),
|
("Password missed", "Passwort vergessen"),
|
||||||
("Wrong credentials", "Falsche Anmeldedaten"),
|
("Wrong credentials", "Falsche Anmeldedaten"),
|
||||||
("Edit Tag", "Stichwort bearbeiten"),
|
("Edit Tag", "Schlagwort bearbeiten"),
|
||||||
("Unremember Password", "Passwort vergessen"),
|
("Unremember Password", "Passwort vergessen"),
|
||||||
("Favorites", "Favoriten"),
|
("Favorites", "Favoriten"),
|
||||||
("Add to Favorites", "Zu Favoriten hinzufügen"),
|
("Add to Favorites", "Zu Favoriten hinzufügen"),
|
||||||
("Remove from Favorites", "Aus Favoriten entfernen"),
|
("Remove from Favorites", "Aus Favoriten entfernen"),
|
||||||
("Empty", "Leer"),
|
("Empty", "Keine Einträge"),
|
||||||
("Invalid folder name", "Ungültiger Ordnername"),
|
("Invalid folder name", "Ungültiger Ordnername"),
|
||||||
("Socks5 Proxy", "Socks5 Proxy"),
|
("Socks5 Proxy", "Socks5 Proxy"),
|
||||||
("Hostname", "Rechnername"),
|
("Hostname", "Hostname"),
|
||||||
("Discovered", "Gefunden"),
|
("Discovered", "Gefunden"),
|
||||||
("install_daemon_tip", "Um mit System zu starten, muss der Systemdienst installiert sein"),
|
("install_daemon_tip", "Um mit System zu starten, muss der Systemdienst installiert sein"),
|
||||||
("Remote ID", "Entfernte ID"),
|
("Remote ID", "Entfernte ID"),
|
||||||
@ -278,7 +278,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("android_stop_service_tip", "Durch das Deaktivieren des Dienstes werden automatisch alle hergestellten Verbindungen getrennt."),
|
("android_stop_service_tip", "Durch das Deaktivieren des Dienstes werden automatisch alle hergestellten Verbindungen getrennt."),
|
||||||
("android_version_audio_tip", "Ihre Android-Version unterstützt keine Audioaufnahme, bitte aktualisieren Sie auf Android 10 oder höher, falls möglich."),
|
("android_version_audio_tip", "Ihre Android-Version unterstützt keine Audioaufnahme, bitte aktualisieren Sie auf Android 10 oder höher, falls möglich."),
|
||||||
("android_start_service_tip", "Tippen Sie auf [Dienst aktivieren] oder aktivieren Sie die Berechtigung [Bildschirmzugr.], um den Bildschirmfreigabedienst zu starten."),
|
("android_start_service_tip", "Tippen Sie auf [Dienst aktivieren] oder aktivieren Sie die Berechtigung [Bildschirmzugr.], um den Bildschirmfreigabedienst zu starten."),
|
||||||
("Account", "Account"),
|
("Account", "Konto"),
|
||||||
("Overwrite", "Überschreiben"),
|
("Overwrite", "Überschreiben"),
|
||||||
("This file exists, skip or overwrite this file?", "Diese Datei existiert; überspringen oder überschreiben?"),
|
("This file exists, skip or overwrite this file?", "Diese Datei existiert; überspringen oder überschreiben?"),
|
||||||
("Quit", "Beenden"),
|
("Quit", "Beenden"),
|
||||||
@ -298,16 +298,14 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Language", "Sprache"),
|
("Language", "Sprache"),
|
||||||
("Keep RustDesk background service", "RustDesk im Hintergrund ausführen"),
|
("Keep RustDesk background service", "RustDesk im Hintergrund ausführen"),
|
||||||
("Ignore Battery Optimizations", "Batterieoptimierung ignorieren"),
|
("Ignore Battery Optimizations", "Batterieoptimierung ignorieren"),
|
||||||
("android_open_battery_optimizations_tip", "Möchten Sie die Batterieopimierungs-Einstellungen öffnen?"),
|
("android_open_battery_optimizations_tip", "Möchten Sie die Einstellungen zur Batterieopimierung öffnen?"),
|
||||||
("Connection not allowed", "Verbindung abgelehnt"),
|
("Connection not allowed", "Verbindung abgelehnt"),
|
||||||
("Legacy mode", "Kompatibilitätsmodus"),
|
("Legacy mode", "Kompatibilitätsmodus"),
|
||||||
("Map mode", ""),
|
("Map mode", ""),
|
||||||
("Translate mode", "Übersetzungsmodus"),
|
("Translate mode", "Übersetzungsmodus"),
|
||||||
("Use temporary password", "Temporäres Passwort verwenden"),
|
|
||||||
("Use permanent password", "Dauerhaftes Passwort verwenden"),
|
("Use permanent password", "Dauerhaftes Passwort verwenden"),
|
||||||
("Use both passwords", "Beide Passwörter verwenden"),
|
("Use both passwords", "Beide Passwörter verwenden"),
|
||||||
("Set permanent password", "Dauerhaftes Passwort setzen"),
|
("Set permanent password", "Dauerhaftes Passwort setzen"),
|
||||||
("Set temporary password length", "Länge des temporären Passworts setzen"),
|
|
||||||
("Enable Remote Restart", "Entfernten Neustart aktivieren"),
|
("Enable Remote Restart", "Entfernten Neustart aktivieren"),
|
||||||
("Allow remote restart", "Entfernten Neustart erlauben"),
|
("Allow remote restart", "Entfernten Neustart erlauben"),
|
||||||
("Restart Remote Device", "Entferntes Gerät neu starten"),
|
("Restart Remote Device", "Entferntes Gerät neu starten"),
|
||||||
@ -334,7 +332,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Scale adaptive", "Adaptiv skalieren"),
|
("Scale adaptive", "Adaptiv skalieren"),
|
||||||
("General", "Allgemein"),
|
("General", "Allgemein"),
|
||||||
("Security", "Sicherheit"),
|
("Security", "Sicherheit"),
|
||||||
("Account", "Account"),
|
("Account", "KOnto"),
|
||||||
("Theme", "Farbgebung"),
|
("Theme", "Farbgebung"),
|
||||||
("Dark Theme", "dunkle Farbgebung"),
|
("Dark Theme", "dunkle Farbgebung"),
|
||||||
("Dark", "Dunkel"),
|
("Dark", "Dunkel"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", "Hardware-Codec aktivieren"),
|
("Enable hardware codec", "Hardware-Codec aktivieren"),
|
||||||
("Unlock Security Settings", "Sicherheitseinstellungen entsperren"),
|
("Unlock Security Settings", "Sicherheitseinstellungen entsperren"),
|
||||||
("Enable Audio", "Audio aktivieren"),
|
("Enable Audio", "Audio aktivieren"),
|
||||||
("Temporary Password Length", "Länge des temporären Passworts"),
|
|
||||||
("Unlock Network Settings", "Netzwerkeinstellungen entsperren"),
|
("Unlock Network Settings", "Netzwerkeinstellungen entsperren"),
|
||||||
("Server", "Server"),
|
("Server", "Server"),
|
||||||
("Direct IP Access", "Direkter IP-Zugriff"),
|
("Direct IP Access", "Direkter IP-Zugriff"),
|
||||||
@ -371,23 +368,34 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", "LAN-Erkennung verbieten"),
|
("Deny LAN Discovery", "LAN-Erkennung verbieten"),
|
||||||
("Write a message", "Nachricht schreiben"),
|
("Write a message", "Nachricht schreiben"),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", "Bitte auf die Bestätigung des Nutzers warten..."),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
("Disconnected", "Verbindung abgebrochen"),
|
||||||
("Disconnected", ""),
|
|
||||||
("Other", ""),
|
("Other", ""),
|
||||||
("Confirm before closing multiple tabs", ""),
|
("Confirm before closing multiple tabs", "Bitte vor dem Schließen mehrerer Tabs bestägigen"),
|
||||||
("Keyboard Settings", ""),
|
("Keyboard Settings", "Tastatureinstellungen"),
|
||||||
("Custom", ""),
|
("Custom", "Individuell"),
|
||||||
("Full Access", ""),
|
("Full Access", "Vollzugriff"),
|
||||||
("Screen Share", ""),
|
("Screen Share", "Bildschirmfreigabe"),
|
||||||
("Wayland requires Ubuntu 21.04 or higher version.", "Wayland erfordert Ubuntu 21.04 oder eine höhere Version."),
|
("Wayland requires Ubuntu 21.04 or higher version.", "Wayland erfordert Ubuntu 21.04 oder eine höhere Version."),
|
||||||
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland erfordert eine höhere Version der Linux-Distribution. Bitte versuchen Sie den X11-Desktop oder ändern Sie Ihr Betriebssystem."),
|
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland erfordert eine höhere Version der Linux-Distribution. Bitte versuchen Sie den X11-Desktop oder ändern Sie Ihr Betriebssystem."),
|
||||||
("JumpLink", "View"),
|
("JumpLink", "View"),
|
||||||
("Please Select the screen to be shared(Operate on the peer side).", "Bitte wählen Sie den Bildschirm aus, der freigegeben werden soll (auf der Peer-Seite arbeiten)."),
|
("Please Select the screen to be shared(Operate on the peer side).", "Bitte wählen Sie den Bildschirm aus, der freigegeben werden soll (auf der Peer-Seite arbeiten)."),
|
||||||
("Show RustDesk", ""),
|
("Show RustDesk", "RustDesk anzeigen"),
|
||||||
("This PC", ""),
|
("This PC", "Dieser PC"),
|
||||||
("or", ""),
|
("or", "oder"),
|
||||||
("Continue with", ""),
|
("Continue with", "Fortfahren mit"),
|
||||||
|
("Elevate", "Erheben"),
|
||||||
|
("Zoom cursor", "Cursor zoomen"),
|
||||||
|
("Accept sessions via password", "Sitzung mit Passwort bestätigen"),
|
||||||
|
("Accept sessions via click", "Sitzung mit einem Klick bestätigen"),
|
||||||
|
("Accept sessions via both", "Sitzung durch beides bestätigen"),
|
||||||
|
("Please wait for the remote side to accept your session request...", "Bitte warten Sie auf die Gegenstelle, dass diese Ihre Sitzungsanfrage bestätigt..."),
|
||||||
|
("One-time Password", "Einmalpasswort"),
|
||||||
|
("Use one-time password", "Einmalpasswort verwenden"),
|
||||||
|
("One-time password length", "Länge des Einmalpassworts"),
|
||||||
|
("Request access to your device", "Zugriff zu Ihrem Gerät erbitten"),
|
||||||
|
("Hide connection management window", ""),
|
||||||
|
("hide_cm_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,12 +30,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("android_open_battery_optimizations_tip", "If you want to disable this feature, please go to the next RustDesk application settings page, find and enter [Battery], Uncheck [Unrestricted]"),
|
("android_open_battery_optimizations_tip", "If you want to disable this feature, please go to the next RustDesk application settings page, find and enter [Battery], Uncheck [Unrestricted]"),
|
||||||
("remote_restarting_tip", "Remote device is restarting, please close this message box and reconnect with permanent password after a while"),
|
("remote_restarting_tip", "Remote device is restarting, please close this message box and reconnect with permanent password after a while"),
|
||||||
("Are you sure to close the connection?", "Are you sure you want to close the connection?"),
|
("Are you sure to close the connection?", "Are you sure you want to close the connection?"),
|
||||||
("elevation_prompt", "Running software without privilege elevation may cause problems when remote users operate certain windows."),
|
("elevated_foreground_window_tip", "The current window of the remote desktop requires higher privilege to operate, so it's unable to use the mouse and keyboard temporarily. You can request the remote user to minimize the current window, or click elevation button on the connection management window. To avoid this problem, it is recommended to install the software on the remote device."),
|
||||||
("uac_warning", "Temporarily denied access due to elevation request, please wait for the remote user to accept the UAC dialog. To avoid this problem, it is recommended to install the software on the remote device or run it with administrator privileges."),
|
|
||||||
("elevated_foreground_window_warning", "Temporarily unable to use the mouse and keyboard, because the current window of the remote desktop requires higher privilege to operate, you can request the remote user to minimize the current window. To avoid this problem, it is recommended to install the software on the remote device or run it with administrator privileges."),
|
|
||||||
("JumpLink", "View"),
|
("JumpLink", "View"),
|
||||||
("Stop service", "Stop Service"),
|
("Stop service", "Stop Service"),
|
||||||
("or", ""),
|
("hide_cm_tip", "Allow hiding only if accepting sessions via password and using pernament password"),
|
||||||
("Continue with", ""),
|
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", ""),
|
("Legacy mode", ""),
|
||||||
("Map mode", ""),
|
("Map mode", ""),
|
||||||
("Translate mode", ""),
|
("Translate mode", ""),
|
||||||
("Use temporary password", ""),
|
|
||||||
("Use permanent password", ""),
|
("Use permanent password", ""),
|
||||||
("Use both passwords", ""),
|
("Use both passwords", ""),
|
||||||
("Set permanent password", ""),
|
("Set permanent password", ""),
|
||||||
("Set temporary password length", ""),
|
|
||||||
("Enable Remote Restart", ""),
|
("Enable Remote Restart", ""),
|
||||||
("Allow remote restart", ""),
|
("Allow remote restart", ""),
|
||||||
("Restart Remote Device", ""),
|
("Restart Remote Device", ""),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", ""),
|
("Enable hardware codec", ""),
|
||||||
("Unlock Security Settings", ""),
|
("Unlock Security Settings", ""),
|
||||||
("Enable Audio", ""),
|
("Enable Audio", ""),
|
||||||
("Temporary Password Length", ""),
|
|
||||||
("Unlock Network Settings", ""),
|
("Unlock Network Settings", ""),
|
||||||
("Server", ""),
|
("Server", ""),
|
||||||
("Direct IP Access", ""),
|
("Direct IP Access", ""),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", ""),
|
("Deny LAN Discovery", ""),
|
||||||
("Write a message", ""),
|
("Write a message", ""),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
|
||||||
("Disconnected", ""),
|
("Disconnected", ""),
|
||||||
("Other", ""),
|
("Other", ""),
|
||||||
("Confirm before closing multiple tabs", ""),
|
("Confirm before closing multiple tabs", ""),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
("Continue with", ""),
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -303,12 +303,10 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", "Modo heredado"),
|
("Legacy mode", "Modo heredado"),
|
||||||
("Map mode", "Modo mapa"),
|
("Map mode", "Modo mapa"),
|
||||||
("Translate mode", "Modo traducido"),
|
("Translate mode", "Modo traducido"),
|
||||||
("Use temporary password", "Usar contraseña temporal"),
|
|
||||||
("Use permanent password", "Usar contraseña permamente"),
|
("Use permanent password", "Usar contraseña permamente"),
|
||||||
("Use both passwords", "Usar ambas comtraseñas"),
|
("Use both passwords", "Usar ambas contraseñas"),
|
||||||
("Set permanent password", "Establecer contraseña permamente"),
|
("Set permanent password", "Establecer contraseña permamente"),
|
||||||
("Set temporary password length", "Establecer largo de contraseña temporal"),
|
("Enable Remote Restart", "Habilitar reinicio remoto"),
|
||||||
("Enable Remote Restart", "Activar reinicio remoto"),
|
|
||||||
("Allow remote restart", "Permitir reinicio remoto"),
|
("Allow remote restart", "Permitir reinicio remoto"),
|
||||||
("Restart Remote Device", "Reiniciar dispositivo"),
|
("Restart Remote Device", "Reiniciar dispositivo"),
|
||||||
("Are you sure you want to restart", "Esta Seguro que desea reiniciar?"),
|
("Are you sure you want to restart", "Esta Seguro que desea reiniciar?"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", "Habilitar códec por hardware"),
|
("Enable hardware codec", "Habilitar códec por hardware"),
|
||||||
("Unlock Security Settings", "Desbloquear ajustes de seguridad"),
|
("Unlock Security Settings", "Desbloquear ajustes de seguridad"),
|
||||||
("Enable Audio", "Habilitar Audio"),
|
("Enable Audio", "Habilitar Audio"),
|
||||||
("Temporary Password Length", "Longitud de Contraseña Temporal"),
|
|
||||||
("Unlock Network Settings", "Desbloquear Ajustes de Red"),
|
("Unlock Network Settings", "Desbloquear Ajustes de Red"),
|
||||||
("Server", "Servidor"),
|
("Server", "Servidor"),
|
||||||
("Direct IP Access", "Acceso IP Directo"),
|
("Direct IP Access", "Acceso IP Directo"),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", "Denegar descubrimiento de LAN"),
|
("Deny LAN Discovery", "Denegar descubrimiento de LAN"),
|
||||||
("Write a message", "Escribir un mensaje"),
|
("Write a message", "Escribir un mensaje"),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
|
||||||
("Disconnected", "Desconectado"),
|
("Disconnected", "Desconectado"),
|
||||||
("Other", "Otro"),
|
("Other", "Otro"),
|
||||||
("Confirm before closing multiple tabs", "Confirmar antes de cerrar múltiples pestañas"),
|
("Confirm before closing multiple tabs", "Confirmar antes de cerrar múltiples pestañas"),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", "Este PC"),
|
("This PC", "Este PC"),
|
||||||
("or", "o"),
|
("or", "o"),
|
||||||
("Continue with", "Continuar con"),
|
("Continue with", "Continuar con"),
|
||||||
|
("Elevate", "Elevar"),
|
||||||
|
("Zoom cursor", "Ampliar cursor"),
|
||||||
|
("Accept sessions via password", "Aceptar sesiones a través de contraseña"),
|
||||||
|
("Accept sessions via click", "Aceptar sesiones a través de clic"),
|
||||||
|
("Accept sessions via both", "Aceptar sesiones a través de ambos"),
|
||||||
|
("Please wait for the remote side to accept your session request...", "Por favor, espere a que el lado remoto acepte su solicitud de sesión"),
|
||||||
|
("One-time Password", "Constaseña de un solo uso"),
|
||||||
|
("Use one-time password", "Usar contraseña de un solo uso"),
|
||||||
|
("One-time password length", "Longitud de la contraseña de un solo uso"),
|
||||||
|
("Request access to your device", "Solicitud de acceso a su dispositivo"),
|
||||||
|
("Hide connection management window", ""),
|
||||||
|
("hide_cm_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", "پشتیبانی موارد قدیمی"),
|
("Legacy mode", "پشتیبانی موارد قدیمی"),
|
||||||
("Map mode", "حالت نقشه"),
|
("Map mode", "حالت نقشه"),
|
||||||
("Translate mode", "حالت ترجمه"),
|
("Translate mode", "حالت ترجمه"),
|
||||||
("Use temporary password", "از رمز عبور موقت استفاده کنید"),
|
|
||||||
("Use permanent password", "از رمز عبور دائمی استفاده کنید"),
|
("Use permanent password", "از رمز عبور دائمی استفاده کنید"),
|
||||||
("Use both passwords", "از هر دو رمز عبور استفاده کنید"),
|
("Use both passwords", "از هر دو رمز عبور استفاده کنید"),
|
||||||
("Set permanent password", "یک رمز عبور دائمی تنظیم کنید"),
|
("Set permanent password", "یک رمز عبور دائمی تنظیم کنید"),
|
||||||
("Set temporary password length", "تنظیم طول رمز عبور موقت"),
|
|
||||||
("Enable Remote Restart", "فعال کردن راهاندازی مجدد از راه دور"),
|
("Enable Remote Restart", "فعال کردن راهاندازی مجدد از راه دور"),
|
||||||
("Allow remote restart", "اجازه راه اندازی مجدد از راه دور"),
|
("Allow remote restart", "اجازه راه اندازی مجدد از راه دور"),
|
||||||
("Restart Remote Device", "راهاندازی مجدد دستگاه از راه دور"),
|
("Restart Remote Device", "راهاندازی مجدد دستگاه از راه دور"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", "از کدک سخت افزاری استفاده کنید"),
|
("Enable hardware codec", "از کدک سخت افزاری استفاده کنید"),
|
||||||
("Unlock Security Settings", "تنظیمات امنیتی را باز کنید"),
|
("Unlock Security Settings", "تنظیمات امنیتی را باز کنید"),
|
||||||
("Enable Audio", "صدا را روشن کنید"),
|
("Enable Audio", "صدا را روشن کنید"),
|
||||||
("Temporary Password Length", "طول رمز عبور موقت"),
|
|
||||||
("Unlock Network Settings", "باز کردن قفل تنظیمات شبکه"),
|
("Unlock Network Settings", "باز کردن قفل تنظیمات شبکه"),
|
||||||
("Server", "سرور"),
|
("Server", "سرور"),
|
||||||
("Direct IP Access", "دسترسی مستقیم به IP"),
|
("Direct IP Access", "دسترسی مستقیم به IP"),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", "غیر فعالسازی جستجو در شبکه"),
|
("Deny LAN Discovery", "غیر فعالسازی جستجو در شبکه"),
|
||||||
("Write a message", "یک پیام بنویسید"),
|
("Write a message", "یک پیام بنویسید"),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", "اجرای نرمافزار بدون افزایش امتیاز میتواند باعث ایجاد مشکلاتی در هنگام کار کردن کاربران راه دور با ویندوزهای خاص شود"),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", "به دلیل درخواست دسترسی سطح بالا، به طور موقت از دسترسی رد شد. منتظر بمانید تا کاربر راه دور گفتگوی UAC را بپذیرد. برای جلوگیری از این مشکل، توصیه می شود نرم افزار را روی دستگاه از راه دور نصب کنید یا آن را با دسترسی مدیر اجرا کنید."),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", "به طور موقت استفاده از ماوس و صفحه کلید امکان پذیر نیست زیرا پنجره دسکتاپ از راه دور فعلی برای کار کردن به دسترسی های بالاتر نیاز دارد، می توانید از کاربر راه دور بخواهید که پنجره فعلی را به حداقل برساند. برای جلوگیری از این مشکل، توصیه می شود نرم افزار را روی یک دستگاه راه دور نصب کنید یا آن را با دسترسی مدیر اجرا کنید"),
|
|
||||||
("Disconnected", "قطع ارتباط"),
|
("Disconnected", "قطع ارتباط"),
|
||||||
("Other", "دیگر"),
|
("Other", "دیگر"),
|
||||||
("Confirm before closing multiple tabs", "بستن چندین برگه را تأیید کنید"),
|
("Confirm before closing multiple tabs", "بستن چندین برگه را تأیید کنید"),
|
||||||
@ -389,5 +385,16 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", "This PC"),
|
("This PC", "This PC"),
|
||||||
("or", "یا"),
|
("or", "یا"),
|
||||||
("Continue with", "ادامه با"),
|
("Continue with", "ادامه با"),
|
||||||
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
108
src/lang/fr.rs
108
src/lang/fr.rs
@ -19,20 +19,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Recent Sessions", "Sessions récentes"),
|
("Recent Sessions", "Sessions récentes"),
|
||||||
("Address Book", "Carnet d'adresses"),
|
("Address Book", "Carnet d'adresses"),
|
||||||
("Confirmation", "Confirmation"),
|
("Confirmation", "Confirmation"),
|
||||||
("TCP Tunneling", "Tunneling TCP"),
|
("TCP Tunneling", "Tunnel TCP"),
|
||||||
("Remove", "Supprimer"),
|
("Remove", "Supprimer"),
|
||||||
("Refresh random password", "Actualiser le mot de passe aléatoire"),
|
("Refresh random password", "Actualiser le mot de passe aléatoire"),
|
||||||
("Set your own password", "Définir votre propre mot de passe"),
|
("Set your own password", "Définir votre propre mot de passe"),
|
||||||
("Enable Keyboard/Mouse", "Activer le contrôle clavier/souris"),
|
("Enable Keyboard/Mouse", "Activer le contrôle clavier/souris"),
|
||||||
("Enable Clipboard", "Activer la synchronisation du presse-papier"),
|
("Enable Clipboard", "Activer la synchronisation du presse-papier"),
|
||||||
("Enable File Transfer", "Activer le transfert de fichiers"),
|
("Enable File Transfer", "Activer le transfert de fichiers"),
|
||||||
("Enable TCP Tunneling", "Activer le tunneling TCP"),
|
("Enable TCP Tunneling", "Activer le tunnel TCP"),
|
||||||
("IP Whitelisting", "Liste blanche IP"),
|
("IP Whitelisting", "Liste blanche IP"),
|
||||||
("ID/Relay Server", "ID/Serveur Relais"),
|
("ID/Relay Server", "ID/Serveur Relais"),
|
||||||
("Import Server Config", "Importer la configuration du serveur"),
|
("Import Server Config", "Importer la configuration du serveur"),
|
||||||
("Export Server Config", ""),
|
("Export Server Config", "Exporter la configuration du serveur"),
|
||||||
("Import server configuration successfully", "Configuration du serveur importée avec succès"),
|
("Import server configuration successfully", "Configuration du serveur importée avec succès"),
|
||||||
("Export server configuration successfully", ""),
|
("Export server configuration successfully", "Configuration du serveur exportée avec succès"),
|
||||||
("Invalid server configuration", "Configuration du serveur non valide"),
|
("Invalid server configuration", "Configuration du serveur non valide"),
|
||||||
("Clipboard is empty", "Presse-papier vide"),
|
("Clipboard is empty", "Presse-papier vide"),
|
||||||
("Stop service", "Arrêter le service"),
|
("Stop service", "Arrêter le service"),
|
||||||
@ -41,9 +41,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("About", "À propos de"),
|
("About", "À propos de"),
|
||||||
("Mute", "Muet"),
|
("Mute", "Muet"),
|
||||||
("Audio Input", "Entrée audio"),
|
("Audio Input", "Entrée audio"),
|
||||||
("Enhancements", ""),
|
("Enhancements", "Améliorations"),
|
||||||
("Hardware Codec", ""),
|
("Hardware Codec", "Transcodage matériel"),
|
||||||
("Adaptive Bitrate", ""),
|
("Adaptive Bitrate", "Débit adaptatif"),
|
||||||
("ID Server", "Serveur ID"),
|
("ID Server", "Serveur ID"),
|
||||||
("Relay Server", "Serveur relais"),
|
("Relay Server", "Serveur relais"),
|
||||||
("API Server", "Serveur API"),
|
("API Server", "Serveur API"),
|
||||||
@ -74,7 +74,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Successful", "Succès"),
|
("Successful", "Succès"),
|
||||||
("Connected, waiting for image...", "Connecté, en attente de transmission d'image..."),
|
("Connected, waiting for image...", "Connecté, en attente de transmission d'image..."),
|
||||||
("Name", "Nom"),
|
("Name", "Nom"),
|
||||||
("Type", "Taper"),
|
("Type", "Type"),
|
||||||
("Modified", "Modifié"),
|
("Modified", "Modifié"),
|
||||||
("Size", "Taille"),
|
("Size", "Taille"),
|
||||||
("Show Hidden Files", "Afficher les fichiers cachés"),
|
("Show Hidden Files", "Afficher les fichiers cachés"),
|
||||||
@ -89,8 +89,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Delete", "Supprimer"),
|
("Delete", "Supprimer"),
|
||||||
("Properties", "Propriétés"),
|
("Properties", "Propriétés"),
|
||||||
("Multi Select", "Choix multiple"),
|
("Multi Select", "Choix multiple"),
|
||||||
("Select All", ""),
|
("Select All", "Tout sélectionner"),
|
||||||
("Unselect All", ""),
|
("Unselect All", "Tout déselectionner"),
|
||||||
("Empty Directory", "Répertoire vide"),
|
("Empty Directory", "Répertoire vide"),
|
||||||
("Not an empty directory", "Pas un répertoire vide"),
|
("Not an empty directory", "Pas un répertoire vide"),
|
||||||
("Are you sure you want to delete this file?", "Voulez-vous vraiment supprimer ce fichier?"),
|
("Are you sure you want to delete this file?", "Voulez-vous vraiment supprimer ce fichier?"),
|
||||||
@ -116,9 +116,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Good image quality", "Bonne qualité d'image"),
|
("Good image quality", "Bonne qualité d'image"),
|
||||||
("Balanced", "Qualité d'image normale"),
|
("Balanced", "Qualité d'image normale"),
|
||||||
("Optimize reaction time", "Optimiser le temps de réaction"),
|
("Optimize reaction time", "Optimiser le temps de réaction"),
|
||||||
("Custom", ""),
|
("Custom", "Personnalisé"),
|
||||||
("Show remote cursor", "Afficher le curseur distant"),
|
("Show remote cursor", "Afficher le curseur distant"),
|
||||||
("Show quality monitor", ""),
|
("Show quality monitor", "Afficher le moniteur de qualité"),
|
||||||
("Disable clipboard", "Désactiver le presse-papier"),
|
("Disable clipboard", "Désactiver le presse-papier"),
|
||||||
("Lock after session end", "Verrouiller l'ordinateur distant après la déconnexion"),
|
("Lock after session end", "Verrouiller l'ordinateur distant après la déconnexion"),
|
||||||
("Insert", "Insérer"),
|
("Insert", "Insérer"),
|
||||||
@ -137,9 +137,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Set Password", "Définir le mot de passe"),
|
("Set Password", "Définir le mot de passe"),
|
||||||
("OS Password", "Mot de passe du système d'exploitation"),
|
("OS Password", "Mot de passe du système d'exploitation"),
|
||||||
("install_tip", "Vous utilisez une version non installée. En raison des restrictions UAC, en tant que terminal contrôlé, dans certains cas, il ne sera pas en mesure de contrôler la souris et le clavier ou d'enregistrer l'écran. Veuillez cliquer sur le bouton ci-dessous pour installer RustDesk au système pour éviter la question ci-dessus."),
|
("install_tip", "Vous utilisez une version non installée. En raison des restrictions UAC, en tant que terminal contrôlé, dans certains cas, il ne sera pas en mesure de contrôler la souris et le clavier ou d'enregistrer l'écran. Veuillez cliquer sur le bouton ci-dessous pour installer RustDesk au système pour éviter la question ci-dessus."),
|
||||||
("Click to upgrade", "Cliquez pour mettre à niveau"),
|
("Click to upgrade", "Cliquer pour mettre à niveau"),
|
||||||
("Click to download", "Cliquez pour télécharger"),
|
("Click to download", "Cliquer pour télécharger"),
|
||||||
("Click to update", "Cliquez pour mettre à jour"),
|
("Click to update", "Cliquer pour mettre à jour"),
|
||||||
("Configure", "Configurer"),
|
("Configure", "Configurer"),
|
||||||
("config_acc", "Afin de pouvoir contrôler votre bureau à distance, veuillez donner l'autorisation \"accessibilité\" à RustDesk."),
|
("config_acc", "Afin de pouvoir contrôler votre bureau à distance, veuillez donner l'autorisation \"accessibilité\" à RustDesk."),
|
||||||
("config_screen", "Afin de pouvoir accéder à votre bureau à distance, veuillez donner à RustDesk l'autorisation \"enregistrement d'écran\"."),
|
("config_screen", "Afin de pouvoir accéder à votre bureau à distance, veuillez donner à RustDesk l'autorisation \"enregistrement d'écran\"."),
|
||||||
@ -161,8 +161,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Action", "Action"),
|
("Action", "Action"),
|
||||||
("Add", "Ajouter"),
|
("Add", "Ajouter"),
|
||||||
("Local Port", "Port local"),
|
("Local Port", "Port local"),
|
||||||
("Local Address", ""),
|
("Local Address", "Adresse locale"),
|
||||||
("Change Local Port", ""),
|
("Change Local Port", "Changer le port local"),
|
||||||
("setup_server_tip", "Si vous avez besoin d'une vitesse de connexion plus rapide, vous pouvez choisir de créer votre propre serveur"),
|
("setup_server_tip", "Si vous avez besoin d'une vitesse de connexion plus rapide, vous pouvez choisir de créer votre propre serveur"),
|
||||||
("Too short, at least 6 characters.", "Trop court, au moins 6 caractères."),
|
("Too short, at least 6 characters.", "Trop court, au moins 6 caractères."),
|
||||||
("The confirmation is not identical.", "Les deux entrées ne correspondent pas"),
|
("The confirmation is not identical.", "Les deux entrées ne correspondent pas"),
|
||||||
@ -179,8 +179,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Relayed and encrypted connection", "Connexion relais chiffrée"),
|
("Relayed and encrypted connection", "Connexion relais chiffrée"),
|
||||||
("Direct and unencrypted connection", "Connexion directe non chiffrée"),
|
("Direct and unencrypted connection", "Connexion directe non chiffrée"),
|
||||||
("Relayed and unencrypted connection", "Connexion relais non chiffrée"),
|
("Relayed and unencrypted connection", "Connexion relais non chiffrée"),
|
||||||
("Enter Remote ID", "Entrez l'ID de l'appareil à distance"),
|
("Enter Remote ID", "Entrer l'ID de l'appareil à distance"),
|
||||||
("Enter your password", "Entrez votre mot de passe"),
|
("Enter your password", "Entrer votre mot de passe"),
|
||||||
("Logging in...", "Se connecter..."),
|
("Logging in...", "Se connecter..."),
|
||||||
("Enable RDP session sharing", "Activer le partage de session RDP"),
|
("Enable RDP session sharing", "Activer le partage de session RDP"),
|
||||||
("Auto Login", "Connexion automatique (le verrouillage ne sera effectif qu'après la désactivation du premier paramètre)"),
|
("Auto Login", "Connexion automatique (le verrouillage ne sera effectif qu'après la désactivation du premier paramètre)"),
|
||||||
@ -191,12 +191,12 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Change Path", "Changer de chemin"),
|
("Change Path", "Changer de chemin"),
|
||||||
("Create Folder", "Créer un dossier"),
|
("Create Folder", "Créer un dossier"),
|
||||||
("Please enter the folder name", "Veuillez saisir le nom du dossier"),
|
("Please enter the folder name", "Veuillez saisir le nom du dossier"),
|
||||||
("Fix it", "Réparez-le"),
|
("Fix it", "Réparer"),
|
||||||
("Warning", "Avertissement"),
|
("Warning", "Avertissement"),
|
||||||
("Login screen using Wayland is not supported", "L'écran de connexion utilisant Wayland n'est pas pris en charge"),
|
("Login screen using Wayland is not supported", "L'écran de connexion utilisant Wayland n'est pas pris en charge"),
|
||||||
("Reboot required", "Redémarrage pour prendre effet"),
|
("Reboot required", "Redémarrage pour prendre effet"),
|
||||||
("Unsupported display server ", "Le serveur d'affichage actuel n'est pas pris en charge"),
|
("Unsupported display server ", "Le serveur d'affichage actuel n'est pas pris en charge"),
|
||||||
("x11 expected", "Veuillez passer à x11"),
|
("x11 expected", "x11 requis"),
|
||||||
("Port", "Port"),
|
("Port", "Port"),
|
||||||
("Settings", "Paramètres"),
|
("Settings", "Paramètres"),
|
||||||
("Username", " Nom d'utilisateur"),
|
("Username", " Nom d'utilisateur"),
|
||||||
@ -230,7 +230,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Socks5 Proxy", "Socks5 Agents"),
|
("Socks5 Proxy", "Socks5 Agents"),
|
||||||
("Hostname", "Nom d'hôte"),
|
("Hostname", "Nom d'hôte"),
|
||||||
("Discovered", "Découvert"),
|
("Discovered", "Découvert"),
|
||||||
("install_daemon_tip", "Pour démarrer au démarrage, vous devez installer le service système."),
|
("install_daemon_tip", "Pour une exécution au démarrage du système, vous devez installer le service système."),
|
||||||
("Remote ID", "ID de l'appareil à distance"),
|
("Remote ID", "ID de l'appareil à distance"),
|
||||||
("Paste", "Coller"),
|
("Paste", "Coller"),
|
||||||
("Paste here?", "Coller ici ?"),
|
("Paste here?", "Coller ici ?"),
|
||||||
@ -239,8 +239,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Touch mode", "Mode tactile"),
|
("Touch mode", "Mode tactile"),
|
||||||
("Mouse mode", "Mode souris"),
|
("Mouse mode", "Mode souris"),
|
||||||
("One-Finger Tap", "Tapez d'un doigt"),
|
("One-Finger Tap", "Tapez d'un doigt"),
|
||||||
("Left Mouse", "Souris gauche"),
|
("Left Mouse", "Bouton gauche de la souris"),
|
||||||
("One-Long Tap", "Un long robinet"),
|
("One-Long Tap", "Un touché long"),
|
||||||
("Two-Finger Tap", "Tapez à deux doigts"),
|
("Two-Finger Tap", "Tapez à deux doigts"),
|
||||||
("Right Mouse", "Bouton droit de la souris"),
|
("Right Mouse", "Bouton droit de la souris"),
|
||||||
("One-Finger Move", "Mouvement à un doigt"),
|
("One-Finger Move", "Mouvement à un doigt"),
|
||||||
@ -249,10 +249,10 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Three-Finger vertically", "Trois doigts verticalement"),
|
("Three-Finger vertically", "Trois doigts verticalement"),
|
||||||
("Mouse Wheel", "Roulette de la souris"),
|
("Mouse Wheel", "Roulette de la souris"),
|
||||||
("Two-Finger Move", "Mouvement à deux doigts"),
|
("Two-Finger Move", "Mouvement à deux doigts"),
|
||||||
("Canvas Move", "Déplacement de la toile"),
|
("Canvas Move", "Déplacer la vue"),
|
||||||
("Pinch to Zoom", "Pincer pour zoomer"),
|
("Pinch to Zoom", "Pincer pour zoomer"),
|
||||||
("Canvas Zoom", "Zoom sur la toile"),
|
("Canvas Zoom", "Zoom sur la vue"),
|
||||||
("Reset canvas", "Réinitialiser le canevas"),
|
("Reset canvas", "Réinitialiser la vue"),
|
||||||
("No permission of file transfer", "Aucune autorisation de transfert de fichiers"),
|
("No permission of file transfer", "Aucune autorisation de transfert de fichiers"),
|
||||||
("Note", "Noter"),
|
("Note", "Noter"),
|
||||||
("Connection", "Connexion"),
|
("Connection", "Connexion"),
|
||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", "Mode hérité"),
|
("Legacy mode", "Mode hérité"),
|
||||||
("Map mode", ""),
|
("Map mode", ""),
|
||||||
("Translate mode", ""),
|
("Translate mode", ""),
|
||||||
("Use temporary password", "Utiliser mot de passe temporaire"),
|
("Use permanent password", "Utiliser un mot de passe permanent"),
|
||||||
("Use permanent password", "Utiliser mot de passe permanent"),
|
("Use both passwords", "Utiliser les mots de passe temporaire et permanent"),
|
||||||
("Use both passwords", "Utiliser tous les mots de passe"),
|
("Set permanent password", "Définir le mot de passe permanent"),
|
||||||
("Set permanent password", "Définir mot de passe permanent"),
|
|
||||||
("Set temporary password length", "Définir la longueur mot de passe temporaire"),
|
|
||||||
("Enable Remote Restart", "Activer le redémarrage à distance"),
|
("Enable Remote Restart", "Activer le redémarrage à distance"),
|
||||||
("Allow remote restart", "Autoriser le redémarrage à distance"),
|
("Allow remote restart", "Autoriser le redémarrage à distance"),
|
||||||
("Restart Remote Device", "Redémarrer l'appareil à distance"),
|
("Restart Remote Device", "Redémarrer l'appareil à distance"),
|
||||||
@ -340,10 +338,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Dark", "Sombre"),
|
("Dark", "Sombre"),
|
||||||
("Light", "Clair"),
|
("Light", "Clair"),
|
||||||
("Follow System", "Suivi système"),
|
("Follow System", "Suivi système"),
|
||||||
("Enable hardware codec", "Activer le codec matériel"),
|
("Enable hardware codec", "Activer le transcodage matériel"),
|
||||||
("Unlock Security Settings", "Déverrouiller les configurations de sécurité"),
|
("Unlock Security Settings", "Déverrouiller les configurations de sécurité"),
|
||||||
("Enable Audio", "Activer l'audio"),
|
("Enable Audio", "Activer l'audio"),
|
||||||
("Temporary Password Length", "Longueur mot de passe temporaire"),
|
|
||||||
("Unlock Network Settings", "Déverrouiller les configurations réseau"),
|
("Unlock Network Settings", "Déverrouiller les configurations réseau"),
|
||||||
("Server", "Serveur"),
|
("Server", "Serveur"),
|
||||||
("Direct IP Access", "Accès IP direct"),
|
("Direct IP Access", "Accès IP direct"),
|
||||||
@ -359,7 +356,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable RDP", "Activer RDP"),
|
("Enable RDP", "Activer RDP"),
|
||||||
("Pin menubar", "Épingler la barre de menus"),
|
("Pin menubar", "Épingler la barre de menus"),
|
||||||
("Unpin menubar", "Détacher la barre de menu"),
|
("Unpin menubar", "Détacher la barre de menu"),
|
||||||
("Recording", "Enregistrement en cours"),
|
("Recording", "Enregistrement"),
|
||||||
("Directory", "Répertoire"),
|
("Directory", "Répertoire"),
|
||||||
("Automatically record incoming sessions", "Enregistrement automatique des session entrantes"),
|
("Automatically record incoming sessions", "Enregistrement automatique des session entrantes"),
|
||||||
("Change", "Modifier"),
|
("Change", "Modifier"),
|
||||||
@ -371,23 +368,34 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", "Interdir la découverte réseau local"),
|
("Deny LAN Discovery", "Interdir la découverte réseau local"),
|
||||||
("Write a message", "Ecrire un message"),
|
("Write a message", "Ecrire un message"),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
("Disconnected", "Déconnecté"),
|
||||||
("Disconnected", ""),
|
("Other", "Divers"),
|
||||||
("Other", ""),
|
("Confirm before closing multiple tabs", "Confirmer avant de fermer plusieurs onglets"),
|
||||||
("Confirm before closing multiple tabs", ""),
|
("Keyboard Settings", "Configuration clavier"),
|
||||||
("Keyboard Settings", ""),
|
("Custom", "Personnalisé"),
|
||||||
("Custom", ""),
|
("Full Access", "Accès total"),
|
||||||
("Full Access", ""),
|
("Screen Share", "Partage d'écran"),
|
||||||
("Screen Share", ""),
|
|
||||||
("Wayland requires Ubuntu 21.04 or higher version.", "Wayland nécessite Ubuntu 21.04 ou une version supérieure."),
|
("Wayland requires Ubuntu 21.04 or higher version.", "Wayland nécessite Ubuntu 21.04 ou une version supérieure."),
|
||||||
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland nécessite une version supérieure de la distribution Linux. Veuillez essayer le bureau X11 ou changer votre système d'exploitation."),
|
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland nécessite une version supérieure de la distribution Linux. Veuillez essayer le bureau X11 ou changer votre système d'exploitation."),
|
||||||
("JumpLink", "View"),
|
("JumpLink", "Afficher"),
|
||||||
("Please Select the screen to be shared(Operate on the peer side).", "Veuillez sélectionner l'écran à partager (opérer du côté pair)."),
|
("Please Select the screen to be shared(Operate on the peer side).", "Veuillez sélectionner l'écran à partager (opérer du côté pair)."),
|
||||||
("Show RustDesk", ""),
|
("Show RustDesk", "Afficher RustDesk"),
|
||||||
("This PC", ""),
|
("This PC", "Ce PC"),
|
||||||
("or", ""),
|
("or", "ou"),
|
||||||
("Continue with", ""),
|
("Continue with", "Continuer avec"),
|
||||||
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
568
src/lang/hu.rs
568
src/lang/hu.rs
@ -2,392 +2,400 @@ lazy_static::lazy_static! {
|
|||||||
pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||||
[
|
[
|
||||||
("Status", "Státusz"),
|
("Status", "Státusz"),
|
||||||
("Your Desktop", "A te asztalod"),
|
("Your Desktop", "Saját azonosító"),
|
||||||
("desk_tip", "Az asztalod ezzel az ID-vel, és jelszóval érhető el."),
|
("desk_tip", "A számítógép ezzel a jelszóval és azonosítóval érhető el távolról."),
|
||||||
("Password", "Jelszó"),
|
("Password", "Jelszó"),
|
||||||
("Ready", "Kész"),
|
("Ready", "Kész"),
|
||||||
("Established", "Létrejött"),
|
("Established", "Létrejött"),
|
||||||
("connecting_status", "Kapcsolódás a RustDesk hálózatához..."),
|
("connecting_status", "Csatlakozás folyamatban..."),
|
||||||
("Enable Service", "A szolgáltatás bekapcsolása"),
|
("Enable Service", "Szolgáltatás engedélyezése"),
|
||||||
("Start Service", "Szolgáltatás Elindítása"),
|
("Start Service", "Szolgáltatás indítása"),
|
||||||
("Service is running", "A szolgáltatás fut"),
|
("Service is running", "Szolgáltatás aktív"),
|
||||||
("Service is not running", "A szolgáltatás nem fut"),
|
("Service is not running", "Szolgáltatás inaktív"),
|
||||||
("not_ready_status", "A RustDesk nem áll készen. Kérlek nézd meg a hálózati beállításaidat."),
|
("not_ready_status", "Kapcsolódási hiba. Kérlek ellenőrizze a hálózati beállításokat."),
|
||||||
("Control Remote Desktop", "Távoli Asztal Kontrollálása"),
|
("Control Remote Desktop", "Távoli számítógép vezérlése"),
|
||||||
("Transfer File", "Fájl Transzfer"),
|
("Transfer File", "Fájlátvitel"),
|
||||||
("Connect", "Kapcsolódás"),
|
("Connect", "Csatlakozás"),
|
||||||
("Recent Sessions", "Korábbi Sessionök"),
|
("Recent Sessions", "Legutóbbi munkamanetek"),
|
||||||
("Address Book", "Címköny"),
|
("Address Book", "Címjegyzék"),
|
||||||
("Confirmation", "Megerősít"),
|
("Confirmation", "Megerősítés"),
|
||||||
("TCP Tunneling", "TCP Tunneling"),
|
("TCP Tunneling", "TCP Tunneling"),
|
||||||
("Remove", "Eltávolít"),
|
("Remove", "Eltávolít"),
|
||||||
("Refresh random password", "Véletlenszerű jelszó frissítése"),
|
("Refresh random password", "Új véletlenszerű jelszó"),
|
||||||
("Set your own password", "Saját jelszó beállítása"),
|
("Set your own password", "Saját jelszó beállítása"),
|
||||||
("Enable Keyboard/Mouse", "Billentyűzet/Egér bekapcsolása"),
|
("Enable Keyboard/Mouse", "Billentyűzet/egér engedélyezése"),
|
||||||
("Enable Clipboard", "Megosztott vágólap bekapcsolása"),
|
("Enable Clipboard", "Megosztott vágólap engedélyezése"),
|
||||||
("Enable File Transfer", "Fájl transzer bekapcsolása"),
|
("Enable File Transfer", "Fájlátvitel engedélyezése"),
|
||||||
("Enable TCP Tunneling", "TCP Tunneling bekapcsolása"),
|
("Enable TCP Tunneling", "TCP Tunneling engedélyezése"),
|
||||||
("IP Whitelisting", "IP Fehérlista"),
|
("IP Whitelisting", "IP engedélyezési lista"),
|
||||||
("ID/Relay Server", "ID/Relay Szerver"),
|
("ID/Relay Server", "Kiszolgáló szerver"),
|
||||||
("Import Server Config", "Szerver Konfiguráció Importálása"),
|
("Import Server Config", "Szerver konfiguráció importálása"),
|
||||||
("Export Server Config", ""),
|
("Export Server Config", "Szerver konfiguráció exportálása"),
|
||||||
("Import server configuration successfully", "Szerver konfiguráció sikeresen importálva"),
|
("Import server configuration successfully", "Szerver konfiguráció sikeresen importálva"),
|
||||||
("Export server configuration successfully", ""),
|
("Export server configuration successfully", "Szerver konfiguráció sikeresen exportálva"),
|
||||||
("Invalid server configuration", "Érvénytelen szerver konfiguráció"),
|
("Invalid server configuration", "Érvénytelen szerver konfiguráció"),
|
||||||
("Clipboard is empty", "A vágólap üres"),
|
("Clipboard is empty", "A vágólap üres"),
|
||||||
("Stop service", "Szolgáltatás Kikapcsolása"),
|
("Stop service", "Szolgáltatás leállítása"),
|
||||||
("Change ID", "ID Megváltoztatása"),
|
("Change ID", "Azonosító megváltoztatása"),
|
||||||
("Website", "Weboldal"),
|
("Website", "Weboldal"),
|
||||||
("About", "Rólunk: "),
|
("About", "Rólunk"),
|
||||||
("Mute", "Némítás"),
|
("Mute", "Némítás"),
|
||||||
("Audio Input", "Audo Bemenet"),
|
("Audio Input", "Hangátvitel"),
|
||||||
("Enhancements", "Javítások"),
|
("Enhancements", "Fejlesztések"),
|
||||||
("Hardware Codec", "Hardware Kodek"),
|
("Hardware Codec", "Hardware kodek"),
|
||||||
("Adaptive Bitrate", "Adaptív Bitrate"),
|
("Adaptive Bitrate", "Adaptív bitráta"),
|
||||||
("ID Server", "ID Szerver"),
|
("ID Server", "Szerver azonosító/domain"),
|
||||||
("Relay Server", "Relay Szerver"),
|
("Relay Server", "Kiszolgáló szerver"),
|
||||||
("API Server", "API Szerver"),
|
("API Server", "API szerver"),
|
||||||
("invalid_http", "A címnek mindenképpen http(s)://-el kell kezdődnie."),
|
("invalid_http", "A címnek mindenképpen http(s)://-el kell kezdődnie."),
|
||||||
("Invalid IP", "A megadott íp cím helytelen."),
|
("Invalid IP", "A megadott IP cím helytelen."),
|
||||||
("id_change_tip", "Csak a-z, A-Z, 0-9 csoportokba tartozó karakterek, illetve a _ karakter van engedélyezve. Az első karakternek mindenképpen a-z, A-Z csoportokba kell esnie. Az ID hosszúsága 6-tól, 16 karakter."),
|
("id_change_tip", "Csak a-z, A-Z, 0-9 csoportokba tartozó karakterek, illetve a _ karakter van engedélyezve. Az első karakternek mindenképpen a-z, A-Z csoportokba kell esnie. Az azonosító hosszúsága 6-tól, 16 karakter."),
|
||||||
("Invalid format", "Érvénytelen formátum"),
|
("Invalid format", "Érvénytelen formátum"),
|
||||||
("server_not_support", "Még nem támogatott a szerver által"),
|
("server_not_support", "Nem támogatott a szerver által"),
|
||||||
("Not available", "Nem érhető el"),
|
("Not available", "Nem elérhető"),
|
||||||
("Too frequent", "Túl gyakori"),
|
("Too frequent", "Túl gyakori"),
|
||||||
("Cancel", "Mégsem"),
|
("Cancel", "Mégsem"),
|
||||||
("Skip", "Kihagy"),
|
("Skip", "Kihagyás"),
|
||||||
("Close", "Bezár"),
|
("Close", "Bezárás"),
|
||||||
("Retry", "Újrapróbálkozás"),
|
("Retry", "Újra"),
|
||||||
("OK", "OK"),
|
("OK", "OK"),
|
||||||
("Password Required", "A jelszó megadása kötelező"),
|
("Password Required", "Jelszó megadása kötelező"),
|
||||||
("Please enter your password", "Kérlek írd be a jelszavad"),
|
("Please enter your password", "Kérem írja be a jelszavát"),
|
||||||
("Remember password", "Kérlek emlékezz a jelszóra"),
|
("Remember password", "Jelszó megjegyzése"),
|
||||||
("Wrong Password", "Hibás jelszó"),
|
("Wrong Password", "Hibás jelszó"),
|
||||||
("Do you want to enter again?", "Újra szeretnéd próbálni?"),
|
("Do you want to enter again?", "Szeretne újra belépni?"),
|
||||||
("Connection Error", "Kapcsolódási Hiba"),
|
("Connection Error", "Csatlakozási hiba"),
|
||||||
("Error", "Hiba"),
|
("Error", "Hiba"),
|
||||||
("Reset by the peer", "A kapcsolatot alaphelyzetbe állt"),
|
("Reset by the peer", "A kapcsolatot alaphelyzetbe állt"),
|
||||||
("Connecting...", "Kapcsolódás..."),
|
("Connecting...", "Csatlakozás..."),
|
||||||
("Connection in progress. Please wait.", "A kapcsolódás folyamatban van. Kérlek várj."),
|
("Connection in progress. Please wait.", "Csatlakozás folyamatban. Kérem várjon."),
|
||||||
("Please try 1 minute later", "Kérlek próbáld újra 1 perc múlva."),
|
("Please try 1 minute later", "Kérem próbálja meg 1 perc múlva"),
|
||||||
("Login Error", "Belépési Hiba"),
|
("Login Error", "Bejelentkezési hiba"),
|
||||||
("Successful", "Sikeres"),
|
("Successful", "Sikeres"),
|
||||||
("Connected, waiting for image...", "Kapcsolódva, várakozás a képre..."),
|
("Connected, waiting for image...", "Csatlakozva, várakozás a kép adatokra..."),
|
||||||
("Name", "Név"),
|
("Name", "Név"),
|
||||||
("Type", "Fajta"),
|
("Type", "Típus"),
|
||||||
("Modified", "Módosított"),
|
("Modified", "Módosított"),
|
||||||
("Size", "Méret"),
|
("Size", "Méret"),
|
||||||
("Show Hidden Files", "Rejtett Fájlok Mutatása"),
|
("Show Hidden Files", "Rejtett fájlok mutatása"),
|
||||||
("Receive", "Kapni"),
|
("Receive", "Fogad"),
|
||||||
("Send", "Küldeni"),
|
("Send", "Küld"),
|
||||||
("Refresh File", "Fájlok Frissítése"),
|
("Refresh File", "Fájl frissítése"),
|
||||||
("Local", "Lokális"),
|
("Local", "Helyi"),
|
||||||
("Remote", "Távoli"),
|
("Remote", "Távoli"),
|
||||||
("Remote Computer", "Távoli Számítógép"),
|
("Remote Computer", "Távoli számítógép"),
|
||||||
("Local Computer", "Lokális Számítógép"),
|
("Local Computer", "Helyi számítógép"),
|
||||||
("Confirm Delete", "Törlés Megerősítése"),
|
("Confirm Delete", "Törlés megerősítése"),
|
||||||
("Delete", "Törlés"),
|
("Delete", "Törlés"),
|
||||||
("Properties", "Tulajdonságok"),
|
("Properties", "Tulajdonságok"),
|
||||||
("Multi Select", "Több fájl kiválasztása"),
|
("Multi Select", "Többszörös kijelölés"),
|
||||||
("Select All", ""),
|
("Select All", "Összes kijelölése"),
|
||||||
("Unselect All", ""),
|
("Unselect All", "Kijelölések megszűntetése"),
|
||||||
("Empty Directory", "Üres Könyvtár"),
|
("Empty Directory", "Üres könyvtár"),
|
||||||
("Not an empty directory", "Nem egy üres könyvtár"),
|
("Not an empty directory", "Nem egy üres könyvtár"),
|
||||||
("Are you sure you want to delete this file?", "Biztosan törölni szeretnéd ezt a fájlt?"),
|
("Are you sure you want to delete this file?", "Biztosan törli ezt a fájlt?"),
|
||||||
("Are you sure you want to delete this empty directory?", "Biztosan törölni szeretnéd ezt az üres könyvtárat?"),
|
("Are you sure you want to delete this empty directory?", "Biztosan törli ezt az üres könyvtárat?"),
|
||||||
("Are you sure you want to delete the file of this directory?", "Biztosan törölni szeretnéd a fájlokat ebben a könyvtárban?"),
|
("Are you sure you want to delete the file of this directory?", "Biztos benne, hogy törölni szeretné a könyvtár tartalmát?"),
|
||||||
("Do this for all conflicts", "Ezt tedd az összes konfliktussal"),
|
("Do this for all conflicts", "Tegye ezt minden ütközéskor"),
|
||||||
("This is irreversible!", "Ez a folyamat visszafordíthatatlan!"),
|
("This is irreversible!", "Ez a folyamat visszafordíthatatlan!"),
|
||||||
("Deleting", "A törlés folyamatban"),
|
("Deleting", "Törlés folyamatban"),
|
||||||
("files", "fájlok"),
|
("files", "fájlok"),
|
||||||
("Waiting", "Várunk"),
|
("Waiting", "Várakozás"),
|
||||||
("Finished", "Végzett"),
|
("Finished", "Befejezve"),
|
||||||
("Speed", "Gyorsaság"),
|
("Speed", "Sebesség"),
|
||||||
("Custom Image Quality", "Egyedi Képminőség"),
|
("Custom Image Quality", "Egyedi képminőség"),
|
||||||
("Privacy mode", "Inkognító mód"),
|
("Privacy mode", "Inkognító mód"),
|
||||||
("Block user input", "Felhasználói input blokkokolása"),
|
("Block user input", "Felhasználói bevitel letiltása"),
|
||||||
("Unblock user input", "Felhasználói input blokkolásának feloldása"),
|
("Unblock user input", "Felhasználói bevitel engedélyezése"),
|
||||||
("Adjust Window", "Ablakméret beállítása"),
|
("Adjust Window", "Ablakméret beállítása"),
|
||||||
("Original", "Eredeti"),
|
("Original", "Eredeti méret"),
|
||||||
("Shrink", "Zsugorított"),
|
("Shrink", "Kicsinyítés"),
|
||||||
("Stretch", "Nyújtott"),
|
("Stretch", "Nyújtás"),
|
||||||
("Scrollbar", "Görgetősáv"),
|
("Scrollbar", "Görgetősáv"),
|
||||||
("ScrollAuto", "Görgessen Auto"),
|
("ScrollAuto", "Automatikus görgetés"),
|
||||||
("Good image quality", "Jó képminőség"),
|
("Good image quality", "Eredetihez hű"),
|
||||||
("Balanced", "Balanszolt"),
|
("Balanced", "Kiegyensúlyozott"),
|
||||||
("Optimize reaction time", "Válaszidő optimializálása"),
|
("Optimize reaction time", "Gyorsan reagáló"),
|
||||||
("Custom", ""),
|
("Custom", "Egyedi"),
|
||||||
("Show remote cursor", "Távoli kurzor mutatása"),
|
("Show remote cursor", "Távoli kurzor megjelenítése"),
|
||||||
("Show quality monitor", "Minőségi monitor mutatása"),
|
("Show quality monitor", ""),
|
||||||
("Disable clipboard", "Vágólap Kikapcsolása"),
|
("Disable clipboard", "Közös vágólap kikapcsolása"),
|
||||||
("Lock after session end", "Lezárás a session végén"),
|
("Lock after session end", "Távoli fiók zárolása a munkamenet végén"),
|
||||||
("Insert", "Beszúrás"),
|
("Insert", ""),
|
||||||
("Insert Lock", "Beszúrási Zároló"),
|
("Insert Lock", "Távoli fiók zárolása"),
|
||||||
("Refresh", "Frissítés"),
|
("Refresh", "Frissítés"),
|
||||||
("ID does not exist", "Ez az ID nem létezik"),
|
("ID does not exist", "Az azonosító nem létezik"),
|
||||||
("Failed to connect to rendezvous server", "A randevú szerverhez való kapcsolódás sikertelen"),
|
("Failed to connect to rendezvous server", "Nem sikerült csatlakozni a kiszolgáló szerverhez"),
|
||||||
("Please try later", "Kérlek próbád később"),
|
("Please try later", "Kérjük, próbálja később"),
|
||||||
("Remote desktop is offline", "A távoli asztal offline"),
|
("Remote desktop is offline", "A távoli számítógép offline állapotban van"),
|
||||||
("Key mismatch", "Eltérés a kulcsokban"),
|
("Key mismatch", "Eltérés a kulcsokban"),
|
||||||
("Timeout", "Időtúllépés"),
|
("Timeout", "Időtúllépés"),
|
||||||
("Failed to connect to relay server", "A relay szerverhez való kapcsolódás sikertelen"),
|
("Failed to connect to relay server", "Nem sikerült csatlakozni a közvetítő szerverhez"),
|
||||||
("Failed to connect via rendezvous server", "A randevú szerverrel való kapcsolódás sikertelen"),
|
("Failed to connect via rendezvous server", "Nem sikerült csatlakozni a kiszolgáló szerveren keresztül"),
|
||||||
("Failed to connect via relay server", "A relay szerverrel való kapcsolódás sikertelen"),
|
("Failed to connect via relay server", "Nem sikerült csatlakozni a közvetítő szerveren keresztül"),
|
||||||
("Failed to make direct connection to remote desktop", "A távoli asztalhoz való direkt kapcsolódás sikertelen"),
|
("Failed to make direct connection to remote desktop", "Nem sikerült közvetlen kapcsolatot létesíteni a távoli számítógéppel"),
|
||||||
("Set Password", "Jelszó Beállítása"),
|
("Set Password", "Jelszó Beállítása"),
|
||||||
("OS Password", "Operációs Rendszer Jelszavának Beállítása"),
|
("OS Password", "Operációs rendszer jelszavának beállítása"),
|
||||||
("install_tip", "Az UAC (Felhasználói Fiók Felügyelet) miatt, a RustDesk nem fog rendesen funkcionálni mint távoli oldal néhány esetben. Hogy ezt kikerüld, vagy kikapcsold, kérlek nyomj rá a gombra ezalatt az üzenet alatt, hogy feltelepítsd a RustDesket a rendszerre."),
|
("install_tip", "Előfordul, hogy bizonyos esetekben hiba léphet fel a Portable verzió használata során. A megfelelő működés érdekében, kérem telepítse a RustDesk alkalmazást a számítógépre."),
|
||||||
("Click to upgrade", "Kattints a frissítés telepítéséhez"),
|
("Click to upgrade", "Kattintson ide a frissítés telepítéséhez"),
|
||||||
("Click to download", "Kattints a letöltéshez"),
|
("Click to download", "Kattintson ide a letöltéshez"),
|
||||||
("Click to update", "Kattints a frissítés letöltéséhez"),
|
("Click to update", "Kattintson ide a frissítés letöltéséhez"),
|
||||||
("Configure", "Beállítás"),
|
("Configure", "Beállítás"),
|
||||||
("config_acc", "Ahhoz hogy a RustDesket távolról irányítani tudd, \"Elérhetőségi\" jogokat kell adnod a RustDesk-nek."),
|
("config_acc", "A távoli vezérléshez a RustDesk-nek \"Kisegítő lehetőség\" engedélyre van szüksége"),
|
||||||
("config_screen", "Ahhoz hogy a RustDesket távolról irányítani tudd, \"Képernyőfelvételi\" jogokat kell adnod a RustDesk-nek."),
|
("config_screen", "A távoli vezérléshez szükséges a \"Képernyőfelvétel\" engedély megadása"),
|
||||||
("Installing ...", "Telepítés..."),
|
("Installing ...", "Telepítés..."),
|
||||||
("Install", "Telepítés"),
|
("Install", "Telepítés"),
|
||||||
("Installation", "Telepítés"),
|
("Installation", "Telepítés"),
|
||||||
("Installation Path", "Telepítési útvonal"),
|
("Installation Path", "Telepítési útvonal"),
|
||||||
("Create start menu shortcuts", "Start menu parancsikon létrehozása"),
|
("Create start menu shortcuts", "Start menü parancsikonok létrehozása"),
|
||||||
("Create desktop icon", "Asztali icon létrehozása"),
|
("Create desktop icon", "Ikon létrehozása az asztalon"),
|
||||||
("agreement_tip", "Azzal hogy elindítod a telepítést, elfogadod a licenszszerződést."),
|
("agreement_tip", "A telepítés folytatásával automatikusan elfogadásra kerül a licensz szerződés."),
|
||||||
("Accept and Install", "Elfogadás és Telepítés"),
|
("Accept and Install", "Elfogadás és telepítés"),
|
||||||
("End-user license agreement", "Felhasználói licencszerződés"),
|
("End-user license agreement", "Felhasználói licensz szerződés"),
|
||||||
("Generating ...", "Generálás..."),
|
("Generating ...", "Létrehozás..."),
|
||||||
("Your installation is lower version.", "A jelenleg feltelepített verzió régebbi."),
|
("Your installation is lower version.", "A telepített verzió alacsonyabb."),
|
||||||
("not_close_tcp_tip", "Ne zárd be ezt az ablakot miközben a tunnelt használod"),
|
("not_close_tcp_tip", "Ne zárja be ezt az ablakot miközben a tunnelt használja"),
|
||||||
("Listening ...", "Halgazózás..."),
|
("Listening ...", "Keresés..."),
|
||||||
("Remote Host", "Távoli Host"),
|
("Remote Host", "Távoli kiszolgáló"),
|
||||||
("Remote Port", "Távoli Port"),
|
("Remote Port", "Távoli port"),
|
||||||
("Action", "Akció"),
|
("Action", "Indítás"),
|
||||||
("Add", "Add"),
|
("Add", "Hozzáadás"),
|
||||||
("Local Port", "Lokális Port"),
|
("Local Port", "Helyi port"),
|
||||||
("Local Address", ""),
|
("Local Address", "Helyi cím"),
|
||||||
("Change Local Port", ""),
|
("Change Local Port", "Helyi port megváltoztatása"),
|
||||||
("setup_server_tip", "Egy gyorsabb kapcsolatért, kérlek hostolj egy saját szervert"),
|
("setup_server_tip", "Gyorsabb kapcsolat érdekében, hozzon létre saját szervert"),
|
||||||
("Too short, at least 6 characters.", "Túl rövid, legalább 6 karakter"),
|
("Too short, at least 6 characters.", "Túl rövid, legalább 6 karakter."),
|
||||||
("The confirmation is not identical.", "A megerősítés nem volt azonos"),
|
("The confirmation is not identical.", "A megerősítés nem volt azonos"),
|
||||||
("Permissions", "Jogok"),
|
("Permissions", "Engedélyek"),
|
||||||
("Accept", "Elfogad"),
|
("Accept", "Elfogadás"),
|
||||||
("Dismiss", "Elutasít"),
|
("Dismiss", "Elutasítás"),
|
||||||
("Disconnect", "Szétkapcsolás"),
|
("Disconnect", "Kapcsolat bontása"),
|
||||||
("Allow using keyboard and mouse", "Billentyűzet és egér használatának engedélyezése"),
|
("Allow using keyboard and mouse", "Billentyűzet és egér használatának engedélyezése"),
|
||||||
("Allow using clipboard", "Vágólap használatának engedélyezése"),
|
("Allow using clipboard", "Vágólap használatának engedélyezése"),
|
||||||
("Allow hearing sound", "Hang átvitelének engedélyezése"),
|
("Allow hearing sound", "Hang átvitelének engedélyezése"),
|
||||||
("Allow file copy and paste", "Fájlok másolásának és beillesztésének engedélyezése"),
|
("Allow file copy and paste", "Fájlok másolásának és beillesztésének engedélyezése"),
|
||||||
("Connected", "Kapcsolódva"),
|
("Connected", "Csatlakozva"),
|
||||||
("Direct and encrypted connection", "Direkt, és titkosított kapcsolat"),
|
("Direct and encrypted connection", "Közvetlen, és titkosított kapcsolat"),
|
||||||
("Relayed and encrypted connection", "Relayelt, és titkosított kapcsolat"),
|
("Relayed and encrypted connection", "Továbbított, és titkosított kapcsolat"),
|
||||||
("Direct and unencrypted connection", "Direkt, és nem titkosított kapcsolat"),
|
("Direct and unencrypted connection", "Közvetlen, és nem titkosított kapcsolat"),
|
||||||
("Relayed and unencrypted connection", "Rekayelt, és nem titkosított kapcsolat"),
|
("Relayed and unencrypted connection", "Továbbított, és nem titkosított kapcsolat"),
|
||||||
("Enter Remote ID", "Kérlek írd be a távoli ID-t"),
|
("Enter Remote ID", "Távoli számítógép azonosítója"),
|
||||||
("Enter your password", "Kérlek írd be a jelszavadat"),
|
("Enter your password", "Írja be a jelszavát"),
|
||||||
("Logging in...", "A belépés folyamatban..."),
|
("Logging in...", "A belépés folyamatban..."),
|
||||||
("Enable RDP session sharing", "Az RDP session megosztás engedélyezése"),
|
("Enable RDP session sharing", "RDP-munkamenet-megosztás engedélyezése"),
|
||||||
("Auto Login", "Automatikus Login"),
|
("Auto Login", "Automatikus bejelentkezés"),
|
||||||
("Enable Direct IP Access", "Direkt IP elérés engedélyezése"),
|
("Enable Direct IP Access", "Közvetlen IP-elérés engedélyezése"),
|
||||||
("Rename", "Átnevezés"),
|
("Rename", "Átnevezés"),
|
||||||
("Space", "Hely"),
|
("Space", ""),
|
||||||
("Create Desktop Shortcut", "Asztali Parancsikon Lértehozása"),
|
("Create Desktop Shortcut", "Asztali parancsikon létrehozása"),
|
||||||
("Change Path", "Útvonal Megváltoztatása"),
|
("Change Path", "Elérési út módosítása"),
|
||||||
("Create Folder", "Mappa Készítése"),
|
("Create Folder", "Mappa létrehozás"),
|
||||||
("Please enter the folder name", "Kérlek írd be a mappa nevét"),
|
("Please enter the folder name", "Kérjük, adja meg a mappa nevét"),
|
||||||
("Fix it", "Kérlek javísd meg"),
|
("Fix it", "Javítás"),
|
||||||
("Warning", "Figyelem"),
|
("Warning", "Figyelmeztetés"),
|
||||||
("Login screen using Wayland is not supported", "A belépési kijelzővel a Wayland használata nem támogatott"),
|
("Login screen using Wayland is not supported", "Bejelentkezéskori Wayland használata nem támogatott"),
|
||||||
("Reboot required", "Újraindítás szükséges"),
|
("Reboot required", "Újraindítás szükséges"),
|
||||||
("Unsupported display server ", "Nem támogatott kijelző szerver"),
|
("Unsupported display server ", "Nem támogatott megjelenítő szerver"),
|
||||||
("x11 expected", "x11-re számítottt"),
|
("x11 expected", "x11-re számítottt"),
|
||||||
("Port", ""),
|
("Port", "Port"),
|
||||||
("Settings", "Beállítások"),
|
("Settings", "Beállítások"),
|
||||||
("Username", "Felhasználónév"),
|
("Username", "Felhasználónév"),
|
||||||
("Invalid port", "Érvénytelen port"),
|
("Invalid port", "Érvénytelen port"),
|
||||||
("Closed manually by the peer", "A kapcsolat manuálisan be lett zárva a másik fél álltal"),
|
("Closed manually by the peer", "A kapcsolatot a másik fél manuálisan bezárta"),
|
||||||
("Enable remote configuration modification", "Távoli konfiguráció módosítás engedélyezése"),
|
("Enable remote configuration modification", "Távoli konfiguráció módosítás engedélyezése"),
|
||||||
("Run without install", "Futtatás feltelepítés nélkül"),
|
("Run without install", "Futtatás feltelepítés nélkül"),
|
||||||
("Always connected via relay", "Mindig relay által kapcsolódott"),
|
("Always connected via relay", "Mindig közvetítőn keresztül csatlakozik"),
|
||||||
("Always connect via relay", "Mindig relay által kapcsolódik"),
|
("Always connect via relay", "Mindig közvetítőn keresztüli csatlakozás"),
|
||||||
("whitelist_tip", "Csak a fehérlistán lévő címek érhetnek el"),
|
("whitelist_tip", "Csak az engedélyezési listán szereplő címek csatlakozhatnak"),
|
||||||
("Login", "Belépés"),
|
("Login", "Belépés"),
|
||||||
("Logout", "Kilépés"),
|
("Logout", "Kilépés"),
|
||||||
("Tags", "Tagok"),
|
("Tags", "Tagok"),
|
||||||
("Search ID", "ID keresés"),
|
("Search ID", "Azonosító keresése..."),
|
||||||
("Current Wayland display server is not supported", "Jelenleg a Wayland display szerver nem támogatott"),
|
("Current Wayland display server is not supported", "A Wayland display szerver nem támogatott"),
|
||||||
("whitelist_sep", "Ide jönnek a címek, vesző, pontosvessző, space, vagy új sorral elválasztva"),
|
("whitelist_sep", "A címeket veszővel, pontosvesszővel, szóközzel, vagy új sorral válassza el"),
|
||||||
("Add ID", "ID Hozzáadása"),
|
("Add ID", "Azonosító hozzáadása"),
|
||||||
("Add Tag", "Tag Hozzáadása"),
|
("Add Tag", "Címke hozzáadása"),
|
||||||
("Unselect all tags", "Az összes tag kiválasztásának törlése"),
|
("Unselect all tags", "A címkék kijelölésének megszüntetése"),
|
||||||
("Network error", "Hálózati hiba"),
|
("Network error", "Hálózati hiba"),
|
||||||
("Username missed", "A felhasználónév kimaradt"),
|
("Username missed", "Üres felhasználónév"),
|
||||||
("Password missed", "A jelszó kimaradt"),
|
("Password missed", "Üres jelszó"),
|
||||||
("Wrong credentials", "Hibás felhasználónév vagy jelszó"),
|
("Wrong credentials", "Hibás felhasználónév vagy jelszó"),
|
||||||
("Edit Tag", "A tag(ok) szerkeztése"),
|
("Edit Tag", "Címke szerkesztése"),
|
||||||
("Unremember Password", "A jelszó megjegyzésének törlése"),
|
("Unremember Password", "A jelszó megjegyzésének törlése"),
|
||||||
("Favorites", "Kedvencek"),
|
("Favorites", "Kedvencek"),
|
||||||
("Add to Favorites", "Hozzáadás a kedvencekhez"),
|
("Add to Favorites", "Hozzáadás a kedvencekhez"),
|
||||||
("Remove from Favorites", "Eltávolítás a kedvencektől"),
|
("Remove from Favorites", "Eltávolítás a kedvencekből"),
|
||||||
("Empty", "Üres"),
|
("Empty", "Üres"),
|
||||||
("Invalid folder name", "Helytelen fájlnév"),
|
("Invalid folder name", "Helytelen mappa név"),
|
||||||
("Socks5 Proxy", "Socks5-ös Proxy"),
|
("Socks5 Proxy", "Socks5 Proxy"),
|
||||||
("Hostname", "Hostnév"),
|
("Hostname", "Kiszolgáló név"),
|
||||||
("Discovered", "Felfedezés"),
|
("Discovered", "Felfedezett"),
|
||||||
("install_daemon_tip", "Ahhoz hogy a RustDesk bootkor elinduljon, telepítened kell a rendszer szolgáltatást."),
|
("install_daemon_tip", "Az automatikus indításhoz szükséges a szolgáltatás telepítése"),
|
||||||
("Remote ID", "Távoli ID"),
|
("Remote ID", "Távoli azonosító"),
|
||||||
("Paste", "Beillesztés"),
|
("Paste", "Beillesztés"),
|
||||||
("Paste here?", "Beillesztés ide?"),
|
("Paste here?", "Beilleszti ide?"),
|
||||||
("Are you sure to close the connection?", "Biztos vagy benne hogy be szeretnéd zárni a kapcsolatot?"),
|
("Are you sure to close the connection?", "Biztos, hogy bezárja a kapcsolatot?"),
|
||||||
("Download new version", "Új verzó letöltése"),
|
("Download new version", "Új verzó letöltése"),
|
||||||
("Touch mode", "Érintési mód bekapcsolása"),
|
("Touch mode", "Érintési mód bekapcsolása"),
|
||||||
("Mouse mode", "Egérhasználati mód bekapcsolása"),
|
("Mouse mode", "Egérhasználati mód bekapcsolása"),
|
||||||
("One-Finger Tap", "Egyújas érintés"),
|
("One-Finger Tap", "Egyujjas érintés"),
|
||||||
("Left Mouse", "Baloldali Egér"),
|
("Left Mouse", "Bal egér gomb"),
|
||||||
("One-Long Tap", "Egy hosszú érintés"),
|
("One-Long Tap", "Hosszú érintés"),
|
||||||
("Two-Finger Tap", "Két újas érintés"),
|
("Two-Finger Tap", "Kétujjas érintés"),
|
||||||
("Right Mouse", "Jobboldali Egér"),
|
("Right Mouse", "Jobb egér gomb"),
|
||||||
("One-Finger Move", "Egyújas mozgatás"),
|
("One-Finger Move", "Egyujjas mozgatás"),
|
||||||
("Double Tap & Move", "Kétszeri érintés, és Mozgatás"),
|
("Double Tap & Move", "Dupla érintés, és mozgatás"),
|
||||||
("Mouse Drag", "Egérrel való húzás"),
|
("Mouse Drag", "Mozgatás egérrel"),
|
||||||
("Three-Finger vertically", "Három ujj függőlegesen"),
|
("Three-Finger vertically", "Három ujj függőlegesen"),
|
||||||
("Mouse Wheel", "Egérgörgő"),
|
("Mouse Wheel", "Egérgörgő"),
|
||||||
("Two-Finger Move", "Kátújas mozgatás"),
|
("Two-Finger Move", "Kátujjas mozgatás"),
|
||||||
("Canvas Move", "Nézet Mozgatása"),
|
("Canvas Move", "Nézet mozgatása"),
|
||||||
("Pinch to Zoom", "Húzd össze a nagyításhoz"),
|
("Pinch to Zoom", "Kétujjas nagyítás"),
|
||||||
("Canvas Zoom", "Nézet Nagyítása"),
|
("Canvas Zoom", "Nézet nagyítása"),
|
||||||
("Reset canvas", "Nézet visszaállítása"),
|
("Reset canvas", "Nézet visszaállítása"),
|
||||||
("No permission of file transfer", "Nincs jogod fájl transzer indításához"),
|
("No permission of file transfer", "Nincs engedély a fájlátvitelre"),
|
||||||
("Note", "Megyjegyzés"),
|
("Note", "Megyjegyzés"),
|
||||||
("Connection", "Kapcsolat"),
|
("Connection", "Kapcsolat"),
|
||||||
("Share Screen", "Képernyőmegosztás"),
|
("Share Screen", "Képernyőmegosztás"),
|
||||||
("CLOSE", "LETILT"),
|
("CLOSE", "BEZÁRÁS"),
|
||||||
("OPEN", "ENGEDÉLYEZ"),
|
("OPEN", "MEGNYITÁS"),
|
||||||
("Chat", "Chat"),
|
("Chat", "Chat"),
|
||||||
("Total", "Összes"),
|
("Total", "Összes"),
|
||||||
("items", "Tárgyak"),
|
("items", "elemek"),
|
||||||
("Selected", "Kiválasztott"),
|
("Selected", "Kijelölt"),
|
||||||
("Screen Capture", "Képernyőrögzítés"),
|
("Screen Capture", "Képernyőrögzítés"),
|
||||||
("Input Control", "Input Kontrol"),
|
("Input Control", "Távoli vezérlés"),
|
||||||
("Audio Capture", "Audió Rögzítés"),
|
("Audio Capture", "Hangrögzítés"),
|
||||||
("File Connection", "Fájlkapcsolat"),
|
("File Connection", "Fájlátvitel"),
|
||||||
("Screen Connection", "Új Vizuális Kapcsolat"),
|
("Screen Connection", "Képátvitel"),
|
||||||
("Do you accept?", "Elfogadod?"),
|
("Do you accept?", "Elfogadja?"),
|
||||||
("Open System Setting", "Rendszer beállítások megnyitása"),
|
("Open System Setting", "Rendszerbeállítások megnyitása"),
|
||||||
("How to get Android input permission?", "Hogyan állíthatok be Android input jogokat?"),
|
("How to get Android input permission?", "Hogyan állíthatok be Android beviteli engedélyt?"),
|
||||||
("android_input_permission_tip1", "Ahhoz hogy egy távoli eszköz kontolálhassa az Android eszközödet egérrel vagy érintéssel, jogot kell adnod a RustDesk-nek, hogy használja az \"Elérhetőségi\" szolgáltatást."),
|
("android_input_permission_tip1", "A távoli vezérléshez kérjük engedélyezze a \"Kisegítő lehetőség\" lehetőséget."),
|
||||||
("android_input_permission_tip2", "Kérlek navigálj a rendszer beállításaihoz, keresd meg vagy írd be hogy [Feltelepített Szolgáltatások], és kapcsold be a [RustDesk Input] szolgáltatást."),
|
("android_input_permission_tip2", "A következő rendszerbeállítások oldalon a letöltött alkalmazások menüponton belül, kapcsolja be a [RustDesk Input] szolgáltatást."),
|
||||||
("android_new_connection_tip", "Új kontrollálási kérés érkezett, amely irányítani szeretné az eszközöded."),
|
("android_new_connection_tip", "Új kérés érkezett mely vezérelni szeretné az eszközét"),
|
||||||
("android_service_will_start_tip", "A \"Képernyőrögzítés\" engedélyezése automatikusan elindítja majd a szolgáltatást, amely megengedi más eszközöknek hogy kérést kezdeményezzenek az eszköz felé."),
|
("android_service_will_start_tip", "A \"Képernyőrögzítés\" bekapcsolásával automatikus elindul a szolgáltatás, lehetővé téve, hogy más eszközök csatlakozási kérelmet küldhessenek"),
|
||||||
("android_stop_service_tip", "A szolgáltatás bezárása automatikusan szétkapcsol minden létező kapcsolatot."),
|
("android_stop_service_tip", "A szolgáltatás leállítása automatikusan szétkapcsol minden létező kapcsolatot."),
|
||||||
("android_version_audio_tip", "A jelenlegi Android verzió nem támogatja a hangrögzítést, kérlek frissíts legalább Android 10-re, vagy egy újabb verzióra."),
|
("android_version_audio_tip", "A jelenlegi Android verzió nem támogatja a hangrögzítést, frissítsen legalább Android 10-re, vagy egy újabb verzióra."),
|
||||||
("android_start_service_tip", "Nyomj a [Szolgáltatás Indítása] opcióra, vagy adj [Képernyőrözítési] jogot az applikációnak hogy elindítsd a képernyőmegosztó szolgáltatást."),
|
("android_start_service_tip", "Nyomjon a [Szolgáltatás indítása] gombra, vagy adjon [Képernyőrözítési] engedélyt az applikációnak hogy elindítsa a képernyőmegosztó szolgáltatást."),
|
||||||
("Account", ""),
|
("Account", "Fiók"),
|
||||||
("Overwrite", "Felülírás"),
|
("Overwrite", "Felülírás"),
|
||||||
("This file exists, skip or overwrite this file?", "Ez a fájl már létezik, skippeljünk, vagy felülírjuk ezt a fájlt?"),
|
("This file exists, skip or overwrite this file?", "Ez a fájl már létezik, kihagyja vagy felülírja ezt a fájlt?"),
|
||||||
("Quit", "Kilépés"),
|
("Quit", "Kilépés"),
|
||||||
("doc_mac_permission", "https://rustdesk.com/docs/hu/manual/mac/#enable-permissions"),
|
("doc_mac_permission", "https://rustdesk.com/docs/hu/manual/mac/#enable-permissions"),
|
||||||
("Help", "Segítség"),
|
("Help", "Segítség"),
|
||||||
("Failed", "Sikertelen"),
|
("Failed", "Sikertelen"),
|
||||||
("Succeeded", "Sikeres"),
|
("Succeeded", "Sikeres"),
|
||||||
("Someone turns on privacy mode, exit", "Valaki bekacsolta a privát módot, lépj ki"),
|
("Someone turns on privacy mode, exit", "Valaki bekacsolta az inkognitó módot, lépjen ki"),
|
||||||
("Unsupported", "Nem támogatott"),
|
("Unsupported", "Nem támogatott"),
|
||||||
("Peer denied", "Elutasítva a távoli fél álltal"),
|
("Peer denied", "Elutasítva a távoli fél álltal"),
|
||||||
("Please install plugins", "Kérlek telepítsd a pluginokat"),
|
("Please install plugins", "Kérem telepítse a bővítményeket"),
|
||||||
("Peer exit", "A távoli fél kilépett"),
|
("Peer exit", "A távoli fél kilépett"),
|
||||||
("Failed to turn off", "Nem tudtuk kikapcsolni"),
|
("Failed to turn off", "Nem sikerült kikapcsolni"),
|
||||||
("Turned off", "Kikapcsolva"),
|
("Turned off", "Kikapcsolva"),
|
||||||
("In privacy mode", "Belépés a privát módba"),
|
("In privacy mode", "Belépés inkognitó módba"),
|
||||||
("Out privacy mode", "Kilépés a privát módból"),
|
("Out privacy mode", "Kilépés inkognitó módból"),
|
||||||
("Language", "Nyelv"),
|
("Language", "Nyelv"),
|
||||||
("Keep RustDesk background service", ""),
|
("Keep RustDesk background service", "RustDesk futtatása a háttérben"),
|
||||||
("Ignore Battery Optimizations", ""),
|
("Ignore Battery Optimizations", "Akkumulátorkímélő figyelmen kívűl hagyása"),
|
||||||
("android_open_battery_optimizations_tip", ""),
|
("android_open_battery_optimizations_tip", "Ha le szeretné tiltani ezt a funkciót, lépjen a RustDesk alkalmazás beállítási oldalára, keresse meg az [Akkumulátorkímélő] lehetőséget és válassza a nincs korlátozás lehetőséget."),
|
||||||
("Connection not allowed", ""),
|
("Connection not allowed", "A csatlakozás nem engedélyezett"),
|
||||||
("Legacy mode", ""),
|
("Legacy mode", ""),
|
||||||
("Map mode", ""),
|
("Map mode", ""),
|
||||||
("Translate mode", ""),
|
("Translate mode", "Fordító mód"),
|
||||||
("Use temporary password", ""),
|
("Use permanent password", "Állandó jelszó használata"),
|
||||||
("Use permanent password", ""),
|
("Use both passwords", "Mindkét jelszó használata"),
|
||||||
("Use both passwords", ""),
|
("Set permanent password", "Állandó jelszó beállítása"),
|
||||||
("Set permanent password", ""),
|
("Enable Remote Restart", "Távoli újraindítás engedélyezése"),
|
||||||
("Set temporary password length", ""),
|
("Allow remote restart", "Távoli újraindítás engedélyezése"),
|
||||||
("Enable Remote Restart", ""),
|
("Restart Remote Device", "Távoli eszköz újraindítása"),
|
||||||
("Allow remote restart", ""),
|
("Are you sure you want to restart", "Biztos szeretné újraindítani?"),
|
||||||
("Restart Remote Device", ""),
|
("Restarting Remote Device", "Távoli eszköz újraindítása..."),
|
||||||
("Are you sure you want to restart", ""),
|
("remote_restarting_tip", "A távoli eszköz újraindul, zárja be ezt az üzenetet, csatlakozzon újra, állandó jelszavával"),
|
||||||
("Restarting Remote Device", ""),
|
("Copied", "Másolva"),
|
||||||
("remote_restarting_tip", ""),
|
("Exit Fullscreen", "Kilépés teljes képernyős módból"),
|
||||||
("Copied", ""),
|
|
||||||
("Exit Fullscreen", "Lépjen ki a teljes képernyőről"),
|
|
||||||
("Fullscreen", "Teljes képernyő"),
|
("Fullscreen", "Teljes képernyő"),
|
||||||
("Mobile Actions", "mobil műveletek"),
|
("Mobile Actions", "mobil műveletek"),
|
||||||
("Select Monitor", "Válassza a Monitor lehetőséget"),
|
("Select Monitor", "Válasszon képernyőt"),
|
||||||
("Control Actions", "Irányítási műveletek"),
|
("Control Actions", "Irányítási műveletek"),
|
||||||
("Display Settings", "Megjelenítési beállítások"),
|
("Display Settings", "Megjelenítési beállítások"),
|
||||||
("Ratio", "Hányados"),
|
("Ratio", "Arány"),
|
||||||
("Image Quality", "Képminőség"),
|
("Image Quality", "Képminőség"),
|
||||||
("Scroll Style", "Görgetési stílus"),
|
("Scroll Style", "Görgetési stílus"),
|
||||||
("Show Menubar", "Menüsor megjelenítése"),
|
("Show Menubar", "Menüsor megjelenítése"),
|
||||||
("Hide Menubar", "menüsor elrejtése"),
|
("Hide Menubar", "Menüsor elrejtése"),
|
||||||
("Direct Connection", "Közvetlen kapcsolat"),
|
("Direct Connection", "Közvetlen kapcsolat"),
|
||||||
("Relay Connection", "Relé csatlakozás"),
|
("Relay Connection", "Közvetett csatlakozás"),
|
||||||
("Secure Connection", "Biztonságos kapcsolat"),
|
("Secure Connection", "Biztonságos kapcsolat"),
|
||||||
("Insecure Connection", "Nem biztonságos kapcsolat"),
|
("Insecure Connection", "Nem biztonságos kapcsolat"),
|
||||||
("Scale original", "Eredeti méretarány"),
|
("Scale original", "Eredeti méretarány"),
|
||||||
("Scale adaptive", "Skála adaptív"),
|
("Scale adaptive", "Adaptív méretarány"),
|
||||||
("General", ""),
|
("General", "Általános"),
|
||||||
("Security", ""),
|
("Security", "Biztonság"),
|
||||||
("Account", ""),
|
("Account", "Fiók"),
|
||||||
("Theme", ""),
|
("Theme", "Téma"),
|
||||||
("Dark Theme", ""),
|
("Dark Theme", "Sötét téma"),
|
||||||
("Dark", ""),
|
("Dark", "Sötét"),
|
||||||
("Light", ""),
|
("Light", "Világos"),
|
||||||
("Follow System", ""),
|
("Follow System", ""),
|
||||||
("Enable hardware codec", ""),
|
("Enable hardware codec", "Hardveres kodek engedélyezése"),
|
||||||
("Unlock Security Settings", ""),
|
("Unlock Security Settings", "Biztonsági beállítások feloldása"),
|
||||||
("Enable Audio", ""),
|
("Enable Audio", "Hang engedélyezése"),
|
||||||
("Temporary Password Length", ""),
|
("Unlock Network Settings", "Hálózati beállítások feloldása"),
|
||||||
("Unlock Network Settings", ""),
|
("Server", "Szerver"),
|
||||||
("Server", ""),
|
("Direct IP Access", "Közvetlen IP hozzáférés"),
|
||||||
("Direct IP Access", ""),
|
("Proxy", "Proxy"),
|
||||||
("Proxy", ""),
|
("Port", "Port"),
|
||||||
("Port", ""),
|
("Apply", "Alkalmaz"),
|
||||||
("Apply", ""),
|
("Disconnect all devices?", "Leválasztja az összes eszközt?"),
|
||||||
("Disconnect all devices?", ""),
|
("Clear", "Tisztítás"),
|
||||||
("Clear", ""),
|
("Audio Input Device", "Audio bemeneti eszköz"),
|
||||||
("Audio Input Device", ""),
|
("Deny remote access", "Távoli hozzáférés megtagadása"),
|
||||||
("Deny remote access", ""),
|
("Use IP Whitelisting", "Engedélyezési lista használata"),
|
||||||
("Use IP Whitelisting", ""),
|
("Network", "Hálózat"),
|
||||||
("Network", ""),
|
("Enable RDP", "RDP engedélyezése"),
|
||||||
("Enable RDP", ""),
|
|
||||||
("Pin menubar", "Menüsor rögzítése"),
|
("Pin menubar", "Menüsor rögzítése"),
|
||||||
("Unpin menubar", "Menüsor rögzítésének feloldása"),
|
("Unpin menubar", "Menüsor rögzítésének feloldása"),
|
||||||
("Recording", ""),
|
("Recording", "Felvétel"),
|
||||||
("Directory", ""),
|
("Directory", "Könyvtár"),
|
||||||
("Automatically record incoming sessions", ""),
|
("Automatically record incoming sessions", "A bejövő munkamenetek automatikus rögzítése"),
|
||||||
("Change", ""),
|
("Change", "Változtatás"),
|
||||||
("Start session recording", ""),
|
("Start session recording", "Munkamenet rögzítés indítása"),
|
||||||
("Stop session recording", ""),
|
("Stop session recording", "Munkamenet rögzítés leállítása"),
|
||||||
("Enable Recording Session", ""),
|
("Enable Recording Session", "Munkamenet rögzítés engedélyezése"),
|
||||||
("Allow recording session", ""),
|
("Allow recording session", "Munkamenet rögzítés engedélyezése"),
|
||||||
("Enable LAN Discovery", ""),
|
("Enable LAN Discovery", "Felfedezés enegedélyezése"),
|
||||||
("Deny LAN Discovery", ""),
|
("Deny LAN Discovery", "Felfedezés tiltása"),
|
||||||
("Write a message", ""),
|
("Write a message", "Üzenet írása"),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
("Disconnected", "Szétkapcsolva"),
|
||||||
("Disconnected", ""),
|
("Other", "Egyéb"),
|
||||||
("Other", ""),
|
("Confirm before closing multiple tabs", "Biztos, hogy bezárja az összes lapot?"),
|
||||||
("Confirm before closing multiple tabs", ""),
|
("Keyboard Settings", "Billentyűzet beállítások"),
|
||||||
("Keyboard Settings", ""),
|
("Custom", "Egyedi"),
|
||||||
("Custom", ""),
|
("Full Access", "Teljes hozzáférés"),
|
||||||
("Full Access", ""),
|
("Screen Share", "Képernyőmegosztás"),
|
||||||
("Screen Share", ""),
|
|
||||||
("Wayland requires Ubuntu 21.04 or higher version.", "A Waylandhoz Ubuntu 21.04 vagy újabb verzió szükséges."),
|
("Wayland requires Ubuntu 21.04 or higher version.", "A Waylandhoz Ubuntu 21.04 vagy újabb verzió szükséges."),
|
||||||
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "A Wayland a Linux disztró magasabb verzióját igényli. Próbálja ki az X11 desktopot, vagy változtassa meg az operációs rendszert."),
|
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "A Wayland a Linux disztró magasabb verzióját igényli. Próbálja ki az X11 desktopot, vagy változtassa meg az operációs rendszert."),
|
||||||
("JumpLink", "View"),
|
("JumpLink", "Hiperhivatkozás"),
|
||||||
("Please Select the screen to be shared(Operate on the peer side).", "Kérjük, válassza ki a megosztani kívánt képernyőt (a társoldalon működjön)."),
|
("Please Select the screen to be shared(Operate on the peer side).", "Kérjük, válassza ki a megosztani kívánt képernyőt."),
|
||||||
("Show RustDesk", ""),
|
("Show RustDesk", "A RustDesk megjelenítése"),
|
||||||
("This PC", ""),
|
("This PC", "Ez a számítógép"),
|
||||||
("or", ""),
|
("or", "vagy"),
|
||||||
("Continue with", ""),
|
("Continue with", "Folytatás a következővel"),
|
||||||
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", "Mode lama"),
|
("Legacy mode", "Mode lama"),
|
||||||
("Map mode", "Mode peta"),
|
("Map mode", "Mode peta"),
|
||||||
("Translate mode", "Mode terjemahan"),
|
("Translate mode", "Mode terjemahan"),
|
||||||
("Use temporary password", "Gunakan kata sandi sementara"),
|
|
||||||
("Use permanent password", "Gunakan kata sandi permanaen"),
|
("Use permanent password", "Gunakan kata sandi permanaen"),
|
||||||
("Use both passwords", "Gunakan kedua kata sandi "),
|
("Use both passwords", "Gunakan kedua kata sandi "),
|
||||||
("Set permanent password", "Setel kata sandi permanen"),
|
("Set permanent password", "Setel kata sandi permanen"),
|
||||||
("Set temporary password length", "Setel panjang kata sandi sementara"),
|
|
||||||
("Enable Remote Restart", "Aktifkan Restart Jarak Jauh"),
|
("Enable Remote Restart", "Aktifkan Restart Jarak Jauh"),
|
||||||
("Allow remote restart", "Ijinkan Restart Jarak Jauh"),
|
("Allow remote restart", "Ijinkan Restart Jarak Jauh"),
|
||||||
("Restart Remote Device", "Restart Perangkat Jarak Jauh"),
|
("Restart Remote Device", "Restart Perangkat Jarak Jauh"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", "Aktifkan codec perangkat keras"),
|
("Enable hardware codec", "Aktifkan codec perangkat keras"),
|
||||||
("Unlock Security Settings", "Buka Kunci Pengaturan Keamanan"),
|
("Unlock Security Settings", "Buka Kunci Pengaturan Keamanan"),
|
||||||
("Enable Audio", "Aktifkan Audio"),
|
("Enable Audio", "Aktifkan Audio"),
|
||||||
("Temporary Password Length", "Panjang Kata Sandi Sementara"),
|
|
||||||
("Unlock Network Settings", "Buka Kunci Pengaturan Jaringan"),
|
("Unlock Network Settings", "Buka Kunci Pengaturan Jaringan"),
|
||||||
("Server", "Server"),
|
("Server", "Server"),
|
||||||
("Direct IP Access", "Direct IP Access"),
|
("Direct IP Access", "Direct IP Access"),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", "Tolak Penemuan LAN"),
|
("Deny LAN Discovery", "Tolak Penemuan LAN"),
|
||||||
("Write a message", "Menulis pesan"),
|
("Write a message", "Menulis pesan"),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
|
||||||
("Disconnected", "Terputus"),
|
("Disconnected", "Terputus"),
|
||||||
("Other", "Lainnya"),
|
("Other", "Lainnya"),
|
||||||
("Confirm before closing multiple tabs", "Konfirmasi sebelum menutup banyak tab"),
|
("Confirm before closing multiple tabs", "Konfirmasi sebelum menutup banyak tab"),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
("Continue with", ""),
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
146
src/lang/it.rs
146
src/lang/it.rs
@ -30,9 +30,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("IP Whitelisting", "IP autorizzati"),
|
("IP Whitelisting", "IP autorizzati"),
|
||||||
("ID/Relay Server", "Server ID/Relay"),
|
("ID/Relay Server", "Server ID/Relay"),
|
||||||
("Import Server Config", "Importa configurazione Server"),
|
("Import Server Config", "Importa configurazione Server"),
|
||||||
("Export Server Config", ""),
|
("Export Server Config", "Esporta configurazione Server"),
|
||||||
("Import server configuration successfully", "Configurazione Server importata con successo"),
|
("Import server configuration successfully", "Configurazione Server importata con successo"),
|
||||||
("Export server configuration successfully", ""),
|
("Export server configuration successfully", "Configurazione Server esportata con successo"),
|
||||||
("Invalid server configuration", "Configurazione Server non valida"),
|
("Invalid server configuration", "Configurazione Server non valida"),
|
||||||
("Clipboard is empty", "Gli appunti sono vuoti"),
|
("Clipboard is empty", "Gli appunti sono vuoti"),
|
||||||
("Stop service", "Arresta servizio"),
|
("Stop service", "Arresta servizio"),
|
||||||
@ -89,8 +89,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Delete", "Eliminare"),
|
("Delete", "Eliminare"),
|
||||||
("Properties", "Proprietà"),
|
("Properties", "Proprietà"),
|
||||||
("Multi Select", "Selezione multipla"),
|
("Multi Select", "Selezione multipla"),
|
||||||
("Select All", ""),
|
("Select All", "Seleziona tutto"),
|
||||||
("Unselect All", ""),
|
("Unselect All", "Deseleziona tutto"),
|
||||||
("Empty Directory", "Directory vuota"),
|
("Empty Directory", "Directory vuota"),
|
||||||
("Not an empty directory", "Non una directory vuota"),
|
("Not an empty directory", "Non una directory vuota"),
|
||||||
("Are you sure you want to delete this file?", "Vuoi davvero eliminare questo file?"),
|
("Are you sure you want to delete this file?", "Vuoi davvero eliminare questo file?"),
|
||||||
@ -113,12 +113,12 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Stretch", "Allarga"),
|
("Stretch", "Allarga"),
|
||||||
("Scrollbar", "Barra di scorrimento"),
|
("Scrollbar", "Barra di scorrimento"),
|
||||||
("ScrollAuto", "Scorri automaticamente"),
|
("ScrollAuto", "Scorri automaticamente"),
|
||||||
("Good image quality", "Buona qualità immagine"),
|
("Good image quality", "Qualità immagine migliore"),
|
||||||
("Balanced", "Bilanciato"),
|
("Balanced", "Bilanciato"),
|
||||||
("Optimize reaction time", "Ottimizza il tempo di reazione"),
|
("Optimize reaction time", "Ottimizza il tempo di reazione"),
|
||||||
("Custom", ""),
|
("Custom", "Personalizza"),
|
||||||
("Show remote cursor", "Mostra il cursore remoto"),
|
("Show remote cursor", "Mostra il cursore remoto"),
|
||||||
("Show quality monitor", ""),
|
("Show quality monitor", "Visualizza qualità video"),
|
||||||
("Disable clipboard", "Disabilita appunti"),
|
("Disable clipboard", "Disabilita appunti"),
|
||||||
("Lock after session end", "Blocca al termine della sessione"),
|
("Lock after session end", "Blocca al termine della sessione"),
|
||||||
("Insert", "Inserisci"),
|
("Insert", "Inserisci"),
|
||||||
@ -161,8 +161,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Action", "Azione"),
|
("Action", "Azione"),
|
||||||
("Add", "Aggiungi"),
|
("Add", "Aggiungi"),
|
||||||
("Local Port", "Porta locale"),
|
("Local Port", "Porta locale"),
|
||||||
("Local Address", ""),
|
("Local Address", "Indirizzo locale"),
|
||||||
("Change Local Port", ""),
|
("Change Local Port", "Cambia porta locale"),
|
||||||
("setup_server_tip", "Per una connessione più veloce, configura un tuo server"),
|
("setup_server_tip", "Per una connessione più veloce, configura un tuo server"),
|
||||||
("Too short, at least 6 characters.", "Troppo breve, almeno 6 caratteri"),
|
("Too short, at least 6 characters.", "Troppo breve, almeno 6 caratteri"),
|
||||||
("The confirmation is not identical.", "La conferma non corrisponde"),
|
("The confirmation is not identical.", "La conferma non corrisponde"),
|
||||||
@ -197,7 +197,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Reboot required", "Riavvio necessario"),
|
("Reboot required", "Riavvio necessario"),
|
||||||
("Unsupported display server ", "Display server non supportato"),
|
("Unsupported display server ", "Display server non supportato"),
|
||||||
("x11 expected", "x11 necessario"),
|
("x11 expected", "x11 necessario"),
|
||||||
("Port", ""),
|
("Port", "Porta"),
|
||||||
("Settings", "Impostazioni"),
|
("Settings", "Impostazioni"),
|
||||||
("Username", " Nome utente"),
|
("Username", " Nome utente"),
|
||||||
("Invalid port", "Porta non valida"),
|
("Invalid port", "Porta non valida"),
|
||||||
@ -296,29 +296,27 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("In privacy mode", "In modalità privacy"),
|
("In privacy mode", "In modalità privacy"),
|
||||||
("Out privacy mode", "Fuori modalità privacy"),
|
("Out privacy mode", "Fuori modalità privacy"),
|
||||||
("Language", "Linguaggio"),
|
("Language", "Linguaggio"),
|
||||||
("Keep RustDesk background service", ""),
|
("Keep RustDesk background service", "Mantieni il servizio di RustDesk in background"),
|
||||||
("Ignore Battery Optimizations", ""),
|
("Ignore Battery Optimizations", "Ignora le ottimizzazioni della batteria"),
|
||||||
("android_open_battery_optimizations_tip", ""),
|
("android_open_battery_optimizations_tip", "Se si desidera disabilitare questa funzione, andare nelle impostazioni dell'applicazione RustDesk, aprire la sezione [Batteria] e deselezionare [Senza restrizioni]."),
|
||||||
("Connection not allowed", "Connessione non consentita"),
|
("Connection not allowed", "Connessione non consentita"),
|
||||||
("Legacy mode", ""),
|
("Legacy mode", "Modalità legacy"),
|
||||||
("Map mode", ""),
|
("Map mode", "Modalità mappa"),
|
||||||
("Translate mode", ""),
|
("Translate mode", "Modalità di traduzione"),
|
||||||
("Use temporary password", "Usa password temporanea"),
|
|
||||||
("Use permanent password", "Usa password permanente"),
|
("Use permanent password", "Usa password permanente"),
|
||||||
("Use both passwords", "Usa entrambe le password"),
|
("Use both passwords", "Usa entrambe le password"),
|
||||||
("Set permanent password", "Imposta password permanente"),
|
("Set permanent password", "Imposta password permanente"),
|
||||||
("Set temporary password length", "Imposta lunghezza passwod temporanea"),
|
|
||||||
("Enable Remote Restart", "Abilita riavvio da remoto"),
|
("Enable Remote Restart", "Abilita riavvio da remoto"),
|
||||||
("Allow remote restart", "Consenti riavvio da remoto"),
|
("Allow remote restart", "Consenti riavvio da remoto"),
|
||||||
("Restart Remote Device", "Riavvia dispositivo remoto"),
|
("Restart Remote Device", "Riavvia dispositivo remoto"),
|
||||||
("Are you sure you want to restart", "Sei sicuro di voler riavviare?"),
|
("Are you sure you want to restart", "Sei sicuro di voler riavviare?"),
|
||||||
("Restarting Remote Device", "Il dispositivo remoto si sta riavviando"),
|
("Restarting Remote Device", "Il dispositivo remoto si sta riavviando"),
|
||||||
("remote_restarting_tip", "Riavviare il dispositivo remoto"),
|
("remote_restarting_tip", "Riavviare il dispositivo remoto"),
|
||||||
("Copied", ""),
|
("Copied", "Copiato"),
|
||||||
("Exit Fullscreen", "Esci dalla modalità schermo intero"),
|
("Exit Fullscreen", "Esci dalla modalità schermo intero"),
|
||||||
("Fullscreen", "A schermo intero"),
|
("Fullscreen", "A schermo intero"),
|
||||||
("Mobile Actions", "Azioni mobili"),
|
("Mobile Actions", "Azioni mobili"),
|
||||||
("Select Monitor", "Seleziona Monitora"),
|
("Select Monitor", "Seleziona schermo"),
|
||||||
("Control Actions", "Azioni di controllo"),
|
("Control Actions", "Azioni di controllo"),
|
||||||
("Display Settings", "Impostazioni di visualizzazione"),
|
("Display Settings", "Impostazioni di visualizzazione"),
|
||||||
("Ratio", "Rapporto"),
|
("Ratio", "Rapporto"),
|
||||||
@ -332,62 +330,72 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Insecure Connection", "Connessione insicura"),
|
("Insecure Connection", "Connessione insicura"),
|
||||||
("Scale original", "Scala originale"),
|
("Scale original", "Scala originale"),
|
||||||
("Scale adaptive", "Scala adattiva"),
|
("Scale adaptive", "Scala adattiva"),
|
||||||
("General", ""),
|
("General", "Generale"),
|
||||||
("Security", ""),
|
("Security", "Sicurezza"),
|
||||||
("Account", ""),
|
("Account", "Account"),
|
||||||
("Theme", ""),
|
("Theme", "Tema"),
|
||||||
("Dark Theme", ""),
|
("Dark Theme", "Tema Scuro"),
|
||||||
("Dark", ""),
|
("Dark", "Scuro"),
|
||||||
("Light", ""),
|
("Light", "Chiaro"),
|
||||||
("Follow System", ""),
|
("Follow System", "Segui il sistema"),
|
||||||
("Enable hardware codec", ""),
|
("Enable hardware codec", "Abilita codec hardware"),
|
||||||
("Unlock Security Settings", ""),
|
("Unlock Security Settings", "Sblocca impostazioni di sicurezza"),
|
||||||
("Enable Audio", ""),
|
("Enable Audio", "Abilita audio"),
|
||||||
("Temporary Password Length", ""),
|
("Unlock Network Settings", "Sblocca impostazioni di rete"),
|
||||||
("Unlock Network Settings", ""),
|
|
||||||
("Server", ""),
|
("Server", ""),
|
||||||
("Direct IP Access", ""),
|
("Direct IP Access", "Accesso IP diretto"),
|
||||||
("Proxy", ""),
|
("Proxy", ""),
|
||||||
("Port", ""),
|
("Port", "Porta"),
|
||||||
("Apply", ""),
|
("Apply", "Applica"),
|
||||||
("Disconnect all devices?", ""),
|
("Disconnect all devices?", "Disconnettere tutti i dispositivi?"),
|
||||||
("Clear", ""),
|
("Clear", "Ripulisci"),
|
||||||
("Audio Input Device", ""),
|
("Audio Input Device", "Dispositivo di input audio"),
|
||||||
("Deny remote access", ""),
|
("Deny remote access", "Nega accesso remoto"),
|
||||||
("Use IP Whitelisting", ""),
|
("Use IP Whitelisting", "Utilizza la whitelist di IP"),
|
||||||
("Network", ""),
|
("Network", "Rete"),
|
||||||
("Enable RDP", ""),
|
("Enable RDP", "Abilita RDP"),
|
||||||
("Pin menubar", "Blocca la barra dei menu"),
|
("Pin menubar", "Blocca la barra dei menu"),
|
||||||
("Unpin menubar", "Sblocca la barra dei menu"),
|
("Unpin menubar", "Sblocca la barra dei menu"),
|
||||||
("Recording", ""),
|
("Recording", "Registrazione"),
|
||||||
("Directory", ""),
|
("Directory", "Cartella"),
|
||||||
("Automatically record incoming sessions", ""),
|
("Automatically record incoming sessions", "Registra automaticamente le sessioni in entrata"),
|
||||||
("Change", ""),
|
("Change", "Cambia"),
|
||||||
("Start session recording", ""),
|
("Start session recording", "Inizia registrazione della sessione"),
|
||||||
("Stop session recording", ""),
|
("Stop session recording", "Ferma registrazione della sessione"),
|
||||||
("Enable Recording Session", ""),
|
("Enable Recording Session", "Abilita registrazione della sessione"),
|
||||||
("Allow recording session", ""),
|
("Allow recording session", "Permetti di registrare la sessione"),
|
||||||
("Enable LAN Discovery", ""),
|
("Enable LAN Discovery", "Abilita il rilevamento della LAN"),
|
||||||
("Deny LAN Discovery", ""),
|
("Deny LAN Discovery", "Nega il rilevamento della LAN"),
|
||||||
("Write a message", ""),
|
("Write a message", "Scrivi un messaggio"),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", "Attendi la conferma dell'UAC..."),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", "La finestra corrente del desktop remoto richiede privilegi più elevati per funzionare, quindi non è in grado di utilizzare temporaneamente il mouse e la tastiera. È possibile chiedere all'utente remoto di ridurre a icona la finestra corrente o di fare clic sul pulsante di elevazione nella finestra di gestione della connessione. Per evitare questo problema, si consiglia di installare il software sul dispositivo remoto."),
|
||||||
("elevated_foreground_window_warning", ""),
|
("Disconnected", "Disconnesso"),
|
||||||
("Disconnected", ""),
|
("Other", "Altro"),
|
||||||
("Other", ""),
|
("Confirm before closing multiple tabs", "Conferma prima di chiudere più schede"),
|
||||||
("Confirm before closing multiple tabs", ""),
|
("Keyboard Settings", "Impostazioni tastiera"),
|
||||||
("Keyboard Settings", ""),
|
("Custom", "Personalizzato"),
|
||||||
("Custom", ""),
|
("Full Access", "Accesso completo"),
|
||||||
("Full Access", ""),
|
("Screen Share", "Condivisione dello schermo"),
|
||||||
("Screen Share", ""),
|
("Wayland requires Ubuntu 21.04 or higher version.", "Wayland richiede Ubuntu 21.04 o successiva."),
|
||||||
("Wayland requires Ubuntu 21.04 or higher version.", "Wayland richiede Ubuntu 21.04 o versione successiva."),
|
|
||||||
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland richiede una versione superiore della distribuzione Linux. Prova X11 desktop o cambia il tuo sistema operativo."),
|
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland richiede una versione superiore della distribuzione Linux. Prova X11 desktop o cambia il tuo sistema operativo."),
|
||||||
("JumpLink", "View"),
|
("JumpLink", "View"),
|
||||||
("Please Select the screen to be shared(Operate on the peer side).", "Seleziona lo schermo da condividere (opera sul lato peer)."),
|
("Please Select the screen to be shared(Operate on the peer side).", "Seleziona lo schermo da condividere (opera sul lato peer)."),
|
||||||
("Show RustDesk", ""),
|
("Show RustDesk", "Mostra RustDesk"),
|
||||||
("This PC", ""),
|
("This PC", "Questo PC"),
|
||||||
("or", ""),
|
("or", "O"),
|
||||||
("Continue with", ""),
|
("Continue with", "Continua con"),
|
||||||
|
("Elevate", "Eleva"),
|
||||||
|
("Zoom cursor", "Cursore zoom"),
|
||||||
|
("Accept sessions via password", "Accetta sessioni via password"),
|
||||||
|
("Accept sessions via click", "Accetta sessioni via click"),
|
||||||
|
("Accept sessions via both", "Accetta sessioni con entrambi"),
|
||||||
|
("Please wait for the remote side to accept your session request...", "Attendere che il lato remoto accetti la richiesta di sessione..."),
|
||||||
|
("One-time Password", "Password monouso"),
|
||||||
|
("Use one-time password", "Usa password monouso"),
|
||||||
|
("One-time password length", "Lunghezza password monouso"),
|
||||||
|
("Request access to your device", "Richiedi l'accesso al tuo dispositivo"),
|
||||||
|
("Hide connection management window", ""),
|
||||||
|
("hide_cm_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", ""),
|
("Legacy mode", ""),
|
||||||
("Map mode", ""),
|
("Map mode", ""),
|
||||||
("Translate mode", ""),
|
("Translate mode", ""),
|
||||||
("Use temporary password", "使い捨てのパスワードを使用"),
|
|
||||||
("Use permanent password", "固定のパスワードを使用"),
|
("Use permanent password", "固定のパスワードを使用"),
|
||||||
("Use both passwords", "どちらのパスワードも使用"),
|
("Use both passwords", "どちらのパスワードも使用"),
|
||||||
("Set permanent password", "固定のパスワードを設定"),
|
("Set permanent password", "固定のパスワードを設定"),
|
||||||
("Set temporary password length", "使い捨てのパスワードの長さを設定"),
|
|
||||||
("Enable Remote Restart", "リモートからの再起動を有効化"),
|
("Enable Remote Restart", "リモートからの再起動を有効化"),
|
||||||
("Allow remote restart", "リモートからの再起動を許可"),
|
("Allow remote restart", "リモートからの再起動を許可"),
|
||||||
("Restart Remote Device", "リモートの端末を再起動"),
|
("Restart Remote Device", "リモートの端末を再起動"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", ""),
|
("Enable hardware codec", ""),
|
||||||
("Unlock Security Settings", ""),
|
("Unlock Security Settings", ""),
|
||||||
("Enable Audio", ""),
|
("Enable Audio", ""),
|
||||||
("Temporary Password Length", ""),
|
|
||||||
("Unlock Network Settings", ""),
|
("Unlock Network Settings", ""),
|
||||||
("Server", ""),
|
("Server", ""),
|
||||||
("Direct IP Access", ""),
|
("Direct IP Access", ""),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", ""),
|
("Deny LAN Discovery", ""),
|
||||||
("Write a message", ""),
|
("Write a message", ""),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
|
||||||
("Disconnected", ""),
|
("Disconnected", ""),
|
||||||
("Other", "他の"),
|
("Other", "他の"),
|
||||||
("Confirm before closing multiple tabs", "同時に複数のタブを閉じる前に確認する"),
|
("Confirm before closing multiple tabs", "同時に複数のタブを閉じる前に確認する"),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
("Continue with", ""),
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", ""),
|
("Legacy mode", ""),
|
||||||
("Map mode", ""),
|
("Map mode", ""),
|
||||||
("Translate mode", ""),
|
("Translate mode", ""),
|
||||||
("Use temporary password", "임시 비밀번호 사용"),
|
|
||||||
("Use permanent password", "영구 비밀번호 사용"),
|
("Use permanent password", "영구 비밀번호 사용"),
|
||||||
("Use both passwords", "두 비밀번호 (임시/영구) 사용"),
|
("Use both passwords", "두 비밀번호 (임시/영구) 사용"),
|
||||||
("Set permanent password", "영구 비밀번호 설정"),
|
("Set permanent password", "영구 비밀번호 설정"),
|
||||||
("Set temporary password length", "임시 비밀번호 길이 설정"),
|
|
||||||
("Enable Remote Restart", "원격지 재시작 활성화"),
|
("Enable Remote Restart", "원격지 재시작 활성화"),
|
||||||
("Allow remote restart", "원격지 재시작 허용"),
|
("Allow remote restart", "원격지 재시작 허용"),
|
||||||
("Restart Remote Device", "원격 기기 재시작"),
|
("Restart Remote Device", "원격 기기 재시작"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", ""),
|
("Enable hardware codec", ""),
|
||||||
("Unlock Security Settings", ""),
|
("Unlock Security Settings", ""),
|
||||||
("Enable Audio", ""),
|
("Enable Audio", ""),
|
||||||
("Temporary Password Length", ""),
|
|
||||||
("Unlock Network Settings", ""),
|
("Unlock Network Settings", ""),
|
||||||
("Server", ""),
|
("Server", ""),
|
||||||
("Direct IP Access", ""),
|
("Direct IP Access", ""),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", ""),
|
("Deny LAN Discovery", ""),
|
||||||
("Write a message", ""),
|
("Write a message", ""),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
|
||||||
("Disconnected", ""),
|
("Disconnected", ""),
|
||||||
("Other", ""),
|
("Other", ""),
|
||||||
("Confirm before closing multiple tabs", ""),
|
("Confirm before closing multiple tabs", ""),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
("Continue with", ""),
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", ""),
|
("Legacy mode", ""),
|
||||||
("Map mode", ""),
|
("Map mode", ""),
|
||||||
("Translate mode", ""),
|
("Translate mode", ""),
|
||||||
("Use temporary password", "Уақытша құпия сөзді қолдану"),
|
|
||||||
("Use permanent password", "Тұрақты құпия сөзді қолдану"),
|
("Use permanent password", "Тұрақты құпия сөзді қолдану"),
|
||||||
("Use both passwords", "Қос құпия сөзді қолдану"),
|
("Use both passwords", "Қос құпия сөзді қолдану"),
|
||||||
("Set permanent password", "Тұрақты құпия сөзді орнату"),
|
("Set permanent password", "Тұрақты құпия сөзді орнату"),
|
||||||
("Set temporary password length", "Уақытша құпия сөздің ұзындығын орнату"),
|
|
||||||
("Enable Remote Restart", "Қашықтан қайта-қосуды іске қосу"),
|
("Enable Remote Restart", "Қашықтан қайта-қосуды іске қосу"),
|
||||||
("Allow remote restart", "Қашықтан қайта-қосуды рұқсат ету"),
|
("Allow remote restart", "Қашықтан қайта-қосуды рұқсат ету"),
|
||||||
("Restart Remote Device", "Қашықтағы құрылғыны қайта-қосу"),
|
("Restart Remote Device", "Қашықтағы құрылғыны қайта-қосу"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", ""),
|
("Enable hardware codec", ""),
|
||||||
("Unlock Security Settings", ""),
|
("Unlock Security Settings", ""),
|
||||||
("Enable Audio", ""),
|
("Enable Audio", ""),
|
||||||
("Temporary Password Length", ""),
|
|
||||||
("Unlock Network Settings", ""),
|
("Unlock Network Settings", ""),
|
||||||
("Server", ""),
|
("Server", ""),
|
||||||
("Direct IP Access", ""),
|
("Direct IP Access", ""),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", ""),
|
("Deny LAN Discovery", ""),
|
||||||
("Write a message", ""),
|
("Write a message", ""),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
|
||||||
("Disconnected", ""),
|
("Disconnected", ""),
|
||||||
("Other", ""),
|
("Other", ""),
|
||||||
("Confirm before closing multiple tabs", ""),
|
("Confirm before closing multiple tabs", ""),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
("Continue with", ""),
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Password", "Hasło"),
|
("Password", "Hasło"),
|
||||||
("Ready", "Gotowe"),
|
("Ready", "Gotowe"),
|
||||||
("Established", "Nawiązano"),
|
("Established", "Nawiązano"),
|
||||||
("connecting_status", "Status połączenia"),
|
("connecting_status", "Łączenie"),
|
||||||
("Enable Service", "Włącz usługę"),
|
("Enable Service", "Włącz usługę"),
|
||||||
("Start Service", "Uruchom usługę"),
|
("Start Service", "Uruchom usługę"),
|
||||||
("Service is running", "Usługa uruchomiona"),
|
("Service is running", "Usługa uruchomiona"),
|
||||||
@ -30,9 +30,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("IP Whitelisting", "Biała lista IP"),
|
("IP Whitelisting", "Biała lista IP"),
|
||||||
("ID/Relay Server", "Serwer ID/Pośredniczący"),
|
("ID/Relay Server", "Serwer ID/Pośredniczący"),
|
||||||
("Import Server Config", "Importuj konfigurację serwera"),
|
("Import Server Config", "Importuj konfigurację serwera"),
|
||||||
("Export Server Config", ""),
|
("Export Server Config", "Eksportuj konfigurację serwera"),
|
||||||
("Import server configuration successfully", "Importowanie konfiguracji serwera powiodło się"),
|
("Import server configuration successfully", "Import konfiguracji serwera zakończono pomyślnie"),
|
||||||
("Export server configuration successfully", ""),
|
("Export server configuration successfully", "Eksport konfiguracji serwera zakończono pomyślnie"),
|
||||||
("Invalid server configuration", "Nieprawidłowa konfiguracja serwera"),
|
("Invalid server configuration", "Nieprawidłowa konfiguracja serwera"),
|
||||||
("Clipboard is empty", "Schowek jest pusty"),
|
("Clipboard is empty", "Schowek jest pusty"),
|
||||||
("Stop service", "Zatrzymaj usługę"),
|
("Stop service", "Zatrzymaj usługę"),
|
||||||
@ -47,7 +47,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("ID Server", "Serwer ID"),
|
("ID Server", "Serwer ID"),
|
||||||
("Relay Server", "Serwer pośredniczący"),
|
("Relay Server", "Serwer pośredniczący"),
|
||||||
("API Server", "Serwer API"),
|
("API Server", "Serwer API"),
|
||||||
("invalid_http", "Nieprawidłowy żądanie http"),
|
("invalid_http", "Nieprawidłowe żądanie http"),
|
||||||
("Invalid IP", "Nieprawidłowe IP"),
|
("Invalid IP", "Nieprawidłowe IP"),
|
||||||
("id_change_tip", "Nowy ID może być złożony z małych i dużych liter a-zA-z, cyfry 0-9 oraz _ (podkreślenie). Pierwszym znakiem powinna być litera a-zA-Z, a całe ID powinno składać się z 6 do 16 znaków."),
|
("id_change_tip", "Nowy ID może być złożony z małych i dużych liter a-zA-z, cyfry 0-9 oraz _ (podkreślenie). Pierwszym znakiem powinna być litera a-zA-Z, a całe ID powinno składać się z 6 do 16 znaków."),
|
||||||
("Invalid format", "Nieprawidłowy format"),
|
("Invalid format", "Nieprawidłowy format"),
|
||||||
@ -72,7 +72,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please try 1 minute later", "Spróbuj za minutę"),
|
("Please try 1 minute later", "Spróbuj za minutę"),
|
||||||
("Login Error", "Błąd logowania"),
|
("Login Error", "Błąd logowania"),
|
||||||
("Successful", "Sukces"),
|
("Successful", "Sukces"),
|
||||||
("Connected, waiting for image...", "Połączono, czekam na obraz..."),
|
("Connected, waiting for image...", "Połączono, oczekiwanie na obraz..."),
|
||||||
("Name", "Nazwa"),
|
("Name", "Nazwa"),
|
||||||
("Type", "Typ"),
|
("Type", "Typ"),
|
||||||
("Modified", "Zmodyfikowany"),
|
("Modified", "Zmodyfikowany"),
|
||||||
@ -95,8 +95,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Not an empty directory", "Katalog nie jest pusty"),
|
("Not an empty directory", "Katalog nie jest pusty"),
|
||||||
("Are you sure you want to delete this file?", "Czy na pewno chcesz usunąć ten plik?"),
|
("Are you sure you want to delete this file?", "Czy na pewno chcesz usunąć ten plik?"),
|
||||||
("Are you sure you want to delete this empty directory?", "Czy na pewno chcesz usunać ten pusty katalog?"),
|
("Are you sure you want to delete this empty directory?", "Czy na pewno chcesz usunać ten pusty katalog?"),
|
||||||
("Are you sure you want to delete the file of this directory?", "Czy na pewno chcesz usunąć pliki z tego katalog?"),
|
("Are you sure you want to delete the file of this directory?", "Czy na pewno chcesz usunąć pliki z tego katalogu?"),
|
||||||
("Do this for all conflicts", "Zrób to dla wszystkich konfliktów"),
|
("Do this for all conflicts", "wykonaj dla wszystkich konfliktów"),
|
||||||
("This is irreversible!", "To jest nieodwracalne!"),
|
("This is irreversible!", "To jest nieodwracalne!"),
|
||||||
("Deleting", "Usuwanie"),
|
("Deleting", "Usuwanie"),
|
||||||
("files", "pliki"),
|
("files", "pliki"),
|
||||||
@ -121,15 +121,15 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Show quality monitor", "Pokazuj jakość monitora"),
|
("Show quality monitor", "Pokazuj jakość monitora"),
|
||||||
("Disable clipboard", "Wyłącz schowek"),
|
("Disable clipboard", "Wyłącz schowek"),
|
||||||
("Lock after session end", "Zablokuj po zakończeniu sesji"),
|
("Lock after session end", "Zablokuj po zakończeniu sesji"),
|
||||||
("Insert", "Wstaw"),
|
("Insert", "Wyślij"),
|
||||||
("Insert Lock", "Wstaw blokadę"),
|
("Insert Lock", "Wyślij Zablokuj"),
|
||||||
("Refresh", "Odśwież"),
|
("Refresh", "Odśwież"),
|
||||||
("ID does not exist", "ID nie istnieje"),
|
("ID does not exist", "ID nie istnieje"),
|
||||||
("Failed to connect to rendezvous server", "Nie udało się połączyć z serwerem połączeń"),
|
("Failed to connect to rendezvous server", "Nie udało się połączyć z serwerem połączeń"),
|
||||||
("Please try later", "Spróbuj później"),
|
("Please try later", "Spróbuj później"),
|
||||||
("Remote desktop is offline", "Zdalny pulpit jest offline"),
|
("Remote desktop is offline", "Zdalny pulpit jest offline"),
|
||||||
("Key mismatch", "Niezgodność klucza"),
|
("Key mismatch", "Niezgodność klucza"),
|
||||||
("Timeout", "Przekroczenie czasu"),
|
("Timeout", "Przekroczono czas oczekiwania"),
|
||||||
("Failed to connect to relay server", "Nie udało się połączyć z serwerem pośredniczącym"),
|
("Failed to connect to relay server", "Nie udało się połączyć z serwerem pośredniczącym"),
|
||||||
("Failed to connect via rendezvous server", "Nie udało się połączyć przez serwer połączeń"),
|
("Failed to connect via rendezvous server", "Nie udało się połączyć przez serwer połączeń"),
|
||||||
("Failed to connect via relay server", "Nie udało się połączyć przez serwer pośredniczący"),
|
("Failed to connect via relay server", "Nie udało się połączyć przez serwer pośredniczący"),
|
||||||
@ -195,7 +195,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Warning", "Ostrzeżenie"),
|
("Warning", "Ostrzeżenie"),
|
||||||
("Login screen using Wayland is not supported", "Ekran logowania korzystający z Wayland nie jest obsługiwany"),
|
("Login screen using Wayland is not supported", "Ekran logowania korzystający z Wayland nie jest obsługiwany"),
|
||||||
("Reboot required", "Wymagany ponowne uruchomienie"),
|
("Reboot required", "Wymagany ponowne uruchomienie"),
|
||||||
("Unsupported display server ", "Nieobsługiwany serwer wyświetlania "),
|
("Unsupported display server ", "Nieobsługiwany serwer wyświetlania"),
|
||||||
("x11 expected", "Wymagany jest X11"),
|
("x11 expected", "Wymagany jest X11"),
|
||||||
("Port", "Port"),
|
("Port", "Port"),
|
||||||
("Settings", "Ustawienia"),
|
("Settings", "Ustawienia"),
|
||||||
@ -206,19 +206,19 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Run without install", "Uruchom bez instalacji"),
|
("Run without install", "Uruchom bez instalacji"),
|
||||||
("Always connected via relay", "Zawsze połączony pośrednio"),
|
("Always connected via relay", "Zawsze połączony pośrednio"),
|
||||||
("Always connect via relay", "Zawsze łącz pośrednio"),
|
("Always connect via relay", "Zawsze łącz pośrednio"),
|
||||||
("whitelist_tip", "Podpowiedź do białej listy"),
|
("whitelist_tip", "Zezwlaj na łączenie z tym komputerem tylko z adresów IP znajdujących się na białej liście"),
|
||||||
("Login", "Zaloguj"),
|
("Login", "Zaloguj"),
|
||||||
("Logout", "Wyloguj"),
|
("Logout", "Wyloguj"),
|
||||||
("Tags", "Tagi"),
|
("Tags", "Tagi"),
|
||||||
("Search ID", "Szukaj ID"),
|
("Search ID", "Szukaj ID"),
|
||||||
("Current Wayland display server is not supported", "Obecny serwer wyświetlania Wayland nie jest obsługiwany"),
|
("Current Wayland display server is not supported", "Obecny serwer wyświetlania Wayland nie jest obsługiwany"),
|
||||||
("whitelist_sep", "Seperator białej listy"),
|
("whitelist_sep", "Oddzielone przecinkiem, średnikiem, spacją lub w nowej linii"),
|
||||||
("Add ID", "Dodaj ID"),
|
("Add ID", "Dodaj ID"),
|
||||||
("Add Tag", "Dodaj Tag"),
|
("Add Tag", "Dodaj Tag"),
|
||||||
("Unselect all tags", "Odznacz wszystkie tagi"),
|
("Unselect all tags", "Odznacz wszystkie tagi"),
|
||||||
("Network error", "Błąd sieci"),
|
("Network error", "Błąd sieci"),
|
||||||
("Username missed", "Brak użytkownika"),
|
("Username missed", "Nieprawidłowe nazwa użytkownika"),
|
||||||
("Password missed", "Brak hasła"),
|
("Password missed", "Nieprawidłowe hasło"),
|
||||||
("Wrong credentials", "Błędne dane uwierzytelniające"),
|
("Wrong credentials", "Błędne dane uwierzytelniające"),
|
||||||
("Edit Tag", "Edytuj tag"),
|
("Edit Tag", "Edytuj tag"),
|
||||||
("Unremember Password", "Zapomnij hasło"),
|
("Unremember Password", "Zapomnij hasło"),
|
||||||
@ -226,7 +226,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Add to Favorites", "Dodaj do ulubionych"),
|
("Add to Favorites", "Dodaj do ulubionych"),
|
||||||
("Remove from Favorites", "Usuń z ulubionych"),
|
("Remove from Favorites", "Usuń z ulubionych"),
|
||||||
("Empty", "Pusty"),
|
("Empty", "Pusty"),
|
||||||
("Invalid folder name", "Błędna nazwa folderu"),
|
("Invalid folder name", "Nieprawidłowa nazwa folderu"),
|
||||||
("Socks5 Proxy", "Socks5 Proxy"),
|
("Socks5 Proxy", "Socks5 Proxy"),
|
||||||
("Hostname", "Nazwa hosta"),
|
("Hostname", "Nazwa hosta"),
|
||||||
("Discovered", "Wykryte"),
|
("Discovered", "Wykryte"),
|
||||||
@ -242,12 +242,12 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Left Mouse", "Lewy klik myszy"),
|
("Left Mouse", "Lewy klik myszy"),
|
||||||
("One-Long Tap", "Przytrzymaj jednym palcem"),
|
("One-Long Tap", "Przytrzymaj jednym palcem"),
|
||||||
("Two-Finger Tap", "Dotknij dwoma palcami"),
|
("Two-Finger Tap", "Dotknij dwoma palcami"),
|
||||||
("Right Mouse", "Prawy klik myszy"),
|
("Right Mouse", "Prawy przycisk myszy"),
|
||||||
("One-Finger Move", "Ruch jednym palcem"),
|
("One-Finger Move", "Przesuń jednym palcem"),
|
||||||
("Double Tap & Move", "Dotknij dwukrotnie i przesuń"),
|
("Double Tap & Move", "Dotknij dwukrotnie i przesuń"),
|
||||||
("Mouse Drag", "Przeciągnij myszą"),
|
("Mouse Drag", "Przeciągnij myszą"),
|
||||||
("Three-Finger vertically", "Trzy palce wertykalnie"),
|
("Three-Finger vertically", "Trzy palce pionowo"),
|
||||||
("Mouse Wheel", "Skrol myszy"),
|
("Mouse Wheel", "Kółko myszy"),
|
||||||
("Two-Finger Move", "Ruch dwoma palcami"),
|
("Two-Finger Move", "Ruch dwoma palcami"),
|
||||||
("Canvas Move", "Ruch ekranu"),
|
("Canvas Move", "Ruch ekranu"),
|
||||||
("Pinch to Zoom", "Uszczypnij, aby powiększyć"),
|
("Pinch to Zoom", "Uszczypnij, aby powiększyć"),
|
||||||
@ -289,7 +289,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Someone turns on privacy mode, exit", "Ktoś włącza tryb prywatności, wyjdź"),
|
("Someone turns on privacy mode, exit", "Ktoś włącza tryb prywatności, wyjdź"),
|
||||||
("Unsupported", "Niewspierane"),
|
("Unsupported", "Niewspierane"),
|
||||||
("Peer denied", "Odmowa dostępu"),
|
("Peer denied", "Odmowa dostępu"),
|
||||||
("Please install plugins", "Zainstaluj plugin"),
|
("Please install plugins", "Zainstaluj wtyczkę"),
|
||||||
("Peer exit", "Wyjście peer"),
|
("Peer exit", "Wyjście peer"),
|
||||||
("Failed to turn off", "Nie udało się wyłączyć"),
|
("Failed to turn off", "Nie udało się wyłączyć"),
|
||||||
("Turned off", "Wyłączony"),
|
("Turned off", "Wyłączony"),
|
||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", "Tryb kompatybilności wstecznej (legacy)"),
|
("Legacy mode", "Tryb kompatybilności wstecznej (legacy)"),
|
||||||
("Map mode", "Tryb mapowania"),
|
("Map mode", "Tryb mapowania"),
|
||||||
("Translate mode", "Tryb translacji"),
|
("Translate mode", "Tryb translacji"),
|
||||||
("Use temporary password", "Użyj tymczasowego hasła"),
|
|
||||||
("Use permanent password", "Użyj hasła permanentnego"),
|
("Use permanent password", "Użyj hasła permanentnego"),
|
||||||
("Use both passwords", "Użyj obu haseł"),
|
("Use both passwords", "Użyj obu haseł"),
|
||||||
("Set permanent password", "Ustaw hasło permanentne"),
|
("Set permanent password", "Ustaw hasło permanentne"),
|
||||||
("Set temporary password length", "Ustaw długość hasła tymczasowego"),
|
|
||||||
("Enable Remote Restart", "Włącz Zdalne Restartowanie"),
|
("Enable Remote Restart", "Włącz Zdalne Restartowanie"),
|
||||||
("Allow remote restart", "Zezwól na zdalne restartowanie"),
|
("Allow remote restart", "Zezwól na zdalne restartowanie"),
|
||||||
("Restart Remote Device", "Zrestartuj Zdalne Urządzenie"),
|
("Restart Remote Device", "Zrestartuj Zdalne Urządzenie"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", "Włącz wsparcie sprzętowe dla kodeków"),
|
("Enable hardware codec", "Włącz wsparcie sprzętowe dla kodeków"),
|
||||||
("Unlock Security Settings", "Odblokuj Ustawienia Zabezpieczeń"),
|
("Unlock Security Settings", "Odblokuj Ustawienia Zabezpieczeń"),
|
||||||
("Enable Audio", "Włącz Dźwięk"),
|
("Enable Audio", "Włącz Dźwięk"),
|
||||||
("Temporary Password Length", "Długość hasła tymaczowego"),
|
|
||||||
("Unlock Network Settings", "Odblokuj ustawienia Sieciowe"),
|
("Unlock Network Settings", "Odblokuj ustawienia Sieciowe"),
|
||||||
("Server", "Serwer"),
|
("Server", "Serwer"),
|
||||||
("Direct IP Access", "Bezpośredni Adres IP"),
|
("Direct IP Access", "Bezpośredni Adres IP"),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", "Zablokuj Wykrywanie LAN"),
|
("Deny LAN Discovery", "Zablokuj Wykrywanie LAN"),
|
||||||
("Write a message", "Napisz wiadomość"),
|
("Write a message", "Napisz wiadomość"),
|
||||||
("Prompt", "Monit"),
|
("Prompt", "Monit"),
|
||||||
("elevation_prompt", "Monit o podwyższeniu uprawnień"),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", "Ostrzeżenie UAC"),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", "Pierwszoplanowe okno ostrzeżenia o podwyższeniu uprawnień"),
|
|
||||||
("Disconnected", "Rozłączone"),
|
("Disconnected", "Rozłączone"),
|
||||||
("Other", "Inne"),
|
("Other", "Inne"),
|
||||||
("Confirm before closing multiple tabs", "Potwierdź przed zamknięciem wielu kart"),
|
("Confirm before closing multiple tabs", "Potwierdź przed zamknięciem wielu kart"),
|
||||||
@ -385,9 +381,21 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland wymaga wyższej wersji dystrybucji Linuksa. Wypróbuj pulpit X11 lub zmień system operacyjny."),
|
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland wymaga wyższej wersji dystrybucji Linuksa. Wypróbuj pulpit X11 lub zmień system operacyjny."),
|
||||||
("JumpLink", "View"),
|
("JumpLink", "View"),
|
||||||
("Please Select the screen to be shared(Operate on the peer side).", "Wybierz ekran do udostępnienia (działaj po stronie równorzędnej)."),
|
("Please Select the screen to be shared(Operate on the peer side).", "Wybierz ekran do udostępnienia (działaj po stronie równorzędnej)."),
|
||||||
("Show RustDesk", ""),
|
("Show RustDesk", "Pokaż RustDesk"),
|
||||||
("This PC", ""),
|
("This PC", "Ten komputer"),
|
||||||
("or", ""),
|
("or", "albo"),
|
||||||
("Continue with", ""),
|
("Continue with", "Kontynuuj z"),
|
||||||
|
("Elevate", "Podwyższ"),
|
||||||
|
("Zoom cursor", "Zoom kursora"),
|
||||||
|
("Accept sessions via password", "Akceptuj sesje używając hasła"),
|
||||||
|
("Accept sessions via click", "Akceptuj sesję klikając"),
|
||||||
|
("Accept sessions via both", "Akceptuj sesjęna dwa sposoby"),
|
||||||
|
("Please wait for the remote side to accept your session request...", "Proszę czekać aż zdalny host zaakceptuje Twoją prośbę..."),
|
||||||
|
("One-time Password", "Hasło jednorazowe"),
|
||||||
|
("Use one-time password", "Użyj hasła jednorazowego"),
|
||||||
|
("One-time password length", "Długość hasła jednorazowego"),
|
||||||
|
("Request access to your device", "Żądanie dostępu do Twojego urządzenia"),
|
||||||
|
("Hide connection management window", ""),
|
||||||
|
("hide_cm_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,7 +30,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("IP Whitelisting", "Whitelist de IP"),
|
("IP Whitelisting", "Whitelist de IP"),
|
||||||
("ID/Relay Server", "Servidor ID/Relay"),
|
("ID/Relay Server", "Servidor ID/Relay"),
|
||||||
("Import Server Config", "Importar Configuração do Servidor"),
|
("Import Server Config", "Importar Configuração do Servidor"),
|
||||||
("Export Server Config", ""),
|
("Export Server Config", "Exportar Configuração do Servidor"),
|
||||||
("Import server configuration successfully", "Configuração do servidor importada com sucesso"),
|
("Import server configuration successfully", "Configuração do servidor importada com sucesso"),
|
||||||
("Export server configuration successfully", ""),
|
("Export server configuration successfully", ""),
|
||||||
("Invalid server configuration", "Configuração do servidor inválida"),
|
("Invalid server configuration", "Configuração do servidor inválida"),
|
||||||
@ -39,7 +39,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Change ID", "Alterar ID"),
|
("Change ID", "Alterar ID"),
|
||||||
("Website", "Website"),
|
("Website", "Website"),
|
||||||
("About", "Sobre"),
|
("About", "Sobre"),
|
||||||
("Mute", "Emudecer"),
|
("Mute", "Silenciar"),
|
||||||
("Audio Input", "Entrada de Áudio"),
|
("Audio Input", "Entrada de Áudio"),
|
||||||
("Enhancements", "Melhorias"),
|
("Enhancements", "Melhorias"),
|
||||||
("Hardware Codec", ""),
|
("Hardware Codec", ""),
|
||||||
@ -89,8 +89,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Delete", "Apagar"),
|
("Delete", "Apagar"),
|
||||||
("Properties", "Propriedades"),
|
("Properties", "Propriedades"),
|
||||||
("Multi Select", "Selecção Múltipla"),
|
("Multi Select", "Selecção Múltipla"),
|
||||||
("Select All", ""),
|
("Select All", "Selecionar tudo"),
|
||||||
("Unselect All", ""),
|
("Unselect All", "Desmarcar todos"),
|
||||||
("Empty Directory", "Directório Vazio"),
|
("Empty Directory", "Directório Vazio"),
|
||||||
("Not an empty directory", "Directório não está vazio"),
|
("Not an empty directory", "Directório não está vazio"),
|
||||||
("Are you sure you want to delete this file?", "Tem certeza que deseja apagar este ficheiro?"),
|
("Are you sure you want to delete this file?", "Tem certeza que deseja apagar este ficheiro?"),
|
||||||
@ -116,7 +116,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Good image quality", "Qualidade visual boa"),
|
("Good image quality", "Qualidade visual boa"),
|
||||||
("Balanced", "Equilibrada"),
|
("Balanced", "Equilibrada"),
|
||||||
("Optimize reaction time", "Optimizar tempo de reacção"),
|
("Optimize reaction time", "Optimizar tempo de reacção"),
|
||||||
("Custom", ""),
|
("Custom", "Personalizado"),
|
||||||
("Show remote cursor", "Mostrar cursor remoto"),
|
("Show remote cursor", "Mostrar cursor remoto"),
|
||||||
("Show quality monitor", ""),
|
("Show quality monitor", ""),
|
||||||
("Disable clipboard", "Desabilitar área de transferência"),
|
("Disable clipboard", "Desabilitar área de transferência"),
|
||||||
@ -137,7 +137,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Set Password", "Definir palavra-chave"),
|
("Set Password", "Definir palavra-chave"),
|
||||||
("OS Password", "Senha do SO"),
|
("OS Password", "Senha do SO"),
|
||||||
("install_tip", "Devido ao UAC, o RustDesk não funciona correctamente em alguns casos. Para evitar o UAC, por favor clique no botão abaixo para instalar o RustDesk no sistema."),
|
("install_tip", "Devido ao UAC, o RustDesk não funciona correctamente em alguns casos. Para evitar o UAC, por favor clique no botão abaixo para instalar o RustDesk no sistema."),
|
||||||
("Click to upgrade", ""),
|
("Click to upgrade", "Clique para atualizar"),
|
||||||
("Click to download", "Clique para carregar"),
|
("Click to download", "Clique para carregar"),
|
||||||
("Click to update", "Clique para fazer a actualização"),
|
("Click to update", "Clique para fazer a actualização"),
|
||||||
("Configure", "Configurar"),
|
("Configure", "Configurar"),
|
||||||
@ -161,8 +161,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Action", "Acção"),
|
("Action", "Acção"),
|
||||||
("Add", "Adicionar"),
|
("Add", "Adicionar"),
|
||||||
("Local Port", "Porta Local"),
|
("Local Port", "Porta Local"),
|
||||||
("Local Address", ""),
|
("Local Address", "Endereço local"),
|
||||||
("Change Local Port", ""),
|
("Change Local Port", "Alterar porta local"),
|
||||||
("setup_server_tip", "Para uma ligação mais rápida, por favor configure seu próprio servidor"),
|
("setup_server_tip", "Para uma ligação mais rápida, por favor configure seu próprio servidor"),
|
||||||
("Too short, at least 6 characters.", "Muito curto, pelo menos 6 caracteres."),
|
("Too short, at least 6 characters.", "Muito curto, pelo menos 6 caracteres."),
|
||||||
("The confirmation is not identical.", "A confirmação não é idêntica."),
|
("The confirmation is not identical.", "A confirmação não é idêntica."),
|
||||||
@ -197,7 +197,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Reboot required", "Reinicialização necessária"),
|
("Reboot required", "Reinicialização necessária"),
|
||||||
("Unsupported display server ", "Servidor de display não suportado"),
|
("Unsupported display server ", "Servidor de display não suportado"),
|
||||||
("x11 expected", "x11 em falha"),
|
("x11 expected", "x11 em falha"),
|
||||||
("Port", ""),
|
("Port", "Porta"),
|
||||||
("Settings", "Configurações"),
|
("Settings", "Configurações"),
|
||||||
("Username", "Nome de utilizador"),
|
("Username", "Nome de utilizador"),
|
||||||
("Invalid port", "Porta inválida"),
|
("Invalid port", "Porta inválida"),
|
||||||
@ -250,13 +250,13 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Mouse Wheel", "Roda do rato"),
|
("Mouse Wheel", "Roda do rato"),
|
||||||
("Two-Finger Move", "Mover com dois dedos"),
|
("Two-Finger Move", "Mover com dois dedos"),
|
||||||
("Canvas Move", "Mover Tela"),
|
("Canvas Move", "Mover Tela"),
|
||||||
("Pinch to Zoom", "Beliscar para Zoom"),
|
("Pinch to Zoom", "Clique para ampliar"),
|
||||||
("Canvas Zoom", "Zoom na Tela"),
|
("Canvas Zoom", "Zoom na Tela"),
|
||||||
("Reset canvas", "Reiniciar tela"),
|
("Reset canvas", "Reiniciar tela"),
|
||||||
("No permission of file transfer", "Sem permissões de transferência de ficheiro"),
|
("No permission of file transfer", "Sem permissões de transferência de ficheiro"),
|
||||||
("Note", "Nota"),
|
("Note", "Nota"),
|
||||||
("Connection", "Ligação"),
|
("Connection", "Ligação"),
|
||||||
("Share Screen", "Partilhar ecran"),
|
("Share Screen", "Partilhar ecrã"),
|
||||||
("CLOSE", "FECHAR"),
|
("CLOSE", "FECHAR"),
|
||||||
("OPEN", "ABRIR"),
|
("OPEN", "ABRIR"),
|
||||||
("Chat", "Conversar"),
|
("Chat", "Conversar"),
|
||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", ""),
|
("Legacy mode", ""),
|
||||||
("Map mode", ""),
|
("Map mode", ""),
|
||||||
("Translate mode", ""),
|
("Translate mode", ""),
|
||||||
("Use temporary password", "Utilizar palavra-chave temporária"),
|
|
||||||
("Use permanent password", "Utilizar palavra-chave permanente"),
|
("Use permanent password", "Utilizar palavra-chave permanente"),
|
||||||
("Use both passwords", "Utilizar ambas as palavras-chave"),
|
("Use both passwords", "Utilizar ambas as palavras-chave"),
|
||||||
("Set permanent password", "Definir palavra-chave permanente"),
|
("Set permanent password", "Definir palavra-chave permanente"),
|
||||||
("Set temporary password length", "Definir tamanho de palavra-chave temporária"),
|
|
||||||
("Enable Remote Restart", "Activar reiniciar remoto"),
|
("Enable Remote Restart", "Activar reiniciar remoto"),
|
||||||
("Allow remote restart", "Permitir reiniciar remoto"),
|
("Allow remote restart", "Permitir reiniciar remoto"),
|
||||||
("Restart Remote Device", "Reiniciar Dispositivo Remoto"),
|
("Restart Remote Device", "Reiniciar Dispositivo Remoto"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", ""),
|
("Enable hardware codec", ""),
|
||||||
("Unlock Security Settings", ""),
|
("Unlock Security Settings", ""),
|
||||||
("Enable Audio", ""),
|
("Enable Audio", ""),
|
||||||
("Temporary Password Length", ""),
|
|
||||||
("Unlock Network Settings", ""),
|
("Unlock Network Settings", ""),
|
||||||
("Server", ""),
|
("Server", ""),
|
||||||
("Direct IP Access", ""),
|
("Direct IP Access", ""),
|
||||||
@ -371,15 +368,14 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", ""),
|
("Deny LAN Discovery", ""),
|
||||||
("Write a message", ""),
|
("Write a message", ""),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
("Disconnected", "Desconectado"),
|
||||||
("Disconnected", ""),
|
("Other", "Outro"),
|
||||||
("Other", ""),
|
("Confirm before closing multiple tabs", "Confirme antes de fechar vários separadores"),
|
||||||
("Confirm before closing multiple tabs", ""),
|
("Keyboard Settings", "Configurações do teclado"),
|
||||||
("Keyboard Settings", ""),
|
|
||||||
("Custom", ""),
|
("Custom", ""),
|
||||||
("Full Access", ""),
|
("Full Access", "Controlo total"),
|
||||||
("Screen Share", ""),
|
("Screen Share", ""),
|
||||||
("Wayland requires Ubuntu 21.04 or higher version.", "Wayland requer Ubuntu 21.04 ou versão superior."),
|
("Wayland requires Ubuntu 21.04 or higher version.", "Wayland requer Ubuntu 21.04 ou versão superior."),
|
||||||
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland requer uma versão superior da distribuição linux. Por favor, tente o desktop X11 ou mude seu sistema operacional."),
|
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland requer uma versão superior da distribuição linux. Por favor, tente o desktop X11 ou mude seu sistema operacional."),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
("Continue with", ""),
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", "Modo legado"),
|
("Legacy mode", "Modo legado"),
|
||||||
("Map mode", "Modo mapa"),
|
("Map mode", "Modo mapa"),
|
||||||
("Translate mode", "Modo traduzido"),
|
("Translate mode", "Modo traduzido"),
|
||||||
("Use temporary password", "Utilizar senha temporária"),
|
|
||||||
("Use permanent password", "Utilizar senha permanente"),
|
("Use permanent password", "Utilizar senha permanente"),
|
||||||
("Use both passwords", "Utilizar ambas as senhas"),
|
("Use both passwords", "Utilizar ambas as senhas"),
|
||||||
("Set permanent password", "Configurar senha permanente"),
|
("Set permanent password", "Configurar senha permanente"),
|
||||||
("Set temporary password length", "Configurar extensão da senha temporária"),
|
|
||||||
("Enable Remote Restart", "Habilitar reinicialização remota"),
|
("Enable Remote Restart", "Habilitar reinicialização remota"),
|
||||||
("Allow remote restart", "Permitir reinicialização remota"),
|
("Allow remote restart", "Permitir reinicialização remota"),
|
||||||
("Restart Remote Device", "Reiniciar dispositivo remoto"),
|
("Restart Remote Device", "Reiniciar dispositivo remoto"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", "Habilitar codec de hardware"),
|
("Enable hardware codec", "Habilitar codec de hardware"),
|
||||||
("Unlock Security Settings", "Desabilitar configurações de segurança"),
|
("Unlock Security Settings", "Desabilitar configurações de segurança"),
|
||||||
("Enable Audio", "Habilitar áudio"),
|
("Enable Audio", "Habilitar áudio"),
|
||||||
("Temporary Password Length", "Extensão da senha temporária"),
|
|
||||||
("Unlock Network Settings", "Desbloquear configurações de rede"),
|
("Unlock Network Settings", "Desbloquear configurações de rede"),
|
||||||
("Server", "Servidor"),
|
("Server", "Servidor"),
|
||||||
("Direct IP Access", "Acesso direto por IP"),
|
("Direct IP Access", "Acesso direto por IP"),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", "Negar descoberta da LAN"),
|
("Deny LAN Discovery", "Negar descoberta da LAN"),
|
||||||
("Write a message", "Escrever uma mensagem"),
|
("Write a message", "Escrever uma mensagem"),
|
||||||
("Prompt", "Prompt de comando"),
|
("Prompt", "Prompt de comando"),
|
||||||
("elevation_prompt", "Prompt de comando (Admin)"),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", "Aviso UAC"),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", "Aviso de janela de primeiro plano elevado"),
|
|
||||||
("Disconnected", "Desconectado"),
|
("Disconnected", "Desconectado"),
|
||||||
("Other", "Outro"),
|
("Other", "Outro"),
|
||||||
("Confirm before closing multiple tabs", "Confirmar antes de fechar múltiplas abas"),
|
("Confirm before closing multiple tabs", "Confirmar antes de fechar múltiplas abas"),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", "Este PC"),
|
("This PC", "Este PC"),
|
||||||
("or", "ou"),
|
("or", "ou"),
|
||||||
("Continue with", "Continuar com"),
|
("Continue with", "Continuar com"),
|
||||||
|
("Elevate", "Elevar"),
|
||||||
|
("Zoom cursor", "Aumentar cursor"),
|
||||||
|
("Accept sessions via password", "Aceitar sessões via senha"),
|
||||||
|
("Accept sessions via click", "Aceitar sessões via clique"),
|
||||||
|
("Accept sessions via both", "Aceitar sessões de ambos os modos"),
|
||||||
|
("Please wait for the remote side to accept your session request...", "Por favor aguarde enquanto o cliente remoto aceita seu pedido de sessão..."),
|
||||||
|
("One-time Password", "Senha de uso único"),
|
||||||
|
("Use one-time password", "Usar senha de uso único"),
|
||||||
|
("One-time password length", "Comprimento da senha de uso único"),
|
||||||
|
("Request access to your device", "Solicitar acesso ao seu dispositivo"),
|
||||||
|
("Hide connection management window", ""),
|
||||||
|
("hide_cm_tip", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -136,7 +136,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Failed to make direct connection to remote desktop", "Не удалось установить прямое подключение к удалённому рабочему столу"),
|
("Failed to make direct connection to remote desktop", "Не удалось установить прямое подключение к удалённому рабочему столу"),
|
||||||
("Set Password", "Установить пароль"),
|
("Set Password", "Установить пароль"),
|
||||||
("OS Password", "Пароль ОС"),
|
("OS Password", "Пароль ОС"),
|
||||||
("install_tip", "В некоторых случаях из-за UAC RustDesk может работать некорректно на удалённом узле. Чтобы избежать UAC, нажмите кнопку ниже, чтобы установить RustDesk в системе."),
|
("install_tip", "В некоторых случаях из-за UAC RustDesk может работать неправильно на удалённом узле. Чтобы избежать UAC, нажмите кнопку ниже, чтобы установить RustDesk в системе."),
|
||||||
("Click to upgrade", "Нажмите, чтобы проверить наличие обновлений"),
|
("Click to upgrade", "Нажмите, чтобы проверить наличие обновлений"),
|
||||||
("Click to download", "Нажмите, чтобы скачать"),
|
("Click to download", "Нажмите, чтобы скачать"),
|
||||||
("Click to update", "Нажмите, чтобы обновить"),
|
("Click to update", "Нажмите, чтобы обновить"),
|
||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", "Устаревший режим"),
|
("Legacy mode", "Устаревший режим"),
|
||||||
("Map mode", "Режим сопоставления"),
|
("Map mode", "Режим сопоставления"),
|
||||||
("Translate mode", "Режим перевода"),
|
("Translate mode", "Режим перевода"),
|
||||||
("Use temporary password", "Использовать временный пароль"),
|
|
||||||
("Use permanent password", "Использовать постоянный пароль"),
|
("Use permanent password", "Использовать постоянный пароль"),
|
||||||
("Use both passwords", "Использовать оба пароля"),
|
("Use both passwords", "Использовать оба пароля"),
|
||||||
("Set permanent password", "Установить постоянный пароль"),
|
("Set permanent password", "Установить постоянный пароль"),
|
||||||
("Set temporary password length", "Длина временного пароля"),
|
|
||||||
("Enable Remote Restart", "Включить удалённый перезапуск"),
|
("Enable Remote Restart", "Включить удалённый перезапуск"),
|
||||||
("Allow remote restart", "Разрешить удалённый перезапуск"),
|
("Allow remote restart", "Разрешить удалённый перезапуск"),
|
||||||
("Restart Remote Device", "Перезапустить удалённое устройство"),
|
("Restart Remote Device", "Перезапустить удалённое устройство"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", "Использовать аппаратный кодек"),
|
("Enable hardware codec", "Использовать аппаратный кодек"),
|
||||||
("Unlock Security Settings", "Разблокировать настройки безопасности"),
|
("Unlock Security Settings", "Разблокировать настройки безопасности"),
|
||||||
("Enable Audio", "Включить звук"),
|
("Enable Audio", "Включить звук"),
|
||||||
("Temporary Password Length", "Длинна временного пароля"),
|
|
||||||
("Unlock Network Settings", "Разблокировать настройки соединения"),
|
("Unlock Network Settings", "Разблокировать настройки соединения"),
|
||||||
("Server", "Сервер"),
|
("Server", "Сервер"),
|
||||||
("Direct IP Access", "Прямой IP-доступ"),
|
("Direct IP Access", "Прямой IP-доступ"),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", "Запретить обнаружение в локальной сети"),
|
("Deny LAN Discovery", "Запретить обнаружение в локальной сети"),
|
||||||
("Write a message", "Написать сообщение"),
|
("Write a message", "Написать сообщение"),
|
||||||
("Prompt", "Подсказка"),
|
("Prompt", "Подсказка"),
|
||||||
("elevation_prompt", "Запуск программного обеспечения без повышения привилегий может вызвать проблемы, когда удалённые пользователи работают с определёнными окнами."),
|
("Please wait for confirmation of UAC...", "Дождитесь подтверждения UAC..."),
|
||||||
("uac_warning", "Временно отказано в доступе из-за запроса на повышение прав. Подождите, пока удалённый пользователь примет диалоговое окно UAC. Чтобы избежать этой проблемы, рекомендуется устанавливать программное обеспечение на удалённое устройство или запускать его с правами администратора."),
|
("elevated_foreground_window_tip", "Текущее окно удалённого рабочего стола требует более высоких привилегий для работы, поэтому временно невозможно использовать мышь и клавиатуру. Можно попросить удалённого пользователя свернуть текущее окно или нажать кнопку повышения прав в окне управления подключением. Чтобы избежать этой проблемы в дальнейшем, рекомендуется выполнить установку программного обеспечения на удалённом устройстве."),
|
||||||
("elevated_foreground_window_warning", "Временно невозможно использовать мышь и клавиатуру, поскольку текущее окно удалённого рабочего стола требует более высоких привилегий для работы, вы можете попросить удалённого пользователя свернуть текущее окно. Чтобы избежать этой проблемы, рекомендуется устанавливать программное обеспечение на удалённое устройство или запускать его с правами администратора."),
|
|
||||||
("Disconnected", "Отключено"),
|
("Disconnected", "Отключено"),
|
||||||
("Other", "Другое"),
|
("Other", "Другое"),
|
||||||
("Confirm before closing multiple tabs", "Подтверждение закрытия несколько вкладок"),
|
("Confirm before closing multiple tabs", "Подтверждение закрытия несколько вкладок"),
|
||||||
@ -387,7 +383,19 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Please Select the screen to be shared(Operate on the peer side).", "Пожалуйста, выберите экран для совместного использования (работайте на одноранговой стороне)."),
|
("Please Select the screen to be shared(Operate on the peer side).", "Пожалуйста, выберите экран для совместного использования (работайте на одноранговой стороне)."),
|
||||||
("Show RustDesk", "Показать RustDesk"),
|
("Show RustDesk", "Показать RustDesk"),
|
||||||
("This PC", "Этот компьютер"),
|
("This PC", "Этот компьютер"),
|
||||||
("or", ""),
|
("or", "или"),
|
||||||
("Continue with", ""),
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", ""),
|
("Legacy mode", ""),
|
||||||
("Map mode", ""),
|
("Map mode", ""),
|
||||||
("Translate mode", ""),
|
("Translate mode", ""),
|
||||||
("Use temporary password", ""),
|
|
||||||
("Use permanent password", ""),
|
("Use permanent password", ""),
|
||||||
("Use both passwords", ""),
|
("Use both passwords", ""),
|
||||||
("Set permanent password", ""),
|
("Set permanent password", ""),
|
||||||
("Set temporary password length", ""),
|
|
||||||
("Enable Remote Restart", ""),
|
("Enable Remote Restart", ""),
|
||||||
("Allow remote restart", ""),
|
("Allow remote restart", ""),
|
||||||
("Restart Remote Device", ""),
|
("Restart Remote Device", ""),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", ""),
|
("Enable hardware codec", ""),
|
||||||
("Unlock Security Settings", ""),
|
("Unlock Security Settings", ""),
|
||||||
("Enable Audio", ""),
|
("Enable Audio", ""),
|
||||||
("Temporary Password Length", ""),
|
|
||||||
("Unlock Network Settings", ""),
|
("Unlock Network Settings", ""),
|
||||||
("Server", ""),
|
("Server", ""),
|
||||||
("Direct IP Access", ""),
|
("Direct IP Access", ""),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", ""),
|
("Deny LAN Discovery", ""),
|
||||||
("Write a message", ""),
|
("Write a message", ""),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
|
||||||
("Disconnected", ""),
|
("Disconnected", ""),
|
||||||
("Other", ""),
|
("Other", ""),
|
||||||
("Confirm before closing multiple tabs", ""),
|
("Confirm before closing multiple tabs", ""),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
("Continue with", ""),
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", ""),
|
("Legacy mode", ""),
|
||||||
("Map mode", ""),
|
("Map mode", ""),
|
||||||
("Translate mode", ""),
|
("Translate mode", ""),
|
||||||
("Use temporary password", ""),
|
|
||||||
("Use permanent password", ""),
|
("Use permanent password", ""),
|
||||||
("Use both passwords", ""),
|
("Use both passwords", ""),
|
||||||
("Set permanent password", ""),
|
("Set permanent password", ""),
|
||||||
("Set temporary password length", ""),
|
|
||||||
("Enable Remote Restart", ""),
|
("Enable Remote Restart", ""),
|
||||||
("Allow remote restart", ""),
|
("Allow remote restart", ""),
|
||||||
("Restart Remote Device", ""),
|
("Restart Remote Device", ""),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", ""),
|
("Enable hardware codec", ""),
|
||||||
("Unlock Security Settings", ""),
|
("Unlock Security Settings", ""),
|
||||||
("Enable Audio", ""),
|
("Enable Audio", ""),
|
||||||
("Temporary Password Length", ""),
|
|
||||||
("Unlock Network Settings", ""),
|
("Unlock Network Settings", ""),
|
||||||
("Server", ""),
|
("Server", ""),
|
||||||
("Direct IP Access", ""),
|
("Direct IP Access", ""),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", ""),
|
("Deny LAN Discovery", ""),
|
||||||
("Write a message", ""),
|
("Write a message", ""),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
|
||||||
("Disconnected", ""),
|
("Disconnected", ""),
|
||||||
("Other", ""),
|
("Other", ""),
|
||||||
("Confirm before closing multiple tabs", ""),
|
("Confirm before closing multiple tabs", ""),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
("Continue with", ""),
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
144
src/lang/tr.rs
144
src/lang/tr.rs
@ -41,9 +41,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("About", "Hakkında"),
|
("About", "Hakkında"),
|
||||||
("Mute", "Sustur"),
|
("Mute", "Sustur"),
|
||||||
("Audio Input", "Ses Girişi"),
|
("Audio Input", "Ses Girişi"),
|
||||||
("Enhancements", ""),
|
("Enhancements", "Geliştirmeler"),
|
||||||
("Hardware Codec", ""),
|
("Hardware Codec", "Donanımsal Codec"),
|
||||||
("Adaptive Bitrate", ""),
|
("Adaptive Bitrate", "Uyarlanabilir Bit Hızı"),
|
||||||
("ID Server", "ID Sunucu"),
|
("ID Server", "ID Sunucu"),
|
||||||
("Relay Server", "Relay Sunucu"),
|
("Relay Server", "Relay Sunucu"),
|
||||||
("API Server", "API Sunucu"),
|
("API Server", "API Sunucu"),
|
||||||
@ -89,8 +89,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Delete", "Sil"),
|
("Delete", "Sil"),
|
||||||
("Properties", "Özellikler"),
|
("Properties", "Özellikler"),
|
||||||
("Multi Select", "Çoklu Seçim"),
|
("Multi Select", "Çoklu Seçim"),
|
||||||
("Select All", ""),
|
("Select All", "Tümünü Seç"),
|
||||||
("Unselect All", ""),
|
("Unselect All", "Tüm Seçimi Kaldır"),
|
||||||
("Empty Directory", "Boş Klasör"),
|
("Empty Directory", "Boş Klasör"),
|
||||||
("Not an empty directory", "Klasör boş değil"),
|
("Not an empty directory", "Klasör boş değil"),
|
||||||
("Are you sure you want to delete this file?", "Bu dosyayı silmek istediğinize emin misiniz?"),
|
("Are you sure you want to delete this file?", "Bu dosyayı silmek istediğinize emin misiniz?"),
|
||||||
@ -116,9 +116,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Good image quality", "İyi görüntü kalitesi"),
|
("Good image quality", "İyi görüntü kalitesi"),
|
||||||
("Balanced", "Dengelenmiş"),
|
("Balanced", "Dengelenmiş"),
|
||||||
("Optimize reaction time", "Tepki süresini optimize et"),
|
("Optimize reaction time", "Tepki süresini optimize et"),
|
||||||
("Custom", ""),
|
("Custom", "Özel"),
|
||||||
("Show remote cursor", "Uzaktaki fare imlecini göster"),
|
("Show remote cursor", "Uzaktaki fare imlecini göster"),
|
||||||
("Show quality monitor", ""),
|
("Show quality monitor", "Kalite monitörünü göster"),
|
||||||
("Disable clipboard", "Hafızadaki kopyalanmışları engelle"),
|
("Disable clipboard", "Hafızadaki kopyalanmışları engelle"),
|
||||||
("Lock after session end", "Bağlantıdan sonra kilitle"),
|
("Lock after session end", "Bağlantıdan sonra kilitle"),
|
||||||
("Insert", "Ekle"),
|
("Insert", "Ekle"),
|
||||||
@ -161,8 +161,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Action", "Eylem"),
|
("Action", "Eylem"),
|
||||||
("Add", "Ekle"),
|
("Add", "Ekle"),
|
||||||
("Local Port", "Yerel Port"),
|
("Local Port", "Yerel Port"),
|
||||||
("Local Address", ""),
|
("Local Address", "Yerel Adres"),
|
||||||
("Change Local Port", ""),
|
("Change Local Port", "Yerel Port'u Değiştir"),
|
||||||
("setup_server_tip", "Daha hızlı bağlantı için kendi sunucunuzu kurun"),
|
("setup_server_tip", "Daha hızlı bağlantı için kendi sunucunuzu kurun"),
|
||||||
("Too short, at least 6 characters.", "Çok kısa en az 6 karakter gerekli."),
|
("Too short, at least 6 characters.", "Çok kısa en az 6 karakter gerekli."),
|
||||||
("The confirmation is not identical.", "Doğrulama yapılamadı."),
|
("The confirmation is not identical.", "Doğrulama yapılamadı."),
|
||||||
@ -197,7 +197,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Reboot required", "Yeniden başlatma gerekli"),
|
("Reboot required", "Yeniden başlatma gerekli"),
|
||||||
("Unsupported display server ", "Desteklenmeyen görüntü sunucusu"),
|
("Unsupported display server ", "Desteklenmeyen görüntü sunucusu"),
|
||||||
("x11 expected", "x11 bekleniyor"),
|
("x11 expected", "x11 bekleniyor"),
|
||||||
("Port", ""),
|
("Port", "Port"),
|
||||||
("Settings", "Ayarlar"),
|
("Settings", "Ayarlar"),
|
||||||
("Username", "Kullanıcı Adı"),
|
("Username", "Kullanıcı Adı"),
|
||||||
("Invalid port", "Geçersiz port"),
|
("Invalid port", "Geçersiz port"),
|
||||||
@ -278,7 +278,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("android_stop_service_tip", "Hizmetin kapatılması, kurulan tüm bağlantıları otomatik olarak kapatacaktır."),
|
("android_stop_service_tip", "Hizmetin kapatılması, kurulan tüm bağlantıları otomatik olarak kapatacaktır."),
|
||||||
("android_version_audio_tip", "Mevcut Android sürümü ses yakalamayı desteklemiyor, lütfen Android 10 veya sonraki bir sürüme yükseltin."),
|
("android_version_audio_tip", "Mevcut Android sürümü ses yakalamayı desteklemiyor, lütfen Android 10 veya sonraki bir sürüme yükseltin."),
|
||||||
("android_start_service_tip", "Ekran paylaşım hizmetini başlatmak için [Hizmeti Başlat] veya AÇ [Ekran Yakalama] iznine dokunun."),
|
("android_start_service_tip", "Ekran paylaşım hizmetini başlatmak için [Hizmeti Başlat] veya AÇ [Ekran Yakalama] iznine dokunun."),
|
||||||
("Account", ""),
|
("Account", "Hesap"),
|
||||||
("Overwrite", "üzerine yaz"),
|
("Overwrite", "üzerine yaz"),
|
||||||
("This file exists, skip or overwrite this file?", "Bu dosya var, bu dosya atlansın veya üzerine yazılsın mı?"),
|
("This file exists, skip or overwrite this file?", "Bu dosya var, bu dosya atlansın veya üzerine yazılsın mı?"),
|
||||||
("Quit", "Çıkış"),
|
("Quit", "Çıkış"),
|
||||||
@ -300,21 +300,19 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Ignore Battery Optimizations", ""),
|
("Ignore Battery Optimizations", ""),
|
||||||
("android_open_battery_optimizations_tip", ""),
|
("android_open_battery_optimizations_tip", ""),
|
||||||
("Connection not allowed", "bağlantıya izin verilmedi"),
|
("Connection not allowed", "bağlantıya izin verilmedi"),
|
||||||
("Legacy mode", ""),
|
("Legacy mode", "Eski mod"),
|
||||||
("Map mode", ""),
|
("Map mode", "Haritalama modu"),
|
||||||
("Translate mode", ""),
|
("Translate mode", "Çeviri modu"),
|
||||||
("Use temporary password", "Geçici şifre kullan"),
|
|
||||||
("Use permanent password", "Kalıcı şifre kullan"),
|
("Use permanent password", "Kalıcı şifre kullan"),
|
||||||
("Use both passwords", "İki şifreyide kullan"),
|
("Use both passwords", "İki şifreyide kullan"),
|
||||||
("Set permanent password", "Kalıcı şifre oluştur"),
|
("Set permanent password", "Kalıcı şifre oluştur"),
|
||||||
("Set temporary password length", ""),
|
|
||||||
("Enable Remote Restart", "Uzaktan yeniden başlatmayı aktif et"),
|
("Enable Remote Restart", "Uzaktan yeniden başlatmayı aktif et"),
|
||||||
("Allow remote restart", "Uzaktan yeniden başlatmaya izin ver"),
|
("Allow remote restart", "Uzaktan yeniden başlatmaya izin ver"),
|
||||||
("Restart Remote Device", "Uzaktaki cihazı yeniden başlat"),
|
("Restart Remote Device", "Uzaktaki cihazı yeniden başlat"),
|
||||||
("Are you sure you want to restart", "Yeniden başlatmak istediğinize emin misin?"),
|
("Are you sure you want to restart", "Yeniden başlatmak istediğinize emin misin?"),
|
||||||
("Restarting Remote Device", "Uzaktan yeniden başlatılıyor"),
|
("Restarting Remote Device", "Uzaktan yeniden başlatılıyor"),
|
||||||
("remote_restarting_tip", ""),
|
("remote_restarting_tip", "remote_restarting_tip"),
|
||||||
("Copied", ""),
|
("Copied", "Kopyalandı"),
|
||||||
("Exit Fullscreen", "Tam ekrandan çık"),
|
("Exit Fullscreen", "Tam ekrandan çık"),
|
||||||
("Fullscreen", "Tam ekran"),
|
("Fullscreen", "Tam ekran"),
|
||||||
("Mobile Actions", "Mobil İşlemler"),
|
("Mobile Actions", "Mobil İşlemler"),
|
||||||
@ -332,62 +330,72 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Insecure Connection", "Güvenli Bağlantı"),
|
("Insecure Connection", "Güvenli Bağlantı"),
|
||||||
("Scale original", "Orijinali ölçeklendir"),
|
("Scale original", "Orijinali ölçeklendir"),
|
||||||
("Scale adaptive", "Ölçek uyarlanabilir"),
|
("Scale adaptive", "Ölçek uyarlanabilir"),
|
||||||
("General", ""),
|
("General", "Genel"),
|
||||||
("Security", ""),
|
("Security", "Güvenlik"),
|
||||||
("Account", ""),
|
("Account", "Hesap"),
|
||||||
("Theme", ""),
|
("Theme", "Tema"),
|
||||||
("Dark Theme", ""),
|
("Dark Theme", "Koyu Tema"),
|
||||||
("Dark", ""),
|
("Dark", "Koyu"),
|
||||||
("Light", ""),
|
("Light", "Açık"),
|
||||||
("Follow System", ""),
|
("Follow System", "Sisteme Uy"),
|
||||||
("Enable hardware codec", ""),
|
("Enable hardware codec", "Donanımsal codec aktif et"),
|
||||||
("Unlock Security Settings", ""),
|
("Unlock Security Settings", "Güvenlik Ayarlarını Aç"),
|
||||||
("Enable Audio", ""),
|
("Enable Audio", "Sesi Aktif Et"),
|
||||||
("Temporary Password Length", ""),
|
("Unlock Network Settings", "Ağ Ayarlarını Aç"),
|
||||||
("Unlock Network Settings", ""),
|
("Server", "Sunucu"),
|
||||||
("Server", ""),
|
("Direct IP Access", "Direk IP Erişimi"),
|
||||||
("Direct IP Access", ""),
|
("Proxy", "Vekil"),
|
||||||
("Proxy", ""),
|
("Port", "Port"),
|
||||||
("Port", ""),
|
("Apply", "Uygula"),
|
||||||
("Apply", ""),
|
("Disconnect all devices?", "Tüm cihazların bağlantısını kes?"),
|
||||||
("Disconnect all devices?", ""),
|
("Clear", "Temizle"),
|
||||||
("Clear", ""),
|
("Audio Input Device", "Ses Giriş Aygıtı"),
|
||||||
("Audio Input Device", ""),
|
("Deny remote access", "Uzak erişime izin verme"),
|
||||||
("Deny remote access", ""),
|
("Use IP Whitelisting", "IP Beyaz Listeyi Kullan"),
|
||||||
("Use IP Whitelisting", ""),
|
("Network", "Ağ"),
|
||||||
("Network", ""),
|
("Enable RDP", "RDP Aktif Et"),
|
||||||
("Enable RDP", ""),
|
|
||||||
("Pin menubar", "Menü çubuğunu sabitle"),
|
("Pin menubar", "Menü çubuğunu sabitle"),
|
||||||
("Unpin menubar", "Menü çubuğunun sabitlemesini kaldır"),
|
("Unpin menubar", "Menü çubuğunun sabitlemesini kaldır"),
|
||||||
("Recording", ""),
|
("Recording", "Kayıt Ediliyor"),
|
||||||
("Directory", ""),
|
("Directory", "Klasör"),
|
||||||
("Automatically record incoming sessions", ""),
|
("Automatically record incoming sessions", "Gelen oturumları otomatik olarak kayıt et"),
|
||||||
("Change", ""),
|
("Change", "Değiştir"),
|
||||||
("Start session recording", ""),
|
("Start session recording", "Oturum kaydını başlat"),
|
||||||
("Stop session recording", ""),
|
("Stop session recording", "Oturum kaydını sonlandır"),
|
||||||
("Enable Recording Session", ""),
|
("Enable Recording Session", "Kayıt Oturumunu Aktif Et"),
|
||||||
("Allow recording session", ""),
|
("Allow recording session", "Oturum kaydına izin ver"),
|
||||||
("Enable LAN Discovery", ""),
|
("Enable LAN Discovery", "Yerel Ağ Keşfine İzin Ver"),
|
||||||
("Deny LAN Discovery", ""),
|
("Deny LAN Discovery", "Yerl Ağ Keşfine İzin Verme"),
|
||||||
("Write a message", ""),
|
("Write a message", "Bir mesaj yazın"),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", "UAC onayı için lütfen bekleyiniz..."),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", "elevated_foreground_window_tip"),
|
||||||
("elevated_foreground_window_warning", ""),
|
("Disconnected", "Bağlantı Kesildi"),
|
||||||
("Disconnected", ""),
|
("Other", "Diğer"),
|
||||||
("Other", ""),
|
("Confirm before closing multiple tabs", "Çoklu sekmeleri kapatmadan önce onayla"),
|
||||||
("Confirm before closing multiple tabs", ""),
|
("Keyboard Settings", "Klavye Ayarları"),
|
||||||
("Keyboard Settings", ""),
|
("Custom", "Özel"),
|
||||||
("Custom", ""),
|
("Full Access", "Tam Erişim"),
|
||||||
("Full Access", ""),
|
("Screen Share", "Ekran Paylaşımı"),
|
||||||
("Screen Share", ""),
|
|
||||||
("Wayland requires Ubuntu 21.04 or higher version.", "Wayland, Ubuntu 21.04 veya daha yüksek bir sürüm gerektirir."),
|
("Wayland requires Ubuntu 21.04 or higher version.", "Wayland, Ubuntu 21.04 veya daha yüksek bir sürüm gerektirir."),
|
||||||
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland, linux dağıtımının daha yüksek bir sürümünü gerektirir. Lütfen X11 masaüstünü deneyin veya işletim sisteminizi değiştirin."),
|
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland, linux dağıtımının daha yüksek bir sürümünü gerektirir. Lütfen X11 masaüstünü deneyin veya işletim sisteminizi değiştirin."),
|
||||||
("JumpLink", "View"),
|
("JumpLink", "View"),
|
||||||
("Please Select the screen to be shared(Operate on the peer side).", "Lütfen paylaşılacak ekranı seçiniz (Ekran tarafında çalıştırın)."),
|
("Please Select the screen to be shared(Operate on the peer side).", "Lütfen paylaşılacak ekranı seçiniz (Ekran tarafında çalıştırın)."),
|
||||||
("Show RustDesk", ""),
|
("Show RustDesk", "RustDesk'i Göster"),
|
||||||
("This PC", ""),
|
("This PC", "Bu PC"),
|
||||||
("or", ""),
|
("or", "veya"),
|
||||||
("Continue with", ""),
|
("Continue with", "bununla devam et"),
|
||||||
|
("Elevate", "Yükseltme"),
|
||||||
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", "傳統模式"),
|
("Legacy mode", "傳統模式"),
|
||||||
("Map mode", "1:1傳輸"),
|
("Map mode", "1:1傳輸"),
|
||||||
("Translate mode", "翻譯模式"),
|
("Translate mode", "翻譯模式"),
|
||||||
("Use temporary password", "使用臨時密碼"),
|
|
||||||
("Use permanent password", "使用固定密碼"),
|
("Use permanent password", "使用固定密碼"),
|
||||||
("Use both passwords", "同時使用兩種密碼"),
|
("Use both passwords", "同時使用兩種密碼"),
|
||||||
("Set permanent password", "設定固定密碼"),
|
("Set permanent password", "設定固定密碼"),
|
||||||
("Set temporary password length", "設定臨時密碼長度"),
|
|
||||||
("Enable Remote Restart", "允許遠程重啓"),
|
("Enable Remote Restart", "允許遠程重啓"),
|
||||||
("Allow remote restart", "允許遠程重啓"),
|
("Allow remote restart", "允許遠程重啓"),
|
||||||
("Restart Remote Device", "重啓遠程電腦"),
|
("Restart Remote Device", "重啓遠程電腦"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", "使用硬件編解碼"),
|
("Enable hardware codec", "使用硬件編解碼"),
|
||||||
("Unlock Security Settings", "解鎖安全設置"),
|
("Unlock Security Settings", "解鎖安全設置"),
|
||||||
("Enable Audio", "允許傳輸音頻"),
|
("Enable Audio", "允許傳輸音頻"),
|
||||||
("Temporary Password Length", "臨時密碼長度"),
|
|
||||||
("Unlock Network Settings", "解鎖網絡設置"),
|
("Unlock Network Settings", "解鎖網絡設置"),
|
||||||
("Server", "服務器"),
|
("Server", "服務器"),
|
||||||
("Direct IP Access", "IP直接訪問"),
|
("Direct IP Access", "IP直接訪問"),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", "拒絕局域網發現"),
|
("Deny LAN Discovery", "拒絕局域網發現"),
|
||||||
("Write a message", "輸入聊天消息"),
|
("Write a message", "輸入聊天消息"),
|
||||||
("Prompt", "提示"),
|
("Prompt", "提示"),
|
||||||
("elevation_prompt", "以當前用戶權限運行軟件,可能導致遠端在訪問本機時,沒有足夠的權限來操作部分窗口。"),
|
("Please wait for confirmation of UAC...", "請等待對方確認UAC"),
|
||||||
("uac_warning", "暂时无法访问远端设备,因为远端设备正在请求用户账户权限,请等待对方关闭UAC窗口。为避免这个问题,建议在远端设备上安装或者以管理员权限运行本软件。"),
|
("elevated_foreground_window_tip", "遠端桌面的當前窗口需要更高的權限才能操作, 暫時無法使用鼠標鍵盤, 可以請求對方最小化當前窗口, 或者在連接管理窗口點擊提升。為避免這個問題,建議在遠端設備上安裝本軟件。"),
|
||||||
("elevated_foreground_window_warning", "暫時無法使用鼠標鍵盤,因為遠端桌面的當前窗口需要更高的權限才能操作, 可以請求對方最小化當前窗口。為避免這個問題,建議在遠端設備上安裝或者以管理員權限運行本軟件。"),
|
|
||||||
("Disconnected", "會話已結束"),
|
("Disconnected", "會話已結束"),
|
||||||
("Other", "其他"),
|
("Other", "其他"),
|
||||||
("Confirm before closing multiple tabs", "關閉多個分頁前跟我確認"),
|
("Confirm before closing multiple tabs", "關閉多個分頁前跟我確認"),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
("Continue with", ""),
|
("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", "在只允許密碼連接並且只用固定密碼的情況下才允許隱藏"),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -303,11 +303,9 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Legacy mode", ""),
|
("Legacy mode", ""),
|
||||||
("Map mode", ""),
|
("Map mode", ""),
|
||||||
("Translate mode", ""),
|
("Translate mode", ""),
|
||||||
("Use temporary password", "Використовувати тимчасовий пароль"),
|
|
||||||
("Use permanent password", "Використовувати постійний пароль"),
|
("Use permanent password", "Використовувати постійний пароль"),
|
||||||
("Use both passwords", "Використовувати обидва паролі"),
|
("Use both passwords", "Використовувати обидва паролі"),
|
||||||
("Set permanent password", "Встановити постійний пароль"),
|
("Set permanent password", "Встановити постійний пароль"),
|
||||||
("Set temporary password length", "Довжина тимчасового пароля"),
|
|
||||||
("Enable Remote Restart", "Увімкнути віддалений перезапуск"),
|
("Enable Remote Restart", "Увімкнути віддалений перезапуск"),
|
||||||
("Allow remote restart", "Дозволити віддалений перезапуск"),
|
("Allow remote restart", "Дозволити віддалений перезапуск"),
|
||||||
("Restart Remote Device", "Перезапустити віддалений пристрій"),
|
("Restart Remote Device", "Перезапустити віддалений пристрій"),
|
||||||
@ -343,7 +341,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Enable hardware codec", "Увімкнути апаратний кодек"),
|
("Enable hardware codec", "Увімкнути апаратний кодек"),
|
||||||
("Unlock Security Settings", "Розблокувати налаштування безпеки"),
|
("Unlock Security Settings", "Розблокувати налаштування безпеки"),
|
||||||
("Enable Audio", "Вімкнути аудіо"),
|
("Enable Audio", "Вімкнути аудіо"),
|
||||||
("Temporary Password Length", "Довжина тимчасового пароля"),
|
|
||||||
("Unlock Network Settings", "Розблокувати мережеві налаштування"),
|
("Unlock Network Settings", "Розблокувати мережеві налаштування"),
|
||||||
("Server", "Сервер"),
|
("Server", "Сервер"),
|
||||||
("Direct IP Access", "Прямий IP доступ"),
|
("Direct IP Access", "Прямий IP доступ"),
|
||||||
@ -371,9 +368,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Deny LAN Discovery", "Заборонити виявлення локальної мережі"),
|
("Deny LAN Discovery", "Заборонити виявлення локальної мережі"),
|
||||||
("Write a message", "Написати повідомлення"),
|
("Write a message", "Написати повідомлення"),
|
||||||
("Prompt", ""),
|
("Prompt", ""),
|
||||||
("elevation_prompt", ""),
|
("Please wait for confirmation of UAC...", ""),
|
||||||
("uac_warning", ""),
|
("elevated_foreground_window_tip", ""),
|
||||||
("elevated_foreground_window_warning", ""),
|
|
||||||
("Disconnected", ""),
|
("Disconnected", ""),
|
||||||
("Other", ""),
|
("Other", ""),
|
||||||
("Confirm before closing multiple tabs", ""),
|
("Confirm before closing multiple tabs", ""),
|
||||||
@ -389,5 +385,17 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("This PC", ""),
|
("This PC", ""),
|
||||||
("or", ""),
|
("or", ""),
|
||||||
("Continue with", ""),
|
("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", ""),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user