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.

164 lines
3.5 KiB

  1. #include QMK_KEYBOARD_H
  2. #define WIN_TAB LGUI(KC_TAB)
  3. #define WIN_LOCK LGUI(KC_L)
  4. enum layers {
  5. NORMAL_LAYER = 0,
  6. MEDIA_LAYER,
  7. TBD_LAYER2,
  8. FRENCH_LAYER
  9. };
  10. /* Enum for the tap dancing keys */
  11. enum tap_codes {
  12. A_Q, E_Q, E_U, E_E,
  13. A_Y, I_I, O_C, U_U
  14. };
  15. #define FR_A_GRAVE "00E0"
  16. #define FR_A_HAT "00E2"
  17. #define FR_C_CIRCUM "00E7"
  18. #define FR_E_AIGU "00E9"
  19. #define FR_E_GRAVE "00E8"
  20. #define FR_E_HAT "00EA"
  21. #define FR_E_UMLAUT "00EB"
  22. #define FR_I_HAT "00EE"
  23. #define FR_I_UMLAUT "00EF"
  24. #define FR_O_HAT "00F4"
  25. #define FR_U_GRAVE "00F9"
  26. #define FR_U_HAT "00FB"
  27. #define FR_U_UMLAUT "00FC"
  28. #define FR_Y_UMLAUT "00FF"
  29. #define FR_L_QUOTE "00AB"
  30. #define FR_R_QUOTE "00BB"
  31. void send_french_unicode_char(uint8_t count, char *once, char *twice)
  32. {
  33. if (count <= 1)
  34. send_unicode_hex_string(once);
  35. else
  36. send_unicode_hex_string(twice);
  37. }
  38. void dance_a_q(qk_tap_dance_state_t *state, void *user_data)
  39. {
  40. send_french_unicode_char(state->count, FR_A_GRAVE, FR_L_QUOTE);
  41. }
  42. void dance_e_q(qk_tap_dance_state_t *state, void *user_data)
  43. {
  44. send_french_unicode_char(state->count, FR_E_AIGU, FR_R_QUOTE);
  45. }
  46. void dance_e_u(qk_tap_dance_state_t *state, void *user_data)
  47. {
  48. send_french_unicode_char(state->count, FR_E_GRAVE, FR_U_GRAVE);
  49. }
  50. void dance_e_e(qk_tap_dance_state_t *state, void *user_data)
  51. {
  52. send_french_unicode_char(state->count, FR_E_HAT, FR_E_UMLAUT);
  53. }
  54. void dance_a_y(qk_tap_dance_state_t *state, void *user_data)
  55. {
  56. send_french_unicode_char(state->count, FR_A_HAT, FR_Y_UMLAUT);
  57. }
  58. void dance_i_i(qk_tap_dance_state_t *state, void *user_data)
  59. {
  60. send_french_unicode_char(state->count, FR_I_HAT, FR_I_UMLAUT);
  61. }
  62. void dance_o_c(qk_tap_dance_state_t *state, void *user_data)
  63. {
  64. send_french_unicode_char(state->count, FR_O_HAT, FR_C_CIRCUM);
  65. }
  66. void dance_u_u(qk_tap_dance_state_t *state, void *user_data)
  67. {
  68. send_french_unicode_char(state->count, FR_U_HAT, FR_U_UMLAUT);
  69. }
  70. /* Define the tap dance actions for the french characters */
  71. qk_tap_dance_action_t tap_dance_actions[] = {
  72. [A_Q] = ACTION_TAP_DANCE_FN(dance_a_q),
  73. [E_Q] = ACTION_TAP_DANCE_FN(dance_e_q),
  74. [E_U] = ACTION_TAP_DANCE_FN(dance_e_u),
  75. [E_E] = ACTION_TAP_DANCE_FN(dance_e_e),
  76. [A_Y] = ACTION_TAP_DANCE_FN(dance_a_y),
  77. [I_I] = ACTION_TAP_DANCE_FN(dance_i_i),
  78. [O_C] = ACTION_TAP_DANCE_FN(dance_o_c),
  79. [U_U] = ACTION_TAP_DANCE_FN(dance_u_u)
  80. };
  81. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  82. [NORMAL_LAYER] = LAYOUT(TO(1), WIN_TAB, KC_HOME, KC_UP, KC_END,
  83. WIN_LOCK, KC_MUTE, KC_LEFT, KC_DOWN, KC_RGHT),
  84. [MEDIA_LAYER] = LAYOUT(TO(2), KC_CALC, KC_MPRV, KC_MNXT, KC_VOLU,
  85. KC_TRNS, KC_TRNS, KC_MSTP, KC_MPLY, KC_VOLD),
  86. [TBD_LAYER2] = LAYOUT(TO(3), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  87. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
  88. [FRENCH_LAYER] = LAYOUT(TO(0), TD(A_Q), TD(E_Q), TD(E_U), TD(E_E),
  89. KC_TRNS, TD(A_Y), TD(I_I), TD(O_C), TD(U_U))
  90. };
  91. /* DISABLED
  92. void matrix_init_user(void) {
  93. }
  94. void matrix_scan_user(void) {
  95. }
  96. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  97. return true;
  98. }
  99. */
  100. void matrix_init_user(void)
  101. {
  102. set_unicode_input_mode(UC_WINC); /* See https://jayliu50.github.io/qmk-cheatsheet/ */
  103. }
  104. layer_state_t layer_state_set_user(layer_state_t state)
  105. {
  106. turn_off_leds();
  107. switch (get_highest_layer(state))
  108. {
  109. case NORMAL_LAYER:
  110. break;
  111. case MEDIA_LAYER:
  112. turn_on_led(RED_LED);
  113. break;
  114. case TBD_LAYER2:
  115. turn_on_led(BLUE_LED);
  116. break;
  117. case FRENCH_LAYER:
  118. turn_on_led(GREEN_LED);
  119. break;
  120. }
  121. return state;
  122. }