RustDesk/flutter/lib/models
fufesou 998b75856d
feat: Add relative mouse mode (#13928)
* feat: Add relative mouse mode

- Add "Relative Mouse Mode" toggle in desktop toolbar and bind to InputModel
- Implement relative mouse movement path: Flutter pointer deltas -> `type: move_relative` -> new `MOUSE_TYPE_MOVE_RELATIVE` in Rust
- In server input service, simulate relative movement via Enigo and keep latest cursor position in sync
- Track pointer-lock center in Flutter (local widget + screen coordinates) and re-center OS cursor after each relative move
- Update pointer-lock center on window move/resize/restore/maximize and when remote display geometry changes
- Hide local cursor when relative mouse mode is active (both Flutter cursor and OS cursor), restore on leave/disable
- On Windows, clip OS cursor to the window rect while in relative mode and release clip when leaving/turning off
- Implement platform helpers: `get_cursor_pos`, `set_cursor_pos`, `show_cursor`, `clip_cursor` (no-op clip/hide on Linux for now)
- Add keyboard shortcut Ctrl+Alt+Shift+M to toggle relative mode (enabled by default, works on all platforms)
- Remove `enable-relative-mouse-shortcut` config option - shortcut is now always available when keyboard permission is granted
- Handle window blur/focus/minimize events to properly release/restore cursor constraints
- Add MOUSE_TYPE_MASK constant and unit tests for mouse event constants

Note: Relative mouse mode state is NOT persisted to config (session-only).
Note: On Linux, show_cursor and clip_cursor are no-ops; cursor hiding is handled by Flutter side.

Signed-off-by: fufesou <linlong1266@gmail.com>

* feat(mouse): relative mouse mode, exit hint

Signed-off-by: fufesou <linlong1266@gmail.com>

* refact(relative mouse): shortcut

Signed-off-by: fufesou <linlong1266@gmail.com>

---------

Signed-off-by: fufesou <linlong1266@gmail.com>
2026-01-09 10:03:14 +08:00
..
ab_model.dart remove gzip encoding in Legacy AB pushes (#13937) 2026-01-02 10:24:47 +08:00
chat_model.dart fix: web chat (#9588) 2024-10-08 15:23:00 +08:00
cm_file_model.dart feat(fs): delegate win --server file reading to CM (#13736) 2025-12-28 15:39:35 +08:00
desktop_render_texture.dart view camera (#11040) 2025-03-10 21:06:53 +08:00
file_model.dart feat(fs): delegate win --server file reading to CM (#13736) 2025-12-28 15:39:35 +08:00
group_model.dart set allowMalformed to true when decode utf8 (#12693) 2025-08-20 14:55:52 +08:00
input_model.dart feat: Add relative mouse mode (#13928) 2026-01-09 10:03:14 +08:00
model.dart feat: Add relative mouse mode (#13928) 2026-01-09 10:03:14 +08:00
native_model.dart fix: ios, file transfer, home dir (#12657) 2025-08-15 00:00:05 +08:00
peer_model.dart show peer note (#13140) 2025-10-12 14:59:42 +08:00
peer_tab_model.dart disable-discovery-pane 2025-09-01 17:07:29 +08:00
platform_model.dart fix: web send audit note (#9582) 2024-10-07 21:37:43 +08:00
printer_model.dart feat: take screenshot (#11591) 2025-04-30 17:23:35 +08:00
relative_mouse_model.dart feat: Add relative mouse mode (#13928) 2026-01-09 10:03:14 +08:00
server_model.dart terminal works basically. (#12189) 2025-07-01 13:12:55 +08:00
state_model.dart feat: Add relative mouse mode (#13928) 2026-01-09 10:03:14 +08:00
terminal_model.dart feat(terminal): add two-row floating keyboard buttons for common commands (mobile only) (#13876) 2025-12-28 15:41:25 +08:00
user_model.dart set allowMalformed to true when decode utf8 (#12693) 2025-08-20 14:55:52 +08:00
web_model.dart Revert "try fix firefox v2 paste problem" (#12126) 2025-06-19 22:31:40 +08:00