keymap.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /* Copyright 2020 elmo-space<mail@elmo.space>
  2. *
  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. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include QMK_KEYBOARD_H
  17. #include "rgblite.h"
  18. // Defines names for use in layer keycodes and the keymap
  19. enum layer_names {
  20. _BASE,
  21. _FUNC,
  22. };
  23. // set your keycodes here
  24. #define layer1_left KC_PAUS
  25. #define layer1_right KC_MPLY
  26. #define layer2_left KC_MPRV
  27. #define layer2_right KC_MNXT
  28. enum custom_keycodes {
  29. LEFT1 = SAFE_RANGE,
  30. RIGHT1,
  31. LEFT2,
  32. RIGHT2
  33. };
  34. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  35. [_BASE] = LAYOUT(
  36. LEFT1, RIGHT1
  37. ),
  38. [_FUNC] = LAYOUT(
  39. LEFT2, RIGHT2
  40. )
  41. };
  42. static bool key1_down = false;
  43. static bool key2_down = false;
  44. static char layer_switched = 0; // this prevents the individual keys getting triggered after a layerchange
  45. bool process_record_user(uint16_t keycode, keyrecord_t *record)
  46. {
  47. switch (keycode)
  48. {
  49. case LEFT1:
  50. if (record->event.pressed)
  51. {
  52. if (key2_down)
  53. {
  54. layer_on(1);
  55. layer_switched = 2;
  56. return false;
  57. break;
  58. }
  59. key1_down = true;
  60. }
  61. else {
  62. if (layer_switched > 0) {
  63. --layer_switched;
  64. key1_down = false;
  65. }
  66. else {
  67. tap_code(layer1_left);
  68. key1_down = false;
  69. }
  70. }
  71. return false;
  72. break;
  73. case RIGHT1:
  74. if (record->event.pressed)
  75. {
  76. if (key1_down)
  77. {
  78. layer_on(1);
  79. layer_switched = 2;
  80. return false;
  81. break;
  82. }
  83. key2_down = true;
  84. }
  85. else {
  86. if (layer_switched > 0) {
  87. --layer_switched;
  88. key2_down = false;
  89. }
  90. else {
  91. tap_code(layer1_right);
  92. key2_down = false;
  93. }
  94. }
  95. return false;
  96. break;
  97. case LEFT2:
  98. if (record->event.pressed)
  99. {
  100. if (key2_down)
  101. {
  102. layer_off(1);
  103. layer_switched = 2;
  104. return false;
  105. break;
  106. }
  107. key1_down = true;
  108. }
  109. else {
  110. if (layer_switched > 0) {
  111. --layer_switched;
  112. key1_down = false;
  113. }
  114. else {
  115. tap_code(layer2_left);
  116. key1_down = false;
  117. }
  118. }
  119. return false;
  120. break;
  121. case RIGHT2:
  122. if (record->event.pressed)
  123. {
  124. if (key1_down)
  125. {
  126. layer_off(1);
  127. layer_switched = 2;
  128. return false;
  129. break;
  130. }
  131. key2_down = true;
  132. }
  133. else {
  134. if (layer_switched > 0) {
  135. --layer_switched;
  136. key2_down = false;
  137. }
  138. else {
  139. tap_code(layer2_right);
  140. key2_down = false;
  141. }
  142. }
  143. return false;
  144. break;
  145. }
  146. return true;
  147. };
  148. // layer colors
  149. layer_state_t layer_state_set_user(layer_state_t state) {
  150. switch (get_highest_layer(state)) {
  151. case _FUNC:
  152. rgblight_setrgb_red();
  153. break;
  154. default: // for any other layers, or the default layer
  155. rgblight_setrgb_green();
  156. break;
  157. }
  158. return state;
  159. }
  160. // default color
  161. void keyboard_post_init_user(void) {
  162. rgblight_setrgb_green();
  163. }