fix(rustdesk): reduce mouse input latency

This commit is contained in:
raymond
2026-09-02 09:46:55 +08:00
parent dcfa3eadaf
commit 03866aa495
2 changed files with 231 additions and 107 deletions

View File

@@ -50,13 +50,7 @@ pub fn convert_mouse_event(
});
}
mouse_type::MOVE_RELATIVE => {
events.push(OneKvmMouseEvent {
event_type: MouseEventType::Move,
x: event.x,
y: event.y,
button: None,
scroll: 0,
});
events.extend(convert_relative_mouse_delta(event.x, event.y));
}
mouse_type::DOWN => {
if let Some(button) = button_id_to_button(button_id) {
@@ -96,6 +90,28 @@ pub fn convert_mouse_event(
events
}
/// Split accumulated relative movement into USB HID-sized reports. Both the OTG
/// and CH9329 relative endpoints are limited to signed 8-bit deltas.
pub fn convert_relative_mouse_delta(mut x: i32, mut y: i32) -> Vec<OneKvmMouseEvent> {
let mut events = Vec::new();
while x != 0 || y != 0 {
let dx = x.clamp(-127, 127);
let dy = y.clamp(-127, 127);
events.push(OneKvmMouseEvent {
event_type: MouseEventType::Move,
x: dx,
y: dy,
button: None,
scroll: 0,
});
x -= dx;
y -= dy;
}
events
}
fn button_id_to_button(button_id: i32) -> Option<MouseButton> {
match button_id {
mouse_button::LEFT => Some(MouseButton::Left),
@@ -611,6 +627,17 @@ mod tests {
assert_eq!(events[0].y, 8);
}
#[test]
fn test_large_relative_move_is_split_without_losing_delta() {
let events = convert_relative_mouse_delta(300, -260);
assert_eq!(events.len(), 3);
assert!(events
.iter()
.all(|event| event.x.abs() <= 127 && event.y.abs() <= 127));
assert_eq!(events.iter().map(|event| event.x).sum::<i32>(), 300);
assert_eq!(events.iter().map(|event| event.y).sum::<i32>(), -260);
}
#[test]
fn test_convert_key_event() {
use protobuf::EnumOrUnknown;