switch(combo_index) {
case ZC_COPY:
if (pressed) {
- register_code(KC_LCTL);
- register_code(KC_C);
- unregister_code(KC_C);
- unregister_code(KC_LCTL);
+ tap_code16(LCTL(KC_C));
}
break;
-
case XV_PASTE:
if (pressed) {
- register_code(KC_LCTL);
- register_code(KC_V);
- unregister_code(KC_V);
- unregister_code(KC_LCTL);
+ tap_code16(LCTL(KC_V));
}
break;
}
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`.
+
+## 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) |
static uint8_t current_combo_index = 0;
static bool drop_buffer = false;
static bool is_active = false;
+static bool b_combo_enable = true; // defaults to enabled
static uint8_t buffer_size = 0;
#ifdef COMBO_ALLOW_ACTION_KEYS
drop_buffer = false;
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;
++current_combo_index) {
combo_t *combo = &key_combos[current_combo_index];
}
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
* combo will be handled by the next processors in the chain
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;
+}
void matrix_scan_combo(void);
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
// Right control, close paren
KC_RAPC,
+ CMB_ON,
+ CMB_OFF,
+ CMB_TOG,
// always leave at the end
SAFE_RANGE
};