You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.5 KiB

  1. #include "superduper.h"
  2. #include "eeconfig.h"
  3. #include "eeprom.h"
  4. #include "keymap_colemak.h"
  5. // SuperDuper
  6. #define SUPERDUPER_COMBO_COUNT 3
  7. #define EECONFIG_SUPERDUPER_INDEX (uint8_t *) 19
  8. enum process_combo_event {
  9. CB_SUPERDUPER,
  10. };
  11. enum supported_layers {
  12. _QWERTY,
  13. _COLEMAK,
  14. _QWOC
  15. };
  16. const uint16_t PROGMEM superduper_combos[SUPERDUPER_COMBO_COUNT][3] = {
  17. [_QWERTY] = {KC_S, KC_D, COMBO_END},
  18. [_COLEMAK] = {KC_R, KC_S, COMBO_END},
  19. [_QWOC] = {CM_S, CM_D, COMBO_END},
  20. };
  21. combo_t key_combos[COMBO_COUNT] = {
  22. [CB_SUPERDUPER] = COMBO_ACTION(superduper_combos[_QWERTY]),
  23. };
  24. volatile bool superduper_enabled = true;
  25. const uint16_t PROGMEM empty_combo[] = {COMBO_END};
  26. bool toggle_superduper_mode(void) {
  27. superduper_enabled = !superduper_enabled;
  28. if (superduper_enabled) {
  29. set_superduper_key_combos();
  30. } else {
  31. clear_superduper_key_combos();
  32. }
  33. return superduper_enabled;
  34. }
  35. void set_superduper_key_combo_layer(uint16_t layer) {
  36. key_combos[CB_SUPERDUPER].keys = superduper_combos[layer];
  37. eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, layer);
  38. }
  39. void set_superduper_key_combos(void) {
  40. uint8_t layer = eeprom_read_byte(EECONFIG_SUPERDUPER_INDEX);
  41. switch (layer) {
  42. case _QWERTY:
  43. case _COLEMAK:
  44. case _QWOC:
  45. key_combos[CB_SUPERDUPER].keys = superduper_combos[layer];
  46. break;
  47. }
  48. }
  49. void clear_superduper_key_combos(void) {
  50. key_combos[CB_SUPERDUPER].keys = empty_combo;
  51. }