From 3d768098f8e0e1abc7388cd65e4172d222529348 Mon Sep 17 00:00:00 2001 From: fufesou Date: Fri, 11 Nov 2022 14:28:35 +0800 Subject: [PATCH] fix mouse cannot be controled, when show remote cursor is on Signed-off-by: fufesou --- src/server/input_service.rs | 57 ++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/src/server/input_service.rs b/src/server/input_service.rs index 44ccece8e..b47872c34 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -13,6 +13,8 @@ use std::{ time::Instant, }; +const INVALID_CURSOR_POS: i32 = i32::MIN; + #[derive(Default)] struct StateCursor { hcursor: u64, @@ -28,14 +30,27 @@ impl super::service::Reset for StateCursor { } } -#[derive(Default)] struct StatePos { cursor_pos: (i32, i32), } +impl Default for StatePos { + fn default() -> Self { + Self { + cursor_pos: (INVALID_CURSOR_POS, INVALID_CURSOR_POS), + } + } +} + impl super::service::Reset for StatePos { fn reset(&mut self) { - self.cursor_pos = (0, 0); + self.cursor_pos = (INVALID_CURSOR_POS, INVALID_CURSOR_POS); + } +} + +impl StatePos { + fn is_valid(&self) -> bool { + self.cursor_pos.0 != INVALID_CURSOR_POS && self.cursor_pos.1 != INVALID_CURSOR_POS } } @@ -114,25 +129,27 @@ fn update_last_cursor_pos(x: i32, y: i32) { fn run_pos(sp: GenericService, state: &mut StatePos) -> ResultType<()> { if let Some((x, y)) = crate::get_cursor_pos() { update_last_cursor_pos(x, y); - if state.cursor_pos.0 != x || state.cursor_pos.1 != y { - state.cursor_pos = (x, y); - let mut msg_out = Message::new(); - msg_out.set_cursor_position(CursorPosition { - x, - y, - ..Default::default() - }); - let exclude = { - let now = get_time(); - let lock = LATEST_INPUT_CURSOR.lock().unwrap(); - if now - lock.time < 300 { - lock.conn - } else { - 0 - } - }; - sp.send_without(msg_out, exclude); + if state.is_valid() { + if state.cursor_pos.0 != x || state.cursor_pos.1 != y { + let mut msg_out = Message::new(); + msg_out.set_cursor_position(CursorPosition { + x, + y, + ..Default::default() + }); + let exclude = { + let now = get_time(); + let lock = LATEST_INPUT_CURSOR.lock().unwrap(); + if now - lock.time < 300 { + lock.conn + } else { + 0 + } + }; + sp.send_without(msg_out, exclude); + } } + state.cursor_pos = (x, y); } sp.snapshot(|sps| {