From a85f775b3af25dfb149bad141cc6576dceb19b15 Mon Sep 17 00:00:00 2001 From: fufesou Date: Wed, 9 Nov 2022 16:22:31 +0800 Subject: [PATCH 1/2] simplier mouse control Signed-off-by: fufesou --- src/server/input_service.rs | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/server/input_service.rs b/src/server/input_service.rs index 9b43c5850..c8b099b6d 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -39,10 +39,12 @@ impl super::service::Reset for StatePos { } } -#[derive(Default)] +#[derive(Default, Clone, Copy)] struct Input { conn: i32, time: i64, + x: i32, + y: i32, } const KEY_CHAR_START: u64 = 9999; @@ -181,7 +183,6 @@ lazy_static::lazy_static! { }; static ref KEYS_DOWN: Arc>> = Default::default(); static ref LATEST_INPUT_CURSOR: Arc> = Default::default(); - static ref LATEST_INPUT_CURSOR_POS: Arc>> = Default::default(); static ref LATEST_CURSOR_POS: Arc> = Arc::new(Mutex::new((Instant::now().sub(MOUSE_MOVE_PROTECTION_TIMEOUT), (0, 0)))); } static EXITING: AtomicBool = AtomicBool::new(false); @@ -373,17 +374,23 @@ fn fix_modifiers(modifiers: &[EnumOrUnknown], en: &mut Enigo, ck: i3 } fn is_mouse_active_by_conn(conn: i32) -> bool { + // out of time protection if LATEST_CURSOR_POS.lock().unwrap().0.elapsed() > MOUSE_MOVE_PROTECTION_TIMEOUT { return true; } - match LATEST_INPUT_CURSOR_POS.lock().unwrap().get(&conn) { - Some((x, y)) => match crate::get_cursor_pos() { - Some((x2, y2)) => { - (x - x2).abs() < MOUSE_ACTIVE_DISTANCE && (y - y2).abs() < MOUSE_ACTIVE_DISTANCE - } - None => true, - }, + let last_input = *LATEST_INPUT_CURSOR.lock().unwrap(); + // last conn input may be protected + if last_input.conn != conn { + return false; + } + + // check if input is in valid range + match crate::get_cursor_pos() { + Some((x, y)) => { + (last_input.x - x).abs() < MOUSE_ACTIVE_DISTANCE + && (last_input.y - y).abs() < MOUSE_ACTIVE_DISTANCE + } None => true, } } @@ -403,12 +410,12 @@ fn handle_mouse_(evt: &MouseEvent, conn: i32) { let evt_type = evt.mask & 0x7; if evt_type == 0 { let time = get_time(); - *LATEST_INPUT_CURSOR.lock().unwrap() = Input { time, conn }; - - LATEST_INPUT_CURSOR_POS - .lock() - .unwrap() - .insert(conn, (evt.x, evt.y)); + *LATEST_INPUT_CURSOR.lock().unwrap() = Input { + time, + conn, + x: evt.x, + y: evt.y, + }; } let mut en = ENIGO.lock().unwrap(); #[cfg(not(target_os = "macos"))] From 5424881d40a6de5e94ac3d50ccd2a978fce91e05 Mon Sep 17 00:00:00 2001 From: fufesou Date: Wed, 9 Nov 2022 16:35:08 +0800 Subject: [PATCH 2/2] better mouse control Signed-off-by: fufesou --- src/server/input_service.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/server/input_service.rs b/src/server/input_service.rs index c8b099b6d..170d672c9 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -379,7 +379,7 @@ fn is_mouse_active_by_conn(conn: i32) -> bool { return true; } - let last_input = *LATEST_INPUT_CURSOR.lock().unwrap(); + let mut last_input = LATEST_INPUT_CURSOR.lock().unwrap(); // last conn input may be protected if last_input.conn != conn { return false; @@ -388,8 +388,13 @@ fn is_mouse_active_by_conn(conn: i32) -> bool { // check if input is in valid range match crate::get_cursor_pos() { Some((x, y)) => { - (last_input.x - x).abs() < MOUSE_ACTIVE_DISTANCE - && (last_input.y - y).abs() < MOUSE_ACTIVE_DISTANCE + let is_same_input = (last_input.x - x).abs() < MOUSE_ACTIVE_DISTANCE + && (last_input.y - y).abs() < MOUSE_ACTIVE_DISTANCE; + if !is_same_input { + last_input.x = -MOUSE_ACTIVE_DISTANCE * 2; + last_input.y = -MOUSE_ACTIVE_DISTANCE * 2; + } + is_same_input } None => true, }