~ruther/qmk_firmware

59eb8940b028bfa2a215231719b8eeca57701ed1 — Drashna Jaelre 2 years ago 578102b
Make Pointing Device Auto Layer more configurable (#20061)

Co-authored-by: Pablo Martínez <58857054+elpekenin@users.noreply.github.com>
M docs/feature_pointing_device.md => docs/feature_pointing_device.md +4 -0
@@ 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._   

M quantum/pointing_device/pointing_device_auto_mouse.c => quantum/pointing_device/pointing_device_auto_mouse.c +47 -3
@@ 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;
    }

M quantum/pointing_device/pointing_device_auto_mouse.h => quantum/pointing_device/pointing_device_auto_mouse.h +8 -2
@@ 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)