keymap.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. Copyright 2021 Alin M Elena <alinm.elena@gmail.com>
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. #include QMK_KEYBOARD_H
  15. #include "keymap_uk.h"
  16. enum layer_names { _QW = 0, _LWR, _RSE, _ADJ };
  17. // clang-format off
  18. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  19. [_QW] = LAYOUT_ortho_5x13(
  20. KC_ESC, UK_1 , UK_2 , UK_3 , UK_4 , UK_5 , UK_6 , UK_7 , UK_8 , UK_9 , UK_0 , UK_MINS, KC_BSPC ,
  21. KC_TAB, UK_Q , UK_W , UK_E , UK_R , UK_T , UK_Y , UK_U , UK_I , UK_O , UK_P , UK_LBRC, UK_RBRC ,
  22. UK_HASH, UK_A , UK_S , UK_D , UK_F , UK_G , UK_H , UK_J , UK_K , UK_L , UK_SCLN, UK_QUOT, KC_ENT ,
  23. KC_LSPO, UK_BSLS, UK_Z , UK_X , UK_C , UK_V , UK_B , UK_N , UK_M , UK_COMM, UK_DOT , KC_UP , UK_SLSH ,
  24. KC_LCTL, KC_LGUI, TT(_LWR), KC_LALT, TT(_RSE), KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RSPC, KC_LEFT, KC_DOWN, KC_RGHT),
  25. [_LWR] = LAYOUT_ortho_5x13(
  26. KC_GRV , KC_MUTE, KC_VOLU, KC_VOLD, KC_MPRV, KC_MPLY, KC_MNXT, G(KC_P), KC_SLEP, KC_WAKE, KC_PSCR, KC_DEL , UK_EQL ,
  27. KC_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
  28. KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
  29. KC_TRNS, KC_BTN1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS ,
  30. KC_TRNS, KC_BTN4, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R),
  31. [_RSE] = LAYOUT_ortho_5x13(
  32. KC_ESC , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 ,
  33. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
  34. KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
  35. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WH_U, KC_TRNS ,
  36. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R),
  37. [_ADJ] = LAYOUT_ortho_5x13(
  38. KC_TRNS, KC_TRNS, A(KC_F2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
  39. KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, RESET , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
  40. KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
  41. KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
  42. KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
  43. };
  44. // clang-format on
  45. // let us assume we start with both layers off
  46. bool toggle_lwr = false;
  47. bool toggle_rse = false;
  48. static inline void led_lwr(const bool on) {
  49. #ifdef LED_NUM_LOCK_PIN
  50. writePin(LED_NUM_LOCK_PIN, on);
  51. #endif
  52. }
  53. static inline void led_rse(const bool on) {
  54. #ifdef LED_SCROLL_LOCK_PIN
  55. writePin(LED_SCROLL_LOCK_PIN, on);
  56. #endif
  57. }
  58. static inline void led_caps(const bool on) {
  59. #ifdef LED_CAPS_LOCK_PIN
  60. writePin(LED_CAPS_LOCK_PIN, on);
  61. #endif
  62. }
  63. bool led_update_user(led_t led_state) {
  64. // Disable the default LED update code, so that lock LEDs could be reused to show layer status.
  65. return false;
  66. }
  67. void matrix_scan_user(void) {
  68. led_lwr(toggle_lwr);
  69. led_rse(toggle_rse);
  70. led_t led_state = host_keyboard_led_state();
  71. led_caps(!led_state.caps_lock);
  72. if (layer_state_is(_ADJ)) {
  73. led_lwr(true);
  74. led_rse(true);
  75. }
  76. }
  77. bool process_record_user(uint16_t keycode, keyrecord_t* record) {
  78. switch (keycode) {
  79. case (TT(_LWR)):
  80. if (!record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
  81. // This runs before the TT() handler toggles the layer state, so the current layer state is the opposite of the final one after toggle.
  82. toggle_lwr = !layer_state_is(_LWR);
  83. }
  84. return true;
  85. break;
  86. case (TT(_RSE)):
  87. if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
  88. toggle_rse = !layer_state_is(_RSE);
  89. }
  90. return true;
  91. break;
  92. default:
  93. return true;
  94. }
  95. }
  96. layer_state_t layer_state_set_user(layer_state_t state) { return update_tri_layer_state(state, _LWR, _RSE, _ADJ); }