Skip to content

Commit

Permalink
Process combos earlier & overlapping combos (#8591)
Browse files Browse the repository at this point in the history
* Combo processing improvements.

Now it is possible to use ModTap and LayerTap keys as part of combos.
Overlapping combos also don't trigger all the combos, just exactly the
one that you press.

New settings:
- COMBO_MUST_HOLD_MODS
- COMBO_MOD_TERM
- COMBO_TERM_PER_COMBO
- COMBO_MUST_HOLD_PER_COMBO
- COMBO_STRICT_TIMER
- COMBO_NO_TIMER

* Remove the size flags from combo_t struct boolean members.

This in the end actually saves space as the members are accessed so many
times. The amount of operations needed to access the bits uses more
memory than setting the size saves.

* Fix `process_combo_key_release` not called correctly with tap-only combos

* Fix not passing a pointer when NO_ACTION_TAPPING is defined.

* Docs for `COMBO_ONLY_FROM_LAYER`

* Update docs/feature_combo.md

Co-authored-by: precondition <[email protected]>

* Update quantum/process_keycode/process_combo.c

Co-authored-by: precondition <[email protected]>

* Add `EXTRA_SHORT_COMBOS` option.

Stuff combo's `disabled` and `active` flags into `state`. Possibly can
save some space.

* Add more examples and clarify things with dict management system.

- Simple examples now has a combo that has modifiers included.
- The slightly more advanced examples now are actually more advanced
  instead of just `tap_code16(<modded-keycode>)`.
- Added a note that `COMBO_ACTION`s are not needed anymore as you can
  just use custom keycodes.
- Added a note that the `g/keymap_combo.h` macros use the
  `process_combo_event` function and that it is not usable in one's
  keymap afterwards.

* Update docs/feature_combo.md

Co-authored-by: precondition <[email protected]>

* Update docs/feature_combo.md

Co-authored-by: precondition <[email protected]>

* Update docs/feature_combo.md

Co-authored-by: precondition <[email protected]>

* Update docs/feature_combo.md

Co-authored-by: precondition <[email protected]>

* Update docs/feature_combo.md

Co-authored-by: precondition <[email protected]>

* Change "the" combo action example to "email" example.

* Update docs/feature_combo.md

Co-authored-by: precondition <[email protected]>

* Fix sneaky infinite loop with `combo_disable()`

No need to call `dump_key_buffer` when disabling combos because the
buffer is either being dumped if a combo-key was pressed, or the buffer is empty
if a non-combo-key is pressed.

* Update docs/feature_combo.md

Co-authored-by: precondition <[email protected]>

* Update docs/feature_combo.md

Co-authored-by: precondition <[email protected]>

Co-authored-by: precondition <[email protected]>
Co-authored-by: Drashna Jaelre <[email protected]>
  • Loading branch information
3 people authored Aug 5, 2021
1 parent 07553b4 commit 7e98379
Show file tree
Hide file tree
Showing 11 changed files with 841 additions and 165 deletions.
14 changes: 13 additions & 1 deletion docs/config_options.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,9 +188,21 @@ If you define these options you will enable the associated feature, which may in
few ms of delay from this. But if you're doing chording on something with 3-4ms
scan times? You probably want this.
* `#define COMBO_COUNT 2`
* Set this to the number of combos that you're using in the [Combo](feature_combo.md) feature.
* Set this to the number of combos that you're using in the [Combo](feature_combo.md) feature. Or leave it undefined and programmatically set the count.
* `#define COMBO_TERM 200`
* how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined.
* `#define COMBO_MUST_HOLD_MODS`
* Flag for enabling extending timeout on Combos containing modifers
* `#define COMBO_MOD_TERM 200`
* Allows for extending COMBO_TERM for mod keys while mid-combo.
* `#define COMBO_MUST_HOLD_PER_COMBO`
* Flag to enable per-combo COMBO_TERM extension and `get_combo_must_hold()` function
* `#define COMBO_TERM_PER_COMBO`
* Flag to enable per-combo COMBO_TERM extension and `get_combo_term()` function
* `#define COMBO_STRICT_TIMER`
* Only start the combo timer on the first key press instead of on all key presses.
* `#define COMBO_NO_TIMER`
* Disable the combo timer completely for relaxed combos.
* `#define TAP_CODE_DELAY 100`
* Sets the delay between `register_code` and `unregister_code`, if you're having issues with it registering properly (common on VUSB boards). The value is in milliseconds.
* `#define TAP_HOLD_CAPS_DELAY 80`
Expand Down
292 changes: 259 additions & 33 deletions docs/feature_combo.md

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions keyboards/gboards/g/keymap_combo.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,10 @@
#define TOGG A_ENUM
enum combos {
#include "combos.def"
COMBO_LENGTH
};
// Export length to combo module
uint16_t COMBO_LEN = COMBO_LENGTH;

// Bake combos into mem
#undef COMB
Expand All @@ -53,9 +56,6 @@ combo_t key_combos[] = {
#undef SUBS
#undef TOGG

// Export length to combo module
int COMBO_LEN = sizeof(key_combos) / sizeof(key_combos[0]);

// Fill QMK hook
#define COMB BLANK
#define SUBS A_ACTI
Expand Down
3 changes: 3 additions & 0 deletions quantum/keymap_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,10 @@ extern keymap_config_t keymap_config;
action_t action_for_key(uint8_t layer, keypos_t key) {
// 16bit keycodes - important
uint16_t keycode = keymap_key_to_keycode(layer, key);
return action_for_keycode(keycode);
};

action_t action_for_keycode(uint16_t keycode) {
// keycode remapping
keycode = keycode_config(keycode);

Expand Down
Loading

0 comments on commit 7e98379

Please sign in to comment.