rustdesk/src
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
..
client feat(fs): delegate win --server file reading to CM (#13736) 2025-12-28 15:39:35 +08:00
hbbs_http fix is_public (#13701) 2025-12-02 14:54:56 +08:00
lang feat: Add relative mouse mode (#13928) 2026-01-09 10:03:14 +08:00
platform feat: Add relative mouse mode (#13928) 2026-01-09 10:03:14 +08:00
plugin refact: remove unnecessary printing (#12000) 2025-06-06 14:52:01 +08:00
privacy_mode fix: win, privacy mode 2 (#12123) 2025-06-19 18:39:15 +08:00
server feat: Add relative mouse mode (#13928) 2026-01-09 10:03:14 +08:00
ui Allow configuring remote control permissions for different users (#13974) 2026-01-09 00:21:28 +08:00
whiteboard feat: cursor, linux, Xwayland (#12859) 2025-09-06 20:35:51 +08:00
auth_2fa.rs trust this device to skip 2fa (#9012) 2024-08-12 18:08:33 +08:00
cli.rs revert back to async_trait since having to use 1.75 because of win7 2024-03-27 03:36:33 +08:00
client.rs edge scroll thickness adjustment (#13445) 2025-11-07 01:15:13 +08:00
clipboard.rs fix: wayland controlled side, cursor misalignment (#13537) 2025-11-18 00:37:15 +08:00
clipboard_file.rs feat: clipboard files, audit (#12730) 2025-08-25 22:29:53 +08:00
common.rs feat: Add relative mouse mode (#13928) 2026-01-09 10:03:14 +08:00
core_main.rs fix(terminal): linux, macOS, win as the controlled (#13930) 2026-01-07 16:07:14 +08:00
custom_server.rs A=b, A case insensitive (#9976) 2024-11-20 19:44:24 +08:00
flutter.rs fix: wayland controlled side, cursor misalignment (#13537) 2025-11-18 00:37:15 +08:00
flutter_ffi.rs feat: Add relative mouse mode (#13928) 2026-01-09 10:03:14 +08:00
hbbs_http.rs refact: tls, native-tls fallback rustls-tls (#13263) 2025-11-03 23:21:01 +08:00
ipc.rs Allow configuring remote control permissions for different users (#13974) 2026-01-09 00:21:28 +08:00
kcp_stream.rs fix kcp_stream 2025-06-13 00:30:21 +08:00
keyboard.rs feat: Add relative mouse mode (#13928) 2026-01-09 10:03:14 +08:00
lan.rs refact: suppress warns on macos (#12449) 2025-08-18 15:09:11 +08:00
lang.rs fix: custom client, contains RustDesk (#13783) 2025-12-11 21:17:42 +08:00
lib.rs feat: Add relative mouse mode (#13928) 2026-01-09 10:03:14 +08:00
main.rs refact: rust backtrace logs (#13467) 2025-11-10 15:43:46 +08:00
naming.rs fix: http/https proxy (#7821) 2024-04-25 11:46:21 +08:00
port_forward.rs show TCP/UDP/IPv6 in tooltip (#12613) 2025-08-11 16:13:31 +08:00
privacy_mode.rs refact: suppress warns on macos (#12449) 2025-08-18 15:09:11 +08:00
rendezvous_mediator.rs Allow configuring remote control permissions for different users (#13974) 2026-01-09 00:21:28 +08:00
server.rs Allow configuring remote control permissions for different users (#13974) 2026-01-09 00:21:28 +08:00
service.rs missed file 2025-01-01 23:11:38 +08:00
tray.rs fix: linux tray, defunct process (#12177) 2025-06-26 18:27:22 +08:00
ui.rs Allow configuring remote control permissions for different users (#13974) 2026-01-09 00:21:28 +08:00
ui_cm_interface.rs Allow configuring remote control permissions for different users (#13974) 2026-01-09 00:21:28 +08:00
ui_interface.rs Allow configuring remote control permissions for different users (#13974) 2026-01-09 00:21:28 +08:00
ui_session_interface.rs feat: Add relative mouse mode (#13928) 2026-01-09 10:03:14 +08:00
updater.rs refact: tls, native-tls fallback rustls-tls (#13263) 2025-11-03 23:21:01 +08:00
virtual_display_manager.rs fix: uninstall, idd (#13142) 2025-10-12 09:14:21 +08:00