rustdesk/flutter
rustdesk cd7686baa2 feat(shortcuts): user-configurable keyboard shortcuts for session actions
Adds a keyboard shortcut feature (Rust matcher + Dart UI + cross-language
  parity tests) that lets users bind combinations like Ctrl+Alt+Shift+P to
  session actions. Bindings are stored in LocalConfig under
  `keyboard-shortcuts`; the matcher gates dispatch on `enabled` and
  `pass_through` flags so flipping the master switch off is a hard stop.

  Wire-up summary:
  - src/keyboard/shortcuts.rs: matcher, default bindings, parity test against
    flutter/test/fixtures/default_keyboard_shortcuts.json
  - src/keyboard.rs: shortcut intercept in process_event{,_with_session},
    feature-gated to `flutter`; runs before key swapping so users bind to
    physical keys
  - src/flutter_ffi.rs: main_reload_keyboard_shortcuts +
    main_get_default_keyboard_shortcuts; reload_from_config seeded in main_init
  - flutter/lib/common/widgets/keyboard_shortcuts/: shared config page body,
    recording dialog, shortcut display formatter, action group registry
  - flutter/lib/desktop/pages/desktop_keyboard_shortcuts_page.dart and
    flutter/lib/mobile/pages/mobile_keyboard_shortcuts_page.dart: platform
    shells around the shared body
  - flutter/lib/models/shortcut_model.dart: per-session ShortcutModel +
    registerSessionShortcutActions for actions with no toolbar TToggleMenu /
    TRadioMenu (fullscreen, switch display/tab, close tab, voice call, etc.)
  - flutter/lib/common/widgets/toolbar.dart: optional `actionId` field on
    TToggleMenu / TRadioMenu, plus per-helper auto-register pass that wires
    tagged entries' existing onChanged into the ShortcutModel
  - flutter/test/keyboard_shortcuts_test.dart + fixtures: cross-language
    parity (default bindings, supported key vocabulary)

  Design principles applied during review:

  1. Additions are fine; modifications to original logic must be deliberate.
     Tagging an existing TToggleMenu entry with `actionId:` is an addition.
     Rewriting its onChanged to satisfy a new contract is a modification —
     and was reverted for every case where the original click behavior was
     working. Four closures were touched and then reverted (mobile View
     Mode, Privacy mode multi-impl, Relative mouse mode, Reverse mouse
     wheel); their shortcuts are wired via standalone closures in
     shortcut_model.dart instead.

  2. Toolbar auto-register is reserved for entries whose onChanged is
     inherently self-flipping — typically `sessionToggleOption(name)` where
     the named option is flipped in place and the input bool is unused. The
     register pass passes `!menu.value` from registration time, which is
     harmless under self-flipping but wrong for closures that consume the
     input bool directly. Tagging a non-self-flipping entry forces a closure
     rewrite; choose non-toolbar registration in that case.

  3. When shortcuts are disabled, toolbar behavior must be bit-for-bit
     unchanged. The matcher's `enabled`-gate already guarantees no
     dispatch; the auto-register pass is left unconditional (its only effect
     is HashMap operations on a separate ShortcutModel) so mid-session
     enable works without a reconnect. The trade-off is intentional and
     documented at the top of toolbarControls.

  4. Comments stay terse. Rationale lives in one place — the doc comment of
     the helper or registration site, not duplicated at every call site.

  5. Where an existing helper needs a new optional behavior (e.g.
     `_OptionCheckBox` gaining a tooltip slot), the new branch must reduce
     to byte-identical output for existing callers (`trailing == null`
     case → original `Expanded(Text)` layout). Verified.

  6. Action IDs and labels stay consistent. Renamed `reset_cursor` →
     `reset_canvas` so the action ID matches its user-facing label
     ("Reset canvas") and capability flag.

  Out-of-scope but included:
  - AGENTS.md: documents flutter_rust_bridge no-codegen workflow and the
    Web target's hand-written TS client, since both are load-bearing for
    any new FFI work.
  - remote_toolbar.dart: i18n fix for the per-monitor tooltip ("All
    monitors" / "Monitor #N"), unrelated to shortcuts but kept here.
2026-04-30 16:40:42 +08:00
..
android fix(android): waiting for image, one cause (#14919) 2026-04-27 22:37:22 +08:00
assets add microsoft oidc logo 2026-04-15 14:39:46 +08:00
ios ios: Enable file sharing and document browser support (#13226) 2025-10-23 15:58:50 +08:00
lib feat(shortcuts): user-configurable keyboard shortcuts for session actions 2026-04-30 16:40:42 +08:00
linux fix(linux): enable mouse side buttons in remote sessions (#14848) 2026-04-25 12:46:05 +08:00
macos feat: Add relative mouse mode (#13928) 2026-01-09 10:03:14 +08:00
test feat(shortcuts): user-configurable keyboard shortcuts for session actions 2026-04-30 16:40:42 +08:00
windows feat: windows, custom client, update (#13687) 2026-02-27 21:50:20 +08:00
.gitattributes for merge 2022-05-12 16:50:30 +08:00
.gitignore Refact. Build flutter web (#7472) 2024-03-22 13:16:37 +08:00
.metadata fix platform 2022-05-23 16:24:56 +08:00
analysis_options.yaml remove menu from desktop home page 2022-09-19 18:38:19 +08:00
build_android.sh Merge remote-tracking branch 'upstream/master' into file-manager-redesign 2023-02-22 23:01:31 +01:00
build_android_deps.sh linux dynamic load libva (#10171) 2024-12-04 17:10:10 +08:00
build_fdroid.sh Fix F-Droid 1.4.6 build (#13601) 2026-03-20 13:45:35 +08:00
build_ios.sh fix some build command 2025-05-11 01:15:29 +08:00
ios_arm64.sh fix some build command 2025-05-11 01:15:29 +08:00
ios_x64.sh build ipa with given profile: https://jtmuller5.medium.com/flutter-build-an-ipa-90520e813a96 2023-04-22 13:21:06 +08:00
ndk_arm.sh enable ffmpeg native h26x software decoders for all platforms (#7750) 2024-04-18 13:12:45 +08:00
ndk_arm64.sh enable ffmpeg native h26x software decoders for all platforms (#7750) 2024-04-18 13:12:45 +08:00
ndk_x64.sh fix: android ci 2022-11-29 01:44:12 +08:00
ndk_x86.sh Fix OpenSSL build with Android NDK clang on x86 (#13684) 2025-12-04 17:54:07 +08:00
pubspec.lock fix: terminal, web, fonts (#12376) 2025-07-22 23:42:05 +08:00
pubspec.yaml flutter: shift after one shot IME capitalization (#14695) 2026-04-26 22:44:26 +08:00
README.md Punctuation correction (#6808) 2024-01-06 11:11:35 +08:00
run.sh https://github.com/rustdesk/rustdesk/pull/7971 2024-06-03 13:40:14 +08:00

flutter_hbb

A new Flutter project.

Getting Started

This project is a starting point for a Flutter application.

A few resources to get you started if this is your first Flutter project:

For help getting started with Flutter development, view the online documentation, which offers tutorials, samples and guidance on mobile development, and a full API reference.