Commit Graph

4 Commits

Author SHA1 Message Date
xuwenwei b9cb597b99 Add '强制不走中继连接' menu item + reconnect(false) actually clears force_relay
Two changes:

1. src/ui_session_interface.rs reconnect(false): Upstream only ever set
   force_relay=true and ignored force_relay=false. This was wrong — the
   user has no way to clear the flag. Now reconnect(false) sets
   force_relay=false AND resets direct_failures=0, so the next
   connect() gets a fresh punch with the full timeout.

2. flutter/lib/common/widgets/peer_card.dart: Add a new menu item
   '强制不走中继连接' in all 5 _buildMenuItems implementations (recent,
   favorite, ab, discovered, address-book). Click calls
   rustDeskWinManager.newRemoteDesktop(id, forceRelay: false) which
   triggers a fresh punch. If punch fails, RustDesk's existing
   connect() falls back to relay — so the user always ends up with a
   working connection (just with a chance of P2P that was retried).

Use case: User's home Mac and office Win on different physical
networks, hbbr at 5 Mbps. By default every connection is relay
(orange banner, no file transfer). Clicking '强制不走中继' forces
a fresh P2P attempt — usually fails, but gives the user the
transparency to know 'yes, it tried P2P first'.
2026-06-09 20:06:37 +08:00
xuwenwei 8ef7ff1ce9 Hide 'Transfer file' and 'TCP tunneling' menu items in relay mode
Plan B for the punch UI: don't just grey out file transfer — hide it
entirely when the connection is relay. The user can't try to use it,
and we save the toast explanation.

When punch succeeds (P2P, direct), the menu items reappear.

Applied to:
  - Transfer file
  - TCP tunneling

(Leaving View camera and Terminal in the menu regardless of mode —
  they don't use server bandwidth significantly.)
2026-06-09 12:04:18 +08:00
xuwenwei 8a5ba65132 Add P2P/relay status banner + gate file-transfer menu on relay
Custom fork feature: surface NAT-punch result to the user so they know
whether the connection is going through their 21117 server (relay) or
directly between the two machines (P2P).

Three changes:

1. flutter/lib/common/shared_state.dart: add ConnectionType.isP2P getter
   (true = direct, false = relay) and a top-level isDirectConnection(peerId)
   helper that returns true when state is unknown (so UI doesn't briefly
   grey out before the connection establishes).

2. flutter/lib/desktop/widgets/punch_status_banner.dart (new): a small
   Positioned banner at the top of the connection page.
   - P2P success: green  banner: 'P2P 直连成功 — 走的是两台机器之间的网络,可放心传文件'
   - Relay fallback: orange ⚠ banner: '中继模式 — 视频/控制走服务器 21117 中转,请勿传大文件'
   The banner is reactive (Obx on ConnectionType.direct Rx<String>).

3. flutter/lib/common/widgets/toolbar.dart: wrap the 'Transfer file' and
   'TCP tunneling' menu items' onPressed with an isDirectConnection() guard.
   On relay mode, the menu still shows but the click is intercepted with a
   toast explaining why the action is blocked.

4. flutter/lib/desktop/pages/remote_page.dart: add the banner via
   Positioned(top: 0, left: 0, right: 0) at the end of bodyWidget's Stack.

Why this matters: user has 4 users on 5 Mbps server (114.55.133.123).
When NAT punch fails and the session goes through relay, file transfers
would saturate the server bandwidth. Showing the relay state + blocking
the file-transfer menu protects the server without requiring the user
to remember the technical detail.
2026-06-09 01:24:54 +08:00
xuwenwei d3b6026bfd Initial commit: RustDesk 1.4.7 macOS desktop port
- Filled empty libs/hbb_common/ submodule (cloned from rustdesk/hbb_common)
- Patched Flutter 3.44 / Dart 3.12 compatibility:
  * flutter/lib/generated_bridge.dart: asTypedList with cast<>, DartPort=Int64
  * flutter/lib/common.dart: DialogTheme->DialogThemeData, TabBarTheme->TabBarThemeData
  * flutter/pubspec.yaml: extended_text 14.0.0->15.0.2, google_fonts override 5.0.0
  * flutter/macos/Runner/Configs/Release.xcconfig: EXCLUDED_ARCHS=x86_64
- Build verified: cargo check + cargo build --features flutter + cargo build --release --features flutter
- Verified flutter build macos --debug and --release both produce working .app
- Verified .dmg installer (27MB arm64) created via hdiutil
- Build deps: Xcode 26.5, CocoaPods 1.16.2, Flutter 3.44, VCPKG arm64-osx
2026-06-08 21:43:20 +08:00