]> git.donarmstrong.com Git - qmk_firmware.git/blobdiff - quantum/process_keycode/process_combo.c
Allow Combo feature to be enabled/disabled live (#6318)
[qmk_firmware.git] / quantum / process_keycode / process_combo.c
index a157ed48be1dfdba3f8848f26090ae4d23b31ed4..d3c3b1673c385fe138388808f6e433b5b3cc4824 100644 (file)
@@ -28,6 +28,7 @@ static uint16_t timer = 0;
 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
@@ -126,13 +127,30 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode,
 bool process_combo(uint16_t keycode, keyrecord_t *record) {
   bool is_combo_key = false;
   drop_buffer = false;
-  bool no_combo_keys_pressed = 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];
     is_combo_key |= process_single_combo(combo, keycode, record);
-    no_combo_keys_pressed |= NO_COMBO_KEYS_ARE_DOWN;
+    no_combo_keys_pressed = no_combo_keys_pressed && NO_COMBO_KEYS_ARE_DOWN;
   }
 
   if (drop_buffer) {
@@ -166,7 +184,7 @@ bool process_combo(uint16_t keycode, keyrecord_t *record) {
 }
 
 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
@@ -175,3 +193,26 @@ void matrix_scan_combo(void) {
     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;
+}