From 21b84596e7c372eeeedcf41a32c6c25379cd8f0e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF=E3=83=BC=E3=83=9A?=
 =?UTF-8?q?=E3=83=BC=E3=83=91=E3=83=BC?=
 <76888457+filterpaper@users.noreply.github.com>
Date: Mon, 19 Aug 2024 10:18:28 +0800
Subject: [PATCH] Enhance overlapping mouse keys control (#23341)

Enhance the overlapping mouse key press acceleration (introduced in #21494) with user preprocessor controls.
---
 docs/features/mouse_keys.md | 13 +++++++++++++
 quantum/mousekey.c          | 10 +++++-----
 quantum/mousekey.h          | 10 ++++++++++
 3 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/docs/features/mouse_keys.md b/docs/features/mouse_keys.md
index 4cc06c992ae..d755084f8e6 100644
--- a/docs/features/mouse_keys.md
+++ b/docs/features/mouse_keys.md
@@ -203,6 +203,19 @@ Tips:
 * Keep `MOUSEKEY_MOVE_DELTA` at 1.  This allows precise movements before the gliding effect starts.
 * Mouse wheel options are the same as the default accelerated mode, and do not use inertia.
 
+### Overlapping mouse key control
+
+When additional overlapping mouse key is pressed, the mouse cursor will continue in a new direction with the same acceleration. The following settings can be used to reset the acceleration with new overlapping keys for more precise control if desired:
+
+|Define                        |Default               |Description                                                            |
+|------------------------------|----------------------|-----------------------------------------------------------------------|
+|`MOUSEKEY_OVERLAP_RESET`      |undefined             |Enables overlapping mouse key control                                  |
+|`MOUSEKEY_OVERLAP_MOVE_DELTA` |`MOUSEKEY_MOVE_DELTA` |Step size of reset movement acceleration                               |
+|`MOUSEKEY_OVERLAP_WHEEL_DELTA`|`MOUSEKEY_WHEEL_DELTA`|Step size of reset mouse wheel acceleration                            |
+|`MOUSEKEY_OVERLAP_INTERVAL`   |`MOUSEKEY_INTERVAL`   |Reset time between cursor movements in milliseconds (Kinetic mode only)|
+
+?> This feature will not be applied on Inertial mode
+
 ## Use with PS/2 Mouse and Pointing Device
 
 Mouse keys button state is shared with [PS/2 mouse](ps2_mouse) and [pointing device](pointing_device) so mouse keys button presses can be used for clicks and drags.
diff --git a/quantum/mousekey.c b/quantum/mousekey.c
index 8683cfdffac..9649943a0d4 100644
--- a/quantum/mousekey.c
+++ b/quantum/mousekey.c
@@ -391,18 +391,18 @@ void mousekey_on(uint8_t code) {
     }
 #    endif
 
-#    ifndef MOUSEKEY_INERTIA
+#    if defined(MOUSEKEY_OVERLAP_RESET) && !defined(MOUSEKEY_INERTIA)
     // If mouse report is not zero, the current mousekey press is overlapping
     // with another. Restart acceleration for smoother directional transition.
     if (mouse_report.x || mouse_report.y || mouse_report.h || mouse_report.v) {
 #        ifdef MK_KINETIC_SPEED
-        mouse_timer = timer_read() - (MOUSEKEY_INTERVAL << 2);
+        mouse_timer = timer_read() - MOUSEKEY_OVERLAP_INTERVAL;
 #        else
-        mousekey_repeat       = MOUSEKEY_MOVE_DELTA;
-        mousekey_wheel_repeat = MOUSEKEY_WHEEL_DELTA;
+        mousekey_repeat       = MOUSEKEY_OVERLAP_MOVE_DELTA;
+        mousekey_wheel_repeat = MOUSEKEY_OVERLAP_WHEEL_DELTA;
 #        endif
     }
-#    endif // ifndef MOUSEKEY_INERTIA
+#    endif // defined(MOUSEKEY_OVERLAP_RESET) && !defined(MOUSEKEY_INERTIA)
 
 #    ifdef MOUSEKEY_INERTIA
 
diff --git a/quantum/mousekey.h b/quantum/mousekey.h
index 73380b743a7..e7a790b9a97 100644
--- a/quantum/mousekey.h
+++ b/quantum/mousekey.h
@@ -174,6 +174,16 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #endif /* #ifndef MK_3_SPEED */
 
+#ifndef MOUSEKEY_OVERLAP_MOVE_DELTA
+#    define MOUSEKEY_OVERLAP_MOVE_DELTA MOUSEKEY_MOVE_DELTA
+#endif
+#ifndef MOUSEKEY_OVERLAP_WHEEL_DELTA
+#    define MOUSEKEY_OVERLAP_WHEEL_DELTA MOUSEKEY_WHEEL_DELTA
+#endif
+#ifndef MOUSEKEY_OVERLAP_INTERVAL
+#    define MOUSEKEY_OVERLAP_INTERVAL MOUSEKEY_INTERVAL
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif