Commit Graph

25 Commits

Author SHA1 Message Date
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
fufesou
4abdb2e08b feat: windows, custom client, update (#13687)
Signed-off-by: fufesou <linlong1266@gmail.com>
2026-02-27 21:50:20 +08:00
21pages
ce924cc0d3 combine upload files/folder button (#9643)
* combine upload files/folder button

Signed-off-by: 21pages <sunboeasy@gmail.com>

* web compress cache

Signed-off-by: 21pages <sunboeasy@gmail.com>

---------

Signed-off-by: 21pages <sunboeasy@gmail.com>
2024-10-14 15:46:21 +08:00
rustdesk
df74a38b90 disable-group-panel for https://github.com/rustdesk/rustdesk-server-pro/issues/250 2024-05-28 20:10:12 +08:00
Moaz bin Mokhtar
2c8a60e0ea fix: update version of zbus to build system (#6845) 2024-01-10 09:27:36 +08:00
Kingtous
f2f39e31a1 feat: change dummy c to a rust plugin example 2023-04-13 02:14:59 +08:00
Kingtous
7f20dac547 opt: reuse deps workflows 2023-03-23 10:11:57 +08:00
enforcer007
45c66060e5 devcontainer configuration 2023-02-08 22:20:48 +05:30
21pages
ee0e84be37 update flutter_rust_bridge to latest
Signed-off-by: 21pages <pages21@163.com>
2023-01-20 14:53:52 +08:00
Kingtous
400911f782 refactor: change ayaindicator to appindicator 2022-11-08 21:17:56 +08:00
Kingtous
eb059d83c6 opt: windows program name to rustdesk 2022-09-25 19:22:59 +08:00
Kingtous
2d93460873 feat: flatpak and flutter build 2022-09-08 18:27:38 +08:00
Kingtous
3b9c62b05d Merge remote-tracking branch 'rustdesk/master' into flutter_desktop
# Conflicts:
#	.github/workflows/ci.yml
#	Cargo.lock
#	Cargo.toml
#	flutter/lib/common.dart
#	flutter/lib/mobile/pages/remote_page.dart
#	flutter/lib/mobile/pages/server_page.dart
#	flutter/lib/mobile/pages/settings_page.dart
#	flutter/lib/mobile/widgets/dialog.dart
#	flutter/lib/models/model.dart
#	flutter/lib/models/server_model.dart
#	src/client.rs
#	src/common.rs
#	src/ipc.rs
#	src/mobile_ffi.rs
#	src/rendezvous_mediator.rs
#	src/ui.rs
2022-08-01 10:44:05 +08:00
fufesou
0ba8b4079b flutter_desktop_online_state: refactor connection page
Signed-off-by: fufesou <shuanglongchen@yeah.net>
2022-07-28 11:11:13 +08:00
fufesou
aae6e2b16b linux_wayland_support: init merge, windows build
Signed-off-by: fufesou <shuanglongchen@yeah.net>
2022-07-20 09:16:13 -07:00
Kingtous
618be48726 feat: appimage package script
revert: flutter lock file
2022-06-09 17:46:17 +08:00
csf
2169c6fe33 fix android translation and hostname 2022-06-08 22:35:06 +08:00
csf
6d83aeeabb Android screen wakeup 2022-06-08 21:08:05 +08:00
rustdesk
222245a60c more linux distro 2022-05-23 11:59:56 +08:00
csf
a7af7967f6 use new event channel for mobile and web 2022-05-17 19:59:37 +08:00
rustdesk
d01eb70b48 more build 2022-05-14 11:46:20 +08:00
fufesou
6672087f7c windows clipboard
Signed-off-by: fufesou <shuanglongchen@yeah.net>
2022-02-15 11:18:53 +08:00
open-trade
3491c79cbc get_local_option for ui style, todo: set_local_option 2021-12-29 17:53:36 +08:00
Arash Hatami
96208e9fef git ignore .vscode 2021-11-14 18:36:03 +03:30
rustdesk
d1013487e2 source code 2021-03-29 15:59:14 +08:00