From ce05dc6fa1ff0d508af1e5e79eeeb6359736df51 Mon Sep 17 00:00:00 2001
From: Marcel Robitaille <marcelrobitaille11@gmail.com>
Date: Tue, 9 Jan 2024 05:16:50 -0500
Subject: [PATCH] Add option for auto mouse movement threshold (#21398)

Fixes #21396
---
 docs/feature_pointing_device.md                   |  1 +
 .../pointing_device/pointing_device_auto_mouse.c  | 15 +++++++++++----
 .../pointing_device/pointing_device_auto_mouse.h  | 10 ++++++++++
 3 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/docs/feature_pointing_device.md b/docs/feature_pointing_device.md
index 6fddf1fddab6..c18eb52aabee 100644
--- a/docs/feature_pointing_device.md
+++ b/docs/feature_pointing_device.md
@@ -728,6 +728,7 @@ There are a few ways to control the auto mouse feature with both `config.h` opti
 | `AUTO_MOUSE_TIME`                   | (Optional) Time layer remains active after activation                 | _ideally_ (250-1000) |     _ms_    |                   `650 ms` |
 | `AUTO_MOUSE_DELAY`                  | (Optional) Lockout time after non-mouse key is pressed                | _ideally_ (100-1000) |     _ms_    | `TAPPING_TERM` or `200 ms` |
 | `AUTO_MOUSE_DEBOUNCE`               | (Optional) Time delay from last activation to next update             | _ideally_ (10 - 100) |     _ms_    |                    `25 ms` |
+| `AUTO_MOUSE_THRESHOLD`              | (Optional) Amount of mouse movement required to switch layers         | 0 -                  |   _units_   |                 `10 units` |
 
 ### Adding mouse keys
 
diff --git a/quantum/pointing_device/pointing_device_auto_mouse.c b/quantum/pointing_device/pointing_device_auto_mouse.c
index 3135b9e531bf..1b11fffedb77 100644
--- a/quantum/pointing_device/pointing_device_auto_mouse.c
+++ b/quantum/pointing_device/pointing_device_auto_mouse.c
@@ -17,6 +17,7 @@
 
 #ifdef POINTING_DEVICE_AUTO_MOUSE_ENABLE
 
+#    include <stdlib.h>
 #    include <string.h>
 #    include "pointing_device_auto_mouse.h"
 #    include "debug.h"
@@ -217,7 +218,11 @@ void auto_mouse_layer_off(void) {
  * @return bool of pointing_device activation
  */
 __attribute__((weak)) bool auto_mouse_activation(report_mouse_t mouse_report) {
-    return mouse_report.x != 0 || mouse_report.y != 0 || mouse_report.h != 0 || mouse_report.v != 0 || mouse_report.buttons;
+    auto_mouse_context.total_mouse_movement.x += mouse_report.x;
+    auto_mouse_context.total_mouse_movement.y += mouse_report.y;
+    auto_mouse_context.total_mouse_movement.h += mouse_report.h;
+    auto_mouse_context.total_mouse_movement.v += mouse_report.v;
+    return abs(auto_mouse_context.total_mouse_movement.x) > AUTO_MOUSE_THRESHOLD || abs(auto_mouse_context.total_mouse_movement.y) > AUTO_MOUSE_THRESHOLD || abs(auto_mouse_context.total_mouse_movement.h) > AUTO_MOUSE_THRESHOLD || abs(auto_mouse_context.total_mouse_movement.v) > AUTO_MOUSE_THRESHOLD || mouse_report.buttons;
 }
 
 /**
@@ -235,14 +240,16 @@ void pointing_device_task_auto_mouse(report_mouse_t mouse_report) {
     // update activation and reset debounce
     auto_mouse_context.status.is_activated = auto_mouse_activation(mouse_report);
     if (is_auto_mouse_active()) {
-        auto_mouse_context.timer.active = timer_read();
-        auto_mouse_context.timer.delay  = 0;
+        auto_mouse_context.total_mouse_movement = (total_mouse_movement_t){.x = 0, .y = 0, .h = 0, .v = 0};
+        auto_mouse_context.timer.active         = timer_read();
+        auto_mouse_context.timer.delay          = 0;
         if (!layer_state_is((AUTO_MOUSE_TARGET_LAYER))) {
             layer_on((AUTO_MOUSE_TARGET_LAYER));
         }
     } else if (layer_state_is((AUTO_MOUSE_TARGET_LAYER)) && timer_elapsed(auto_mouse_context.timer.active) > auto_mouse_context.config.timeout) {
         layer_off((AUTO_MOUSE_TARGET_LAYER));
-        auto_mouse_context.timer.active = 0;
+        auto_mouse_context.timer.active         = 0;
+        auto_mouse_context.total_mouse_movement = (total_mouse_movement_t){.x = 0, .y = 0, .h = 0, .v = 0};
     }
 }
 
diff --git a/quantum/pointing_device/pointing_device_auto_mouse.h b/quantum/pointing_device/pointing_device_auto_mouse.h
index 1343855e0017..904f18b68e27 100644
--- a/quantum/pointing_device/pointing_device_auto_mouse.h
+++ b/quantum/pointing_device/pointing_device_auto_mouse.h
@@ -42,8 +42,17 @@
 #ifndef AUTO_MOUSE_DEBOUNCE
 #    define AUTO_MOUSE_DEBOUNCE 25
 #endif
+#ifndef AUTO_MOUSE_THRESHOLD
+#    define AUTO_MOUSE_THRESHOLD 10
+#endif
 
 /* data structure */
+typedef struct {
+    mouse_xy_report_t x;
+    mouse_xy_report_t y;
+    int8_t            v;
+    int8_t            h;
+} total_mouse_movement_t;
 typedef struct {
     struct {
         bool     is_enabled;
@@ -60,6 +69,7 @@ typedef struct {
         bool   is_toggled;
         int8_t mouse_key_tracker;
     } status;
+    total_mouse_movement_t total_mouse_movement;
 } auto_mouse_context_t;
 
 /* ----------Set up and control------------------------------------------------------------------------------ */