summary refs log tree commit diff
diff options
context:
space:
mode:
authorDrashna Jaelre <drashna@drashna.net>2023-05-06 06:38:45 -0700
committerGitHub <noreply@github.com>2023-05-06 06:38:45 -0700
commit59eb8940b028bfa2a215231719b8eeca57701ed1 (patch)
tree45f67dd68176d760df43baf340c822f5b17ed8f3
parent578102b40056693de8a92b49cd0c48e51ff4ad4a (diff)
Make Pointing Device Auto Layer more configurable (#20061)
Co-authored-by: Pablo Martínez <58857054+elpekenin@users.noreply.github.com>
-rw-r--r--docs/feature_pointing_device.md4
-rw-r--r--quantum/pointing_device/pointing_device_auto_mouse.c50
-rw-r--r--quantum/pointing_device/pointing_device_auto_mouse.h10
3 files changed, 59 insertions, 5 deletions
diff --git a/docs/feature_pointing_device.md b/docs/feature_pointing_device.md
index e5a268e47b..909eff826d 100644
--- a/docs/feature_pointing_device.md
+++ b/docs/feature_pointing_device.md
@@ -689,6 +689,10 @@ There are several functions that allow for more advanced interaction with the au
 | `auto_mouse_layer_off(void)`                               | Disable target layer if appropriate will call (makes call to `layer_state_set`)      |                           |   `void`(None)  |
 | `auto_mouse_toggle(void)`                                  | Toggle on/off target toggle state (disables layer deactivation when true)            |                           |    `void`(None) |
 | `get_auto_mouse_toggle(void)`                              | Return value of toggling state variable                                              |                           |          `bool` |
+| `set_auto_mouse_timeout(uint16_t timeout)`                 | Change/set the timeout for turing off the layer                                      |                           |    `void`(None) |
+| `get_auto_mouse_timeout(void)`                             | Return the current timeout for turing off the layer                                  |                           |      `uint16_t` |
+| `set_auto_mouse_debounce(uint16_t timeout)`                | Change/set the debounce for preventing layer activation                              |                           |    `void`(None) |
+| `get_auto_mouse_debounce(void)`                            | Return the current debounce for preventing layer activation                          |                           |       `uint8_t` |
 
 _NOTES:_   
     - _Due to the nature of how some functions work, the `auto_mouse_trigger_reset`, and `auto_mouse_layer_off` functions should never be called in the `layer_state_set_*` stack as this can cause indefinite loops._   
diff --git a/quantum/pointing_device/pointing_device_auto_mouse.c b/quantum/pointing_device/pointing_device_auto_mouse.c
index 5e78817c7c..b008d18db5 100644
--- a/quantum/pointing_device/pointing_device_auto_mouse.c
+++ b/quantum/pointing_device/pointing_device_auto_mouse.c
@@ -20,7 +20,11 @@
 #    include "pointing_device_auto_mouse.h"
 
 /* local data structure for tracking auto mouse */
-static auto_mouse_context_t auto_mouse_context = {.config.layer = (uint8_t)AUTO_MOUSE_DEFAULT_LAYER};
+static auto_mouse_context_t auto_mouse_context = {
+    .config.layer    = (uint8_t)(AUTO_MOUSE_DEFAULT_LAYER),
+    .config.timeout  = (uint16_t)(AUTO_MOUSE_TIME),
+    .config.debounce = (uint8_t)(AUTO_MOUSE_DEBOUNCE),
+};
 
 /* local functions */
 static bool is_mouse_record(uint16_t keycode, keyrecord_t* record);
@@ -63,6 +67,24 @@ uint8_t get_auto_mouse_layer(void) {
 }
 
 /**
+ * @brief Get the current timeout to turn off mouse layer
+ *
+ * @return uint16_t timeout in ms
+ */
+uint16_t get_auto_mouse_timeout(void) {
+    return auto_mouse_context.config.timeout;
+}
+
+/**
+ * @brief Get the auto mouse debouncing timeout
+ *
+ * @return uint8_t
+ */
+uint8_t get_auto_mouse_debounce(void) {
+    return auto_mouse_context.config.debounce;
+}
+
+/**
  * @brief get layer_toggled value
  *
  * @return bool of current layer_toggled state
@@ -115,6 +137,28 @@ void set_auto_mouse_layer(uint8_t layer) {
 }
 
 /**
+ * @brief Changes the timeout for the mouse auto layer to be disabled
+ *
+ * @param timeout
+ */
+void set_auto_mouse_timeout(uint16_t timeout) {
+    if (auto_mouse_context.config.timeout == timeout) return;
+    auto_mouse_context.config.timeout = timeout;
+    auto_mouse_reset();
+}
+
+/**
+ * @brief Set the auto mouse key debounce
+ *
+ * @param debounce
+ */
+void set_auto_mouse_debounce(uint8_t debounce) {
+    if (auto_mouse_context.config.debounce == debounce) return;
+    auto_mouse_context.config.debounce = debounce;
+    auto_mouse_reset();
+}
+
+/**
  * @brief toggle mouse layer setting
  *
  * Change state of local layer_toggled bool meant to track when the mouse layer is toggled on by other means
@@ -181,7 +225,7 @@ __attribute__((weak)) bool auto_mouse_activation(report_mouse_t mouse_report) {
  */
 void pointing_device_task_auto_mouse(report_mouse_t mouse_report) {
     // skip if disabled, delay timer running, or debounce
-    if (!(AUTO_MOUSE_ENABLED) || timer_elapsed(auto_mouse_context.timer.active) <= AUTO_MOUSE_DEBOUNCE || timer_elapsed(auto_mouse_context.timer.delay) <= AUTO_MOUSE_DELAY) {
+    if (!(AUTO_MOUSE_ENABLED) || timer_elapsed(auto_mouse_context.timer.active) <= auto_mouse_context.config.debounce || timer_elapsed(auto_mouse_context.timer.delay) <= AUTO_MOUSE_DELAY) {
         return;
     }
     // update activation and reset debounce
@@ -192,7 +236,7 @@ void pointing_device_task_auto_mouse(report_mouse_t mouse_report) {
         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_TIME) {
+    } 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;
     }
diff --git a/quantum/pointing_device/pointing_device_auto_mouse.h b/quantum/pointing_device/pointing_device_auto_mouse.h
index 0f26af79e6..7db63bc6b8 100644
--- a/quantum/pointing_device/pointing_device_auto_mouse.h
+++ b/quantum/pointing_device/pointing_device_auto_mouse.h
@@ -43,8 +43,10 @@
 /* data structure */
 typedef struct {
     struct {
-        bool    is_enabled;
-        uint8_t layer;
+        bool     is_enabled;
+        uint8_t  layer;
+        uint16_t timeout;
+        uint8_t  debounce;
     } config;
     struct {
         uint16_t active;
@@ -62,6 +64,10 @@ void          set_auto_mouse_enable(bool enable);                       // enabl
 bool          get_auto_mouse_enable(void);                              // get auto_mouse_enable
 void          set_auto_mouse_layer(uint8_t layer);                      // set target layer by index
 uint8_t       get_auto_mouse_layer(void);                               // get target layer index
+void          set_auto_mouse_timeout(uint16_t timeout);                 // set layer timeout
+uint16_t      get_auto_mouse_timeout(void);                             // get layer timeout
+void          set_auto_mouse_debounce(uint8_t debounce);                // set debounce
+uint8_t       get_auto_mouse_debounce(void);                            // get debounce
 void          auto_mouse_layer_off(void);                               // disable target layer if appropriate (DO NOT USE in layer_state_set stack!!)
 layer_state_t remove_auto_mouse_layer(layer_state_t state, bool force); // remove auto mouse target layer from state if appropriate (can be forced)