keymap.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include QMK_KEYBOARD_H
  2. #include "led.h"
  3. enum layers {
  4. LAYER_BASE,
  5. LAYER_EDIT,
  6. LAYER_FUNCTION
  7. };
  8. enum custom_keycodes {
  9. M_COPY = SAFE_RANGE, // KC_FN5: MACRO_COPY_CUT
  10. M_SHFCT, // KC_FN6: MACRO_SHIFT_CONTROL
  11. M_CTALT // KC_FN7: MACRO_CONTROL_ALT
  12. };
  13. #define SC_UNDO LCTL(KC_Z)
  14. #define SC_REDO LCTL(KC_Y)
  15. #define SC_CUT LCTL(KC_X)
  16. #define SC_COPY LCTL(KC_C)
  17. #define SC_PSTE LCTL(KC_V)
  18. #define SC_SELA LCTL(KC_A)
  19. #define SC_SAVE LCTL(KC_S)
  20. #define SC_OPEN LCTL(KC_O)
  21. #define SC_ACLS LALT(KC_F4)
  22. #define SC_CCLS LCTL(KC_F4)
  23. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  24. [LAYER_BASE] = LAYOUT( \
  25. KC_ESC, KC_TAB, KC_BSLS, MO(2), \
  26. KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
  27. KC_P7, KC_P8, KC_P9, KC_PEQL, \
  28. KC_P4, KC_P5, KC_P6, KC_PPLS, \
  29. KC_P1, KC_P2, KC_P3, XXXXXXX, \
  30. KC_P0, KC_PCMM, KC_PDOT, KC_PENT ),
  31. [LAYER_EDIT] = LAYOUT( \
  32. KC_ESC, KC_TAB, KC_SPC, _______, \
  33. TG(1), SC_PSTE, SC_REDO, SC_UNDO, \
  34. KC_HOME, KC_UP, KC_PGUP, KC_LALT, \
  35. KC_LEFT, M_COPY, KC_RGHT, KC_LCTL, \
  36. KC_END, KC_DOWN, KC_PGDN, XXXXXXX, \
  37. KC_BSPC, KC_PENT, KC_DEL, M_SHFCT ),
  38. [LAYER_FUNCTION] = LAYOUT( \
  39. BL_TOGG, BL_INC, BL_DEC, _______, \
  40. TG(1), _______, _______, _______, \
  41. _______, _______, _______, _______, \
  42. _______, _______, _______, _______, \
  43. _______, _______, _______, XXXXXXX, \
  44. RESET, _______, _______, _______ ),
  45. };
  46. bool process_record_user(uint16_t keycode, keyrecord_t * record) {
  47. // MACRODOWN only works in this function
  48. switch (keycode) {
  49. case M_COPY:
  50. if (record->event.pressed) {
  51. register_code(KC_LCTL);
  52. if (record->tap.count == 1) {
  53. register_code(KC_C);
  54. unregister_code(KC_C);
  55. } else if (record->tap.count == 2) {
  56. register_code(KC_X);
  57. unregister_code(KC_X);
  58. }
  59. unregister_code(KC_LCTL);
  60. }
  61. break;
  62. case M_SHFCT:
  63. if (record->event.pressed) {
  64. if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT));
  65. if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL));
  66. if (record->tap.count == 3) register_code(KC_PENT);;
  67. } else {
  68. unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL));
  69. unregister_code(KC_PENT);
  70. }
  71. break;
  72. case M_CTALT:
  73. if (record->event.pressed) {
  74. if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL));
  75. if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT));
  76. } else {
  77. unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT));
  78. }
  79. break;
  80. }
  81. return true;
  82. }
  83. void led_set_user(uint8_t usb_led)
  84. {
  85. if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
  86. // output high
  87. DDRD |= (1<<6);
  88. PORTD |= (1<<6);
  89. } else {
  90. // Hi-Z
  91. DDRD &= ~(1<<6);
  92. PORTD &= ~(1<<6);
  93. }
  94. if (usb_led & (1<<USB_LED_NUM_LOCK)) {
  95. // output low
  96. DDRC |= (1<<7);
  97. PORTC |= ~(1<<7);
  98. } else {
  99. // Hi-Z
  100. DDRC &= ~(1<<7);
  101. PORTC &= ~(1<<7);
  102. }
  103. }