diff options
| author | Drashna Jaelre <drashna@live.com> | 2021-03-01 08:57:02 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-01 08:57:02 -0800 |
| commit | 0e984b6e7e216a62df0b5d53f6a8f0d4bc13dca3 (patch) | |
| tree | 1e85b1d15a9ea6ad86fcb6ae8d084f926dd11ab8 /tmk_core | |
| parent | 86f6f682744b81bba1003e555f902af78dcdaad4 (diff) | |
| download | qmk_firmware-0e984b6e7e216a62df0b5d53f6a8f0d4bc13dca3.tar.gz qmk_firmware-0e984b6e7e216a62df0b5d53f6a8f0d4bc13dca3.zip | |
Add ability to toggle One Shot functionality (#4198)
Co-authored-by: Nick Brassel <nick@tzarc.org>
Co-authored-by: Ryan <fauxpark@gmail.com>
Diffstat (limited to 'tmk_core')
| -rw-r--r-- | tmk_core/common/action_util.c | 58 | ||||
| -rw-r--r-- | tmk_core/common/action_util.h | 5 |
2 files changed, 54 insertions, 9 deletions
diff --git a/tmk_core/common/action_util.c b/tmk_core/common/action_util.c index 000503b08..a57c8bf66 100644 --- a/tmk_core/common/action_util.c +++ b/tmk_core/common/action_util.c | |||
| @@ -147,12 +147,16 @@ void clear_oneshot_swaphands(void) { | |||
| 147 | * FIXME: needs doc | 147 | * FIXME: needs doc |
| 148 | */ | 148 | */ |
| 149 | void set_oneshot_layer(uint8_t layer, uint8_t state) { | 149 | void set_oneshot_layer(uint8_t layer, uint8_t state) { |
| 150 | oneshot_layer_data = layer << 3 | state; | 150 | if (!keymap_config.oneshot_disable) { |
| 151 | layer_on(layer); | 151 | oneshot_layer_data = layer << 3 | state; |
| 152 | layer_on(layer); | ||
| 152 | # if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) | 153 | # if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) |
| 153 | oneshot_layer_time = timer_read(); | 154 | oneshot_layer_time = timer_read(); |
| 154 | # endif | 155 | # endif |
| 155 | oneshot_layer_changed_kb(get_oneshot_layer()); | 156 | oneshot_layer_changed_kb(get_oneshot_layer()); |
| 157 | } else { | ||
| 158 | layer_on(layer); | ||
| 159 | } | ||
| 156 | } | 160 | } |
| 157 | /** \brief Reset oneshot layer | 161 | /** \brief Reset oneshot layer |
| 158 | * | 162 | * |
| @@ -172,7 +176,7 @@ void reset_oneshot_layer(void) { | |||
| 172 | void clear_oneshot_layer_state(oneshot_fullfillment_t state) { | 176 | void clear_oneshot_layer_state(oneshot_fullfillment_t state) { |
| 173 | uint8_t start_state = oneshot_layer_data; | 177 | uint8_t start_state = oneshot_layer_data; |
| 174 | oneshot_layer_data &= ~state; | 178 | oneshot_layer_data &= ~state; |
| 175 | if (!get_oneshot_layer_state() && start_state != oneshot_layer_data) { | 179 | if ((!get_oneshot_layer_state() && start_state != oneshot_layer_data) || keymap_config.oneshot_disable) { |
| 176 | layer_off(get_oneshot_layer()); | 180 | layer_off(get_oneshot_layer()); |
| 177 | reset_oneshot_layer(); | 181 | reset_oneshot_layer(); |
| 178 | } | 182 | } |
| @@ -182,6 +186,39 @@ void clear_oneshot_layer_state(oneshot_fullfillment_t state) { | |||
| 182 | * FIXME: needs doc | 186 | * FIXME: needs doc |
| 183 | */ | 187 | */ |
| 184 | bool is_oneshot_layer_active(void) { return get_oneshot_layer_state(); } | 188 | bool is_oneshot_layer_active(void) { return get_oneshot_layer_state(); } |
| 189 | |||
| 190 | /** \brief set oneshot | ||
| 191 | * | ||
| 192 | * FIXME: needs doc | ||
| 193 | */ | ||
| 194 | void oneshot_set(bool active) { | ||
| 195 | if (keymap_config.oneshot_disable != active) { | ||
| 196 | keymap_config.oneshot_disable = active; | ||
| 197 | eeconfig_update_keymap(keymap_config.raw); | ||
| 198 | dprintf("Oneshot: active: %d\n", active); | ||
| 199 | } | ||
| 200 | } | ||
| 201 | |||
| 202 | /** \brief toggle oneshot | ||
| 203 | * | ||
| 204 | * FIXME: needs doc | ||
| 205 | */ | ||
| 206 | void oneshot_toggle(void) { oneshot_set(!keymap_config.oneshot_disable); } | ||
| 207 | |||
| 208 | /** \brief enable oneshot | ||
| 209 | * | ||
| 210 | * FIXME: needs doc | ||
| 211 | */ | ||
| 212 | void oneshot_enable(void) { oneshot_set(true); } | ||
| 213 | |||
| 214 | /** \brief disable oneshot | ||
| 215 | * | ||
| 216 | * FIXME: needs doc | ||
| 217 | */ | ||
| 218 | void oneshot_disable(void) { oneshot_set(false); } | ||
| 219 | |||
| 220 | bool is_oneshot_enabled(void) { return keymap_config.oneshot_disable; } | ||
| 221 | |||
| 185 | #endif | 222 | #endif |
| 186 | 223 | ||
| 187 | /** \brief Send keyboard report | 224 | /** \brief Send keyboard report |
| @@ -321,14 +358,17 @@ void del_oneshot_mods(uint8_t mods) { | |||
| 321 | * FIXME: needs doc | 358 | * FIXME: needs doc |
| 322 | */ | 359 | */ |
| 323 | void set_oneshot_mods(uint8_t mods) { | 360 | void set_oneshot_mods(uint8_t mods) { |
| 324 | if (oneshot_mods != mods) { | 361 | if (!keymap_config.oneshot_disable) { |
| 362 | if (oneshot_mods != mods) { | ||
| 325 | # if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) | 363 | # if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) |
| 326 | oneshot_time = timer_read(); | 364 | oneshot_time = timer_read(); |
| 327 | # endif | 365 | # endif |
| 328 | oneshot_mods = mods; | 366 | oneshot_mods = mods; |
| 329 | oneshot_mods_changed_kb(mods); | 367 | oneshot_mods_changed_kb(mods); |
| 368 | } | ||
| 330 | } | 369 | } |
| 331 | } | 370 | } |
| 371 | |||
| 332 | /** \brief clear oneshot mods | 372 | /** \brief clear oneshot mods |
| 333 | * | 373 | * |
| 334 | * FIXME: needs doc | 374 | * FIXME: needs doc |
diff --git a/tmk_core/common/action_util.h b/tmk_core/common/action_util.h index ff29f79b0..f2b3897ae 100644 --- a/tmk_core/common/action_util.h +++ b/tmk_core/common/action_util.h | |||
| @@ -85,6 +85,11 @@ void oneshot_mods_changed_kb(uint8_t mods); | |||
| 85 | void oneshot_layer_changed_user(uint8_t layer); | 85 | void oneshot_layer_changed_user(uint8_t layer); |
| 86 | void oneshot_layer_changed_kb(uint8_t layer); | 86 | void oneshot_layer_changed_kb(uint8_t layer); |
| 87 | 87 | ||
| 88 | void oneshot_toggle(void); | ||
| 89 | void oneshot_enable(void); | ||
| 90 | void oneshot_disable(void); | ||
| 91 | bool is_oneshot_enabled(void); | ||
| 92 | |||
| 88 | /* inspect */ | 93 | /* inspect */ |
| 89 | uint8_t has_anymod(void); | 94 | uint8_t has_anymod(void); |
| 90 | 95 | ||
