mirror of
https://github.com/firewalkwithm3/qmk_firmware.git
synced 2024-11-22 19:40:29 +08:00
Add ability to toggle One Shot functionality (#4198)
Co-authored-by: Nick Brassel <nick@tzarc.org> Co-authored-by: Ryan <fauxpark@gmail.com>
This commit is contained in:
parent
86f6f68274
commit
0e984b6e7e
|
@ -516,6 +516,9 @@ See also: [One Shot Keys](one_shot_keys.md)
|
||||||
|------------|----------------------------------|
|
|------------|----------------------------------|
|
||||||
|`OSM(mod)` |Hold `mod` for one keypress |
|
|`OSM(mod)` |Hold `mod` for one keypress |
|
||||||
|`OSL(layer)`|Switch to `layer` for one keypress|
|
|`OSL(layer)`|Switch to `layer` for one keypress|
|
||||||
|
|`OS_ON` |Turns One Shot keys on |
|
||||||
|
|`OS_OFF` |Turns One Shot keys off |
|
||||||
|
|`OS_TOGG` |Toggles One Shot keys status |
|
||||||
|
|
||||||
## Space Cadet :id=space-cadet
|
## Space Cadet :id=space-cadet
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,9 @@ You can control the behavior of one shot keys by defining these in `config.h`:
|
||||||
|
|
||||||
* `OSM(mod)` - Momentarily hold down *mod*. You must use the `MOD_*` keycodes as shown in [Mod Tap](mod_tap.md), not the `KC_*` codes.
|
* `OSM(mod)` - Momentarily hold down *mod*. You must use the `MOD_*` keycodes as shown in [Mod Tap](mod_tap.md), not the `KC_*` codes.
|
||||||
* `OSL(layer)` - momentary switch to *layer*.
|
* `OSL(layer)` - momentary switch to *layer*.
|
||||||
|
* `OS_ON` - Turns on One Shot keys.
|
||||||
|
* `OS_OFF` - Turns off One Shot keys. OSM act as regular mod keys, OSL act like `MO`.
|
||||||
|
* `ON_TOGG` - Toggles the one shot key status.
|
||||||
|
|
||||||
Sometimes, you want to activate a one-shot key as part of a macro or tap dance routine.
|
Sometimes, you want to activate a one-shot key as part of a macro or tap dance routine.
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ typedef union {
|
||||||
bool nkro : 1;
|
bool nkro : 1;
|
||||||
bool swap_lctl_lgui : 1;
|
bool swap_lctl_lgui : 1;
|
||||||
bool swap_rctl_rgui : 1;
|
bool swap_rctl_rgui : 1;
|
||||||
|
bool oneshot_disable : 1;
|
||||||
};
|
};
|
||||||
} keymap_config_t;
|
} keymap_config_t;
|
||||||
|
|
||||||
|
|
|
@ -318,6 +318,17 @@ bool process_record_quantum(keyrecord_t *record) {
|
||||||
case OUT_BT:
|
case OUT_BT:
|
||||||
set_output(OUTPUT_BLUETOOTH);
|
set_output(OUTPUT_BLUETOOTH);
|
||||||
return false;
|
return false;
|
||||||
|
#endif
|
||||||
|
#ifndef NO_ACTION_ONESHOT
|
||||||
|
case ONESHOT_TOGGLE:
|
||||||
|
oneshot_toggle();
|
||||||
|
break;
|
||||||
|
case ONESHOT_ENABLE:
|
||||||
|
oneshot_enable();
|
||||||
|
break;
|
||||||
|
case ONESHOT_DISABLE:
|
||||||
|
oneshot_disable();
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -578,6 +578,10 @@ enum quantum_keycodes {
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
ONESHOT_ENABLE,
|
||||||
|
ONESHOT_DISABLE,
|
||||||
|
ONESHOT_TOGGLE,
|
||||||
|
|
||||||
// always leave at the end
|
// always leave at the end
|
||||||
SAFE_RANGE
|
SAFE_RANGE
|
||||||
};
|
};
|
||||||
|
@ -885,3 +889,8 @@ enum quantum_keycodes {
|
||||||
#define DM_RSTP DYN_REC_STOP
|
#define DM_RSTP DYN_REC_STOP
|
||||||
#define DM_PLY1 DYN_MACRO_PLAY1
|
#define DM_PLY1 DYN_MACRO_PLAY1
|
||||||
#define DM_PLY2 DYN_MACRO_PLAY2
|
#define DM_PLY2 DYN_MACRO_PLAY2
|
||||||
|
|
||||||
|
// One Shot toggle
|
||||||
|
#define OS_TOGG ONESHOT_TOGGLE
|
||||||
|
#define OS_ON ONESHOT_ENABLE
|
||||||
|
#define OS_OFF ONESHOT_DISABLE
|
||||||
|
|
|
@ -147,12 +147,16 @@ void clear_oneshot_swaphands(void) {
|
||||||
* FIXME: needs doc
|
* FIXME: needs doc
|
||||||
*/
|
*/
|
||||||
void set_oneshot_layer(uint8_t layer, uint8_t state) {
|
void set_oneshot_layer(uint8_t layer, uint8_t state) {
|
||||||
oneshot_layer_data = layer << 3 | state;
|
if (!keymap_config.oneshot_disable) {
|
||||||
layer_on(layer);
|
oneshot_layer_data = layer << 3 | state;
|
||||||
|
layer_on(layer);
|
||||||
# if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
|
# if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
|
||||||
oneshot_layer_time = timer_read();
|
oneshot_layer_time = timer_read();
|
||||||
# endif
|
# endif
|
||||||
oneshot_layer_changed_kb(get_oneshot_layer());
|
oneshot_layer_changed_kb(get_oneshot_layer());
|
||||||
|
} else {
|
||||||
|
layer_on(layer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/** \brief Reset oneshot layer
|
/** \brief Reset oneshot layer
|
||||||
*
|
*
|
||||||
|
@ -172,7 +176,7 @@ void reset_oneshot_layer(void) {
|
||||||
void clear_oneshot_layer_state(oneshot_fullfillment_t state) {
|
void clear_oneshot_layer_state(oneshot_fullfillment_t state) {
|
||||||
uint8_t start_state = oneshot_layer_data;
|
uint8_t start_state = oneshot_layer_data;
|
||||||
oneshot_layer_data &= ~state;
|
oneshot_layer_data &= ~state;
|
||||||
if (!get_oneshot_layer_state() && start_state != oneshot_layer_data) {
|
if ((!get_oneshot_layer_state() && start_state != oneshot_layer_data) || keymap_config.oneshot_disable) {
|
||||||
layer_off(get_oneshot_layer());
|
layer_off(get_oneshot_layer());
|
||||||
reset_oneshot_layer();
|
reset_oneshot_layer();
|
||||||
}
|
}
|
||||||
|
@ -182,6 +186,39 @@ void clear_oneshot_layer_state(oneshot_fullfillment_t state) {
|
||||||
* FIXME: needs doc
|
* FIXME: needs doc
|
||||||
*/
|
*/
|
||||||
bool is_oneshot_layer_active(void) { return get_oneshot_layer_state(); }
|
bool is_oneshot_layer_active(void) { return get_oneshot_layer_state(); }
|
||||||
|
|
||||||
|
/** \brief set oneshot
|
||||||
|
*
|
||||||
|
* FIXME: needs doc
|
||||||
|
*/
|
||||||
|
void oneshot_set(bool active) {
|
||||||
|
if (keymap_config.oneshot_disable != active) {
|
||||||
|
keymap_config.oneshot_disable = active;
|
||||||
|
eeconfig_update_keymap(keymap_config.raw);
|
||||||
|
dprintf("Oneshot: active: %d\n", active);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief toggle oneshot
|
||||||
|
*
|
||||||
|
* FIXME: needs doc
|
||||||
|
*/
|
||||||
|
void oneshot_toggle(void) { oneshot_set(!keymap_config.oneshot_disable); }
|
||||||
|
|
||||||
|
/** \brief enable oneshot
|
||||||
|
*
|
||||||
|
* FIXME: needs doc
|
||||||
|
*/
|
||||||
|
void oneshot_enable(void) { oneshot_set(true); }
|
||||||
|
|
||||||
|
/** \brief disable oneshot
|
||||||
|
*
|
||||||
|
* FIXME: needs doc
|
||||||
|
*/
|
||||||
|
void oneshot_disable(void) { oneshot_set(false); }
|
||||||
|
|
||||||
|
bool is_oneshot_enabled(void) { return keymap_config.oneshot_disable; }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** \brief Send keyboard report
|
/** \brief Send keyboard report
|
||||||
|
@ -321,14 +358,17 @@ void del_oneshot_mods(uint8_t mods) {
|
||||||
* FIXME: needs doc
|
* FIXME: needs doc
|
||||||
*/
|
*/
|
||||||
void set_oneshot_mods(uint8_t mods) {
|
void set_oneshot_mods(uint8_t mods) {
|
||||||
if (oneshot_mods != mods) {
|
if (!keymap_config.oneshot_disable) {
|
||||||
|
if (oneshot_mods != mods) {
|
||||||
# if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
|
# if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
|
||||||
oneshot_time = timer_read();
|
oneshot_time = timer_read();
|
||||||
# endif
|
# endif
|
||||||
oneshot_mods = mods;
|
oneshot_mods = mods;
|
||||||
oneshot_mods_changed_kb(mods);
|
oneshot_mods_changed_kb(mods);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \brief clear oneshot mods
|
/** \brief clear oneshot mods
|
||||||
*
|
*
|
||||||
* FIXME: needs doc
|
* FIXME: needs doc
|
||||||
|
|
|
@ -85,6 +85,11 @@ void oneshot_mods_changed_kb(uint8_t mods);
|
||||||
void oneshot_layer_changed_user(uint8_t layer);
|
void oneshot_layer_changed_user(uint8_t layer);
|
||||||
void oneshot_layer_changed_kb(uint8_t layer);
|
void oneshot_layer_changed_kb(uint8_t layer);
|
||||||
|
|
||||||
|
void oneshot_toggle(void);
|
||||||
|
void oneshot_enable(void);
|
||||||
|
void oneshot_disable(void);
|
||||||
|
bool is_oneshot_enabled(void);
|
||||||
|
|
||||||
/* inspect */
|
/* inspect */
|
||||||
uint8_t has_anymod(void);
|
uint8_t has_anymod(void);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue