summary refs log tree commit diff
diff options
context:
space:
mode:
authorDrashna Jaelre <drashna@live.com>2019-07-16 01:37:19 -0700
committerskullydazed <skullydazed@users.noreply.github.com>2019-07-16 01:37:19 -0700
commitc44fc68297029da87233777aff6978d39caebbb1 (patch)
treef580b1ae96684577caa899a8180a2f9cb4a81aca
parent5fa0a274eaf6c3f2b1dbd4e6e23a4c3b884f1d44 (diff)
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
-rw-r--r--docs/feature_combo.md32
-rw-r--r--quantum/process_keycode/process_combo.c43
-rw-r--r--quantum/process_keycode/process_combo.h5
-rw-r--r--quantum/quantum_keycodes.h3
4 files changed, 73 insertions, 10 deletions
diff --git a/docs/feature_combo.md b/docs/feature_combo.md
index 4cb1bcda08..9db7be5119 100644
--- a/docs/feature_combo.md
+++ b/docs/feature_combo.md
@@ -59,19 +59,12 @@ void process_combo_event(uint8_t combo_index, bool pressed) {
   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;
   }
@@ -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.
 
 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) |
diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c
index 2c6c9d0d5f..d3c3b1673c 100644
--- a/quantum/process_keycode/process_combo.c
+++ b/quantum/process_keycode/process_combo.c
@@ -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
@@ -128,6 +129,23 @@ bool process_combo(uint16_t keycode, keyrecord_t *record) {
   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];
@@ -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;
+}
diff --git a/quantum/process_keycode/process_combo.h b/quantum/process_keycode/process_combo.h
index f06d2d3454..aab2849572 100644
--- a/quantum/process_keycode/process_combo.h
+++ b/quantum/process_keycode/process_combo.h
@@ -58,4 +58,9 @@ bool process_combo(uint16_t keycode, keyrecord_t *record);
 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
diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h
index 779c355efc..207e0a8261 100644
--- a/quantum/quantum_keycodes.h
+++ b/quantum/quantum_keycodes.h
@@ -489,6 +489,9 @@ enum quantum_keycodes {
     // Right control, close paren
     KC_RAPC,
 
+    CMB_ON,
+    CMB_OFF,
+    CMB_TOG,
     // always leave at the end
     SAFE_RANGE
 };