From a85f775b3af25dfb149bad141cc6576dceb19b15 Mon Sep 17 00:00:00 2001
From: fufesou <shuanglongchen@yeah.net>
Date: Wed, 9 Nov 2022 16:22:31 +0800
Subject: [PATCH] simplier mouse control

Signed-off-by: fufesou <shuanglongchen@yeah.net>
---
 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<Mutex<HashMap<u64, Instant>>> = Default::default();
     static ref LATEST_INPUT_CURSOR: Arc<Mutex<Input>> = Default::default();
-    static ref LATEST_INPUT_CURSOR_POS: Arc<Mutex<HashMap<i32, (i32, i32)>>> = Default::default();
     static ref LATEST_CURSOR_POS: Arc<Mutex<(Instant, (i32, i32))>> = 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<ControlKey>], 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"))]