Allow Combo feature to be enabled/disabled live (#6318)
* Add ability to enable/disable combos * Update documentation for Combo feature * Change keycodes for appeasement * Simplify combo_toggle function * Update names * Update combo docs to use tables
This commit is contained in:
parent
5fa0a274ea
commit
c44fc68297
4 changed files with 73 additions and 10 deletions
|
@ -59,19 +59,12 @@ void process_combo_event(uint8_t combo_index, bool pressed) {
|
||||||
switch(combo_index) {
|
switch(combo_index) {
|
||||||
case ZC_COPY:
|
case ZC_COPY:
|
||||||
if (pressed) {
|
if (pressed) {
|
||||||
register_code(KC_LCTL);
|
tap_code16(LCTL(KC_C));
|
||||||
register_code(KC_C);
|
|
||||||
unregister_code(KC_C);
|
|
||||||
unregister_code(KC_LCTL);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case XV_PASTE:
|
case XV_PASTE:
|
||||||
if (pressed) {
|
if (pressed) {
|
||||||
register_code(KC_LCTL);
|
tap_code16(LCTL(KC_V));
|
||||||
register_code(KC_V);
|
|
||||||
unregister_code(KC_V);
|
|
||||||
unregister_code(KC_LCTL);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -87,3 +80,24 @@ If you're using long combos, or even longer combos, you may run into issues with
|
||||||
In this case, you can add either `#define EXTRA_LONG_COMBOS` or `#define EXTRA_EXTRA_LONG_COMBOS` in your `config.h` file.
|
In this case, you can add either `#define EXTRA_LONG_COMBOS` or `#define EXTRA_EXTRA_LONG_COMBOS` in your `config.h` file.
|
||||||
|
|
||||||
You may also be able to enable action keys by defining `COMBO_ALLOW_ACTION_KEYS`.
|
You may also be able to enable action keys by defining `COMBO_ALLOW_ACTION_KEYS`.
|
||||||
|
|
||||||
|
## Keycodes
|
||||||
|
|
||||||
|
You can enable, disable and toggle the Combo feature on the fly. This is useful if you need to disable them temporarily, such as for a game.
|
||||||
|
|
||||||
|
|Keycode |Description |
|
||||||
|
|----------|---------------------------------|
|
||||||
|
|`CMB_ON` |Turns on Combo feature |
|
||||||
|
|`CMB_OFF` |Turns off Combo feature |
|
||||||
|
|`CMB_TOG` |Toggles Combo feature on and off |
|
||||||
|
|
||||||
|
## User callbacks
|
||||||
|
|
||||||
|
In addition to the keycodes, there are a few functions that you can use to set the status, or check it:
|
||||||
|
|
||||||
|
|Function |Description |
|
||||||
|
|-----------|--------------------------------------------------------------------|
|
||||||
|
| `combo_enable()` | Enables the combo feature |
|
||||||
|
| `combo_disable()` | Disables the combo feature, and clears the combo buffer |
|
||||||
|
| `combo_toggle()` | Toggles the state of the combo feature |
|
||||||
|
| `is_combo_enabled()` | Returns the status of the combo feature state (true or false) |
|
||||||
|
|
|
@ -28,6 +28,7 @@ static uint16_t timer = 0;
|
||||||
static uint8_t current_combo_index = 0;
|
static uint8_t current_combo_index = 0;
|
||||||
static bool drop_buffer = false;
|
static bool drop_buffer = false;
|
||||||
static bool is_active = false;
|
static bool is_active = false;
|
||||||
|
static bool b_combo_enable = true; // defaults to enabled
|
||||||
|
|
||||||
static uint8_t buffer_size = 0;
|
static uint8_t buffer_size = 0;
|
||||||
#ifdef COMBO_ALLOW_ACTION_KEYS
|
#ifdef COMBO_ALLOW_ACTION_KEYS
|
||||||
|
@ -128,6 +129,23 @@ bool process_combo(uint16_t keycode, keyrecord_t *record) {
|
||||||
drop_buffer = false;
|
drop_buffer = false;
|
||||||
bool no_combo_keys_pressed = true;
|
bool no_combo_keys_pressed = true;
|
||||||
|
|
||||||
|
if (keycode == CMB_ON && record->event.pressed) {
|
||||||
|
combo_enable();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keycode == CMB_OFF && record->event.pressed) {
|
||||||
|
combo_disable();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keycode == CMB_TOG && record->event.pressed) {
|
||||||
|
combo_toggle();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_combo_enabled()) { return true; }
|
||||||
|
|
||||||
for (current_combo_index = 0; current_combo_index < COMBO_COUNT;
|
for (current_combo_index = 0; current_combo_index < COMBO_COUNT;
|
||||||
++current_combo_index) {
|
++current_combo_index) {
|
||||||
combo_t *combo = &key_combos[current_combo_index];
|
combo_t *combo = &key_combos[current_combo_index];
|
||||||
|
@ -166,7 +184,7 @@ bool process_combo(uint16_t keycode, keyrecord_t *record) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void matrix_scan_combo(void) {
|
void matrix_scan_combo(void) {
|
||||||
if (is_active && timer && timer_elapsed(timer) > COMBO_TERM) {
|
if (b_combo_enable && is_active && timer && timer_elapsed(timer) > COMBO_TERM) {
|
||||||
|
|
||||||
/* This disables the combo, meaning key events for this
|
/* This disables the combo, meaning key events for this
|
||||||
* combo will be handled by the next processors in the chain
|
* combo will be handled by the next processors in the chain
|
||||||
|
@ -175,3 +193,26 @@ void matrix_scan_combo(void) {
|
||||||
dump_key_buffer(true);
|
dump_key_buffer(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void combo_enable(void) {
|
||||||
|
b_combo_enable = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void combo_disable(void) {
|
||||||
|
b_combo_enable = is_active = false;
|
||||||
|
timer = 0;
|
||||||
|
dump_key_buffer(true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void combo_toggle(void) {
|
||||||
|
if (b_combo_enable) {
|
||||||
|
combo_disable();
|
||||||
|
} else {
|
||||||
|
combo_enable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_combo_enabled(void) {
|
||||||
|
return b_combo_enable;
|
||||||
|
}
|
||||||
|
|
|
@ -58,4 +58,9 @@ bool process_combo(uint16_t keycode, keyrecord_t *record);
|
||||||
void matrix_scan_combo(void);
|
void matrix_scan_combo(void);
|
||||||
void process_combo_event(uint8_t combo_index, bool pressed);
|
void process_combo_event(uint8_t combo_index, bool pressed);
|
||||||
|
|
||||||
|
void combo_enable(void);
|
||||||
|
void combo_disable(void);
|
||||||
|
void combo_toggle(void);
|
||||||
|
bool is_combo_enabled(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -489,6 +489,9 @@ enum quantum_keycodes {
|
||||||
// Right control, close paren
|
// Right control, close paren
|
||||||
KC_RAPC,
|
KC_RAPC,
|
||||||
|
|
||||||
|
CMB_ON,
|
||||||
|
CMB_OFF,
|
||||||
|
CMB_TOG,
|
||||||
// always leave at the end
|
// always leave at the end
|
||||||
SAFE_RANGE
|
SAFE_RANGE
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue