Advertisement
Guest User

2024-03-23-epressabyss-keymap.c

a guest
Apr 23rd, 2024
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 16.88 KB | None | 0 0
  1. // Copyright 2023 Cyboard LLC (@Cyboard-DigitalTailor)
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3.  
  4. #include QMK_KEYBOARD_H
  5.  
  6. #include "combos/keymap_combo.h"
  7. #include "features/achordion.h"
  8. #include "features/custom_shift_keys.h"
  9.  
  10. enum custom_keycodes {
  11.   LMAGIC = SAFE_RANGE,
  12.   RMAGIC,
  13. };
  14.  
  15. #define NDRSL    TO(0) // Layers
  16. #define GAME     TO(1)
  17. #define QWERTY   TO(2)
  18. #define NUM_DEL  LT(5, KC_DEL)
  19. #define NAV MO(6)
  20.  
  21. #define HRL_A LT(4,  KC_A) // Homerow mods and layers
  22. #define HRM_E LSFT_T(KC_E)
  23. #define HRM_I LCTL_T(KC_I)
  24. #define HRM_H LGUI_T(KC_H)
  25. #define HRM_X LALT_T(KC_X)
  26.  
  27. #define HRL_D LT(3,  KC_D)
  28. #define HRM_R RSFT_T(KC_R)
  29. #define HRM_S RCTL_T(KC_S)
  30. #define HRM_L RGUI_T(KC_L)
  31. #define HRM_V RALT_T(KC_V)
  32.  
  33. #define TH_1  LT(0, KC_1) // Tap for number, hold for F-key.
  34. #define TH_2  LT(0, KC_2)
  35. #define TH_3  LT(0, KC_3)
  36. #define TH_4  LT(0, KC_4)
  37. #define TH_5  LT(0, KC_5)
  38. #define TH_6  LT(0, KC_6)
  39. #define TH_7  LT(0, KC_7)
  40. #define TH_8  LT(0, KC_8)
  41. #define TH_9  LT(0, KC_9)
  42. #define TH_10 LT(0, KC_0)
  43. #define TH_11 LT(1, KC_0) // Layer 1/2 to prevent duplicate case
  44. #define TH_12 LT(2, KC_0)
  45.  
  46.  
  47. #define UNDO   LCTL(KC_Z) // Shortcuts
  48. #define REDO_Y LCTL(KC_Y)
  49. #define REDO_Z RCS(KC_Z)
  50. #define CTL_L  LCTL(KC_LEFT) // Skip words
  51. #define CTL_D  LCTL(KC_DOWN)
  52. #define CTL_U  LCTL(KC_UP)
  53. #define CTL_R  LCTL(KC_RGHT)
  54. #define HYPR_0 HYPR(KC_0) // Screenshot keys for Flameshot
  55. #define HYPR_1 HYPR(KC_1)
  56. #define HYPR_2 HYPR(KC_2)
  57.  
  58. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  59.     [0] = LAYOUT_singlearc_let( // NDRSL LAYER
  60.         KC_TAB,  KC_Q,    KC_Y,    KC_O,    KC_U,    KC_MINS,                         KC_BSPC, KC_G,    KC_N,    KC_F,    KC_K,    KC_TAB,
  61.         KC_Z,    HRM_H,   HRM_I,   HRM_E,   HRL_A,   KC_DOT,                          KC_P,    HRL_D,   HRM_R,   HRM_S,   HRM_L,   KC_J,
  62.         KC_ESC,  HRM_X,   KC_SLSH, KC_QUOT, KC_COMM, KC_SCLN,                         KC_B,    KC_C,    KC_M,    KC_W,    HRM_V,   KC_ESC,
  63.         KC_ENT,  REDO_Z,  UNDO,    REDO_Y,  NUM_DEL, KC_SPC,  LMAGIC,        RMAGIC,  KC_T,    NAV,     GAME,    QWERTY,  _______, KC_ENT
  64.     ),
  65.  
  66.     [1] = LAYOUT_singlearc_let( // GAME LAYER
  67.         KC_TAB,  KC_Q,    KC_Y,    KC_O,    KC_U,    KC_MINS,                         KC_J,    KC_G,    KC_N,    KC_F,    KC_K,    KC_TAB,
  68.         KC_Z,    KC_H,    KC_I,    KC_E,    KC_A,    KC_DOT,                          KC_P,    HRL_D,   HRM_R,   HRM_S,   HRM_L,   KC_BSPC,
  69.         KC_V,    KC_X,    KC_SLSH, KC_QUOT, KC_COMM, KC_SCLN,                         KC_B,    KC_C,    KC_M,    KC_W,    HRM_V,   KC_DEL,
  70.         _______, _______, _______, _______, NUM_DEL, KC_SPC,  KC_LCTL,       _______, KC_T,    NAV,     NDRSL,   QWERTY,  _______, KC_ENT
  71.     ),
  72.  
  73.     [2] = LAYOUT_singlearc_let( // QWERTY LAYER
  74.         KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                            KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
  75.         KC_TAB,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,                            KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_MINS,
  76.         KC_LALT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,                            KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_COLN,
  77.         KC_LCTL, _______, _______, _______, _______, KC_SPC,  KC_LCTL,       _______, KC_RSFT, KC_ENT,  GAME,    NDRSL,   _______, KC_ENT
  78.     ),
  79.  
  80.     [3] = LAYOUT_singlearc_let( // SYM_L LAYER
  81.         _______, KC_LCBR, KC_AMPR, KC_GRV,  KC_AT,   XXXXXXX,                         _______, _______, _______, _______, _______, _______,
  82.         _______, KC_LBRC, KC_CIRC, KC_TILD, KC_LPRN, KC_DOT,                          _______, _______, _______, _______, _______, _______,
  83.         _______, KC_LT,   KC_PIPE, KC_BSLS, KC_3,    XXXXXXX,                         _______, _______, _______, _______, _______, _______,
  84.         _______, _______, _______, _______, _______, _______, _______,       _______, _______, _______, _______, _______, _______, _______
  85.     ),
  86.  
  87.     [4] = LAYOUT_singlearc_let( // SYM_R LAYER
  88.         _______, _______, _______, _______, _______, _______,                         XXXXXXX, KC_DLR,  KC_SLSH, KC_ASTR, KC_RCBR, _______,
  89.         _______, _______, _______, _______, _______, _______,                         KC_DOT,  KC_RPRN, KC_MINS, KC_PLUS, KC_RBRC, _______,
  90.         _______, _______, _______, _______, _______, _______,                         XXXXXXX, KC_HASH, KC_PERC, KC_EQL,  KC_GT,   _______,
  91.         _______, _______, _______, _______, _______, _______, _______,       _______, _______, _______, _______, _______, _______, _______
  92.     ),
  93.  
  94.     [5] = LAYOUT_singlearc_let( // NUM LAYER
  95.         _______, TH_10,  TH_7,    TH_8,    TH_9,     KC_MINS,                         _______, _______, _______, _______, _______, _______,
  96.         _______, TH_11,  TH_4,    TH_5,    TH_6,     KC_DOT,                          _______, _______, KC_RSFT, KC_RCTL, KC_RGUI, _______,
  97.         _______, TH_12,  TH_1,    TH_2,    TH_3,     KC_COLN,                         _______, _______, _______, _______, KC_RALT, _______,
  98.         _______, _______, _______, _______, _______, _______, _______,       _______, KC_SPC,  _______, _______, _______, _______, _______
  99.     ),
  100.  
  101.     [6] = LAYOUT_singlearc_let( // NAV LAYER
  102.         _______, _______, _______, _______, _______, _______,                         _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END,  _______,
  103.         _______, KC_LGUI, KC_LCTL, KC_LSFT, _______, _______,                         _______, KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT, _______,
  104.         _______, KC_LALT, _______, _______, _______, _______,                         _______, CTL_L,   CTL_D,   CTL_U,   CTL_R,   _______,
  105.         _______, _______, _______, _______, _______, _______, _______,       _______, _______, _______, HYPR_0,  HYPR_1,  HYPR_2,  _______
  106.     ),
  107.  
  108.     [7] = LAYOUT_singlearc_let( // BALANCE LAYER
  109.         _______, _______, RGB_VAD, RGB_VAI, _______, _______,                         _______, _______, _______, _______, _______, _______,
  110.         _______, RGB_HUD, RGB_SAD, RGB_SAI, RGB_HUI, _______,                         _______, CM_TOGG, KC_CAPS, _______, _______, _______,
  111.         _______, _______, RGB_TOG, RGB_MOD, _______, _______,                         _______, QK_BOOT, _______, _______, _______, _______,
  112.         _______, _______, _______, _______, _______, _______, _______,       _______, _______, _______, _______, _______, _______, _______
  113.     )
  114. };
  115.  
  116. layer_state_t layer_state_set_user(layer_state_t state) {
  117.   return update_tri_layer_state(state, 5, 6, 7); // Balance layer
  118. }
  119.  
  120. bool remember_last_key_user(uint16_t keycode, keyrecord_t* record,
  121.                             uint8_t* remembered_mods) {
  122.     switch (keycode) {
  123.         case CW_TOGG:
  124.         case KC_ESC:
  125.         case KC_BSPC:
  126.         case KC_DEL:
  127.  
  128.         case LMAGIC:
  129.         case RMAGIC:
  130.             return false;  // Magic keys will ignore the above keycodes.
  131.     }
  132.     return true;  // Other keys can be repeated.
  133. }
  134.  
  135. static bool process_tap_or_long_press_key( // Tap for number, hold for F-key
  136.     keyrecord_t* record, uint16_t long_press_keycode) {
  137.   if (record->tap.count == 0) {  // Key is being held.
  138.     if (record->event.pressed) {
  139.       tap_code16(long_press_keycode);
  140.     }
  141.     return false;  // Skip default handling.
  142.   }
  143.   return true;  // Continue default handling.
  144. }
  145.  
  146. // An enhanced version of SEND_STRING: if Caps Word is active, the Shift key is
  147. // held while sending the string. Additionally, the last key is set such that if
  148. // the Repeat Key is pressed next, it produces `repeat_keycode`.
  149. #define MAGIC_STRING(str, repeat_keycode) \
  150.         magic_send_string_P(PSTR(str), (repeat_keycode))
  151.  
  152. static void magic_send_string_P(const char* str, uint16_t repeat_keycode) {
  153.     uint8_t saved_mods = 0;
  154.  
  155.   if (is_caps_word_on()) { // If Caps Word is on, save the mods and hold Shift.
  156.     saved_mods = get_mods();
  157.     register_mods(MOD_BIT(KC_LSFT));
  158.   }
  159.  
  160.   send_string_with_delay_P(str, TAP_CODE_DELAY);  // Send the string.
  161.   set_last_keycode(repeat_keycode); // 2024-03-09 Disabled sending of string for mag-rep / rep-mag consistency.
  162.  
  163.   // If Caps Word is on, restore the mods.
  164.   if (is_caps_word_on()) {
  165.     set_mods(saved_mods);
  166.   }
  167. }
  168.  
  169. static void process_left_magic(uint16_t keycode, uint8_t mods) { // LMAGIC definitions
  170.     switch (keycode) {
  171.         case HRL_A: { MAGIC_STRING("a",         KC_SPC); } break;
  172.         case  KC_B: { MAGIC_STRING("ecause",    KC_NO); } break;
  173.         case  KC_C: { MAGIC_STRING("an",        KC_NO); } break;
  174.       //case HRL_D: { MAGIC_STRING("d",         KC_NO); } break;
  175.         case HRM_E: { MAGIC_STRING("e",         KC_NO); } break;
  176.       //case  KC_F: { MAGIC_STRING("f",         KC_NO); } break;
  177.         case  KC_G: { MAGIC_STRING("eneral",    KC_NO); } break;
  178.         case HRM_H: { MAGIC_STRING("h",         KC_NO); } break;
  179.         case HRM_I: { MAGIC_STRING("i",         KC_NO); } break;
  180.         case  KC_J: { MAGIC_STRING("ust",       KC_NO); } break;
  181.       //case  KC_K: { MAGIC_STRING("k",         KC_NO); } break;
  182.       //case HRM_L: { MAGIC_STRING("l",         KC_NO); } break;
  183.         case  KC_M: { MAGIC_STRING("ent",       KC_NO); } break;
  184.         case  KC_N: { MAGIC_STRING("ion",       KC_NO); } break;
  185.         case  KC_O: { MAGIC_STRING("o",         KC_NO); } break;
  186.         case  KC_P: { MAGIC_STRING("retty",     KC_NO); } break;
  187.         case  KC_Q: { MAGIC_STRING("q",         KC_NO); } break;
  188.       //case HRM_R: { MAGIC_STRING("r",         KC_NO); } break;
  189.       //case HRM_S: { MAGIC_STRING("s",         KC_NO); } break;
  190.         case  KC_T: { MAGIC_STRING("t",         KC_NO); } break;
  191.         case  KC_U: { MAGIC_STRING("u",         KC_NO); } break;
  192.         case HRM_V: { MAGIC_STRING("azjorfia",  KC_NO); } break;
  193.         case  KC_W: { MAGIC_STRING("hich",      KC_NO); } break;
  194.         case HRM_X: { MAGIC_STRING("x",         KC_NO); } break;
  195.         case  KC_Y: { MAGIC_STRING("y",         KC_NO); } break;
  196.         case  KC_Z: { MAGIC_STRING("z",         KC_NO); } break;
  197.  
  198.         case KC_COMM: { MAGIC_STRING(" and",    KC_NO); } break;
  199.     }
  200. }
  201.  
  202. static void process_right_magic(uint16_t keycode, uint8_t mods) { // RMAGIC definitions
  203.     switch (keycode) {
  204.         case HRL_A: { MAGIC_STRING("nd",        KC_SPC); } break;
  205.         case  KC_B: { MAGIC_STRING("b",         KC_NO); } break;
  206.         case  KC_C: { MAGIC_STRING("c",         KC_NO); } break;
  207.         case HRL_D: { MAGIC_STRING("d",         KC_NO); } break;
  208.       //case HRM_E: { MAGIC_STRING("e",         KC_NO); } break;
  209.         case  KC_F: { MAGIC_STRING("f",         KC_NO); } break;
  210.         case  KC_G: { MAGIC_STRING("g",         KC_NO); } break;
  211.       //case HRM_H: { MAGIC_STRING("h",         KC_NO); } break;
  212.         case HRM_I: { MAGIC_STRING("on",        KC_NO); } break;
  213.         case  KC_J: { MAGIC_STRING("j",         KC_NO); } break;
  214.         case  KC_K: { MAGIC_STRING("k",         KC_NO); } break;
  215.         case HRM_L: { MAGIC_STRING("l",         KC_NO); } break;
  216.         case  KC_M: { MAGIC_STRING("m",         KC_NO); } break;
  217.         case  KC_N: { MAGIC_STRING("n",         KC_NO); } break;
  218.       //case  KC_O: { MAGIC_STRING("o",         KC_NO); } break;
  219.         case  KC_P: { MAGIC_STRING("p",         KC_NO); } break;
  220.         case  KC_Q: { MAGIC_STRING("ueen",      KC_NO); } break;
  221.         case HRM_R: { MAGIC_STRING("r",         KC_NO); } break;
  222.         case HRM_S: { MAGIC_STRING("s",         KC_NO); } break;
  223.       //case  KC_T: { MAGIC_STRING("t",         KC_NO); } break;
  224.       //case  KC_U: { MAGIC_STRING("u",         KC_NO); } break;
  225.         case HRM_V: { MAGIC_STRING("v",         KC_NO); } break;
  226.         case  KC_W: { MAGIC_STRING("w",         KC_NO); } break;
  227.         case HRM_X: { MAGIC_STRING("ex",        KC_NO); } break;
  228.         case  KC_Y: { MAGIC_STRING("eah",       KC_NO); } break;
  229.       //case  KC_Z: { MAGIC_STRING("z",         KC_NO); } break;
  230.  
  231.         case KC_COMM: { MAGIC_STRING(" but",    KC_NO); } break;
  232.         case  KC_SPC: { MAGIC_STRING("the",     KC_NO); } break;
  233.         case KC_ASTR: { MAGIC_STRING("*N**or**dr**as**s**i**l**", KC_NO); } break;
  234.     }
  235. }
  236.  
  237. bool process_record_user(uint16_t keycode, keyrecord_t* record) {
  238.   if (!process_achordion(keycode, record)) { return false; }
  239.   if (!process_custom_shift_keys(keycode, record)) { return false; }
  240.  
  241.   if (record->event.pressed) {
  242.   switch (keycode) {
  243.         case LMAGIC: { process_left_magic(get_last_keycode(), get_last_mods()); set_last_keycode(KC_SPC); } return false;
  244.         case RMAGIC: { process_right_magic(get_last_keycode(), get_last_mods()); set_last_keycode(KC_SPC); } return false;
  245.         }
  246.     }
  247.  
  248.   switch (keycode) {
  249.     case TH_1:  return process_tap_or_long_press_key(record, KC_F1); // number on tap, f-key on hold
  250.     case TH_2:  return process_tap_or_long_press_key(record, KC_F2);
  251.     case TH_3:  return process_tap_or_long_press_key(record, KC_F3);
  252.     case TH_4:  return process_tap_or_long_press_key(record, KC_F4);
  253.     case TH_5:  return process_tap_or_long_press_key(record, KC_F5);
  254.     case TH_6:  return process_tap_or_long_press_key(record, KC_F6);
  255.     case TH_7:  return process_tap_or_long_press_key(record, KC_F7);
  256.     case TH_8:  return process_tap_or_long_press_key(record, KC_F8);
  257.     case TH_9:  return process_tap_or_long_press_key(record, KC_F9);
  258.     case TH_10: return process_tap_or_long_press_key(record, KC_F10); // 0
  259.     case TH_11: return process_tap_or_long_press_key(record, KC_F11); // 0
  260.     case TH_12: return process_tap_or_long_press_key(record, KC_F12); // 0
  261.         return false;
  262.   }
  263.   return true;
  264. }
  265.  
  266. bool achordion_chord(uint16_t tap_hold_keycode,
  267.                      keyrecord_t* tap_hold_record,
  268.                      uint16_t other_keycode,
  269.                      keyrecord_t* other_record) {
  270.   // Override opposite hands rule for thumb keys. `% (MATRIX_ROWS / 2)` needed due to split board. See dactyl.h for matrix layout.
  271.   if (other_record->event.key.row % (MATRIX_ROWS / 2) == 1 && other_record->event.key.col == 0){ return true; }
  272.   if (other_record->event.key.row % (MATRIX_ROWS / 2) == 1 && other_record->event.key.col == 1){ return true; }
  273.   if (other_record->event.key.row % (MATRIX_ROWS / 2) == 1 && other_record->event.key.col == 2){ return true; }
  274.   if (other_record->event.key.row % (MATRIX_ROWS / 2) == 8 && other_record->event.key.col == 7){ return true; }
  275.   if (other_record->event.key.row % (MATRIX_ROWS / 2) == 8 && other_record->event.key.col == 8){ return true; }
  276.   if (other_record->event.key.row % (MATRIX_ROWS / 2) == 8 && other_record->event.key.col == 9){ return true; }
  277.   // If none of the above apply, continue opposite hands rule.
  278.   return achordion_opposite_hands(tap_hold_record, other_record);
  279. }
  280.  
  281. uint16_t achordion_timeout(uint16_t tap_hold_keycode) {
  282.   switch (tap_hold_keycode) {
  283.     case NUM_DEL:
  284.     case NAV:
  285.       return 0;  // Bypass Achordion for the above keys.
  286.   }
  287.   return 690;
  288. }
  289.  
  290. uint16_t achordion_streak_timeout(uint16_t tap_hold_keycode) {
  291.   uint8_t mod = mod_config(QK_MOD_TAP_GET_MODS(tap_hold_keycode));
  292.   if ((mod & MOD_LSFT) != 0) {
  293.     return 50;  // A shorter streak timeout for Shift mod-tap keys.
  294.   } else {
  295.     return 125;  // A longer timeout otherwise.
  296.   }
  297. }
  298.  
  299. bool caps_word_press_user(uint16_t keycode) {
  300.     switch (keycode) {
  301.         // Keycodes that continue Caps Word, with shift applied.
  302.         case KC_A ... KC_Z:
  303.         case KC_MINS:
  304.             add_weak_mods(MOD_BIT(KC_LSFT));  // Apply shift to next key.
  305.             return true;
  306.  
  307.         // Keycodes that continue Caps Word, without shifting.
  308.         case KC_1 ... KC_0:
  309.         case KC_BSPC:
  310.         case KC_DEL:
  311.         case KC_QUOT:
  312.         case KC_SLSH:
  313.         case KC_UNDS:
  314.         case KC_SPC:
  315.             return true;
  316.  
  317.         default:
  318.             return false;  // Deactivate Caps Word.
  319.     }
  320. }
  321.  
  322. // Key overrides
  323. const custom_shift_key_t custom_shift_keys[] = {
  324.   {KC_COMM, KC_QUES},
  325.   {KC_DOT,  KC_EXLM},
  326.   {KC_SLSH, KC_BSLS},
  327.   {KC_BSPC, KC_DEL},
  328.  
  329.   {KC_1, KC_1}, // disable shifting
  330.   {KC_2, KC_2},
  331.   {KC_3, KC_3},
  332.   {KC_4, KC_4},
  333.   {KC_5, KC_5},
  334.   {KC_6, KC_6},
  335.   {KC_7, KC_7},
  336.   {KC_8, KC_8},
  337.   {KC_9, KC_9},
  338.   {KC_0, KC_0},
  339.   {KC_EQL, KC_EQL},
  340.   {KC_GRV, KC_GRV},
  341.   {KC_LBRC, KC_LBRC},
  342.   {KC_RBRC, KC_RBRC},
  343.  
  344. };
  345.  
  346. uint8_t NUM_CUSTOM_SHIFT_KEYS =
  347.     sizeof(custom_shift_keys) / sizeof(custom_shift_key_t);
  348.  
  349. // RGB layer change, all keys
  350. #define DIM_BY 18
  351. #define DIMMED(rgb_color) DIMMED_(rgb_color)
  352. #define DIMMED_(r, g, b) ((r)/DIM_BY), ((g)/DIM_BY), ((b)/DIM_BY)
  353.  
  354. #define NDRSL_COLOUR  DIMMED(RGB_PURPLE) // 0
  355. #define GAME_COLOUR   DIMMED(RGB_CYAN)   // 1
  356. #define QWERTY_COLOR  DIMMED(RGB_PINK)   // 2
  357. #define SHADES_COLOR  DIMMED(RGB_GREEN)  // 3
  358. #define BALANCE_COLOR DIMMED(RGB_RED)    // 6
  359.  
  360. bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
  361.     for (uint8_t i = led_min; i < led_max; i++) {
  362.         switch(get_highest_layer(layer_state|default_layer_state)) {
  363.             case 1:
  364.                 rgb_matrix_set_color(i, GAME_COLOUR);
  365.                 break;
  366.             case 2:
  367.                 rgb_matrix_set_color(i, QWERTY_COLOR);
  368.                 break;
  369.             //case 3:
  370.             //    rgb_matrix_set_color(i, SHADES_COLOR);
  371.             //    break;
  372.             //case 6:
  373.                 //rgb_matrix_set_color(i, BALANCE_COLOR);
  374.                 //break;
  375.             default:
  376.                 break;
  377.         }
  378.     }
  379.     return false;
  380. }
  381.  
  382. void matrix_scan_user(void) {
  383.   achordion_task();
  384.   // Other tasks...
  385. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement