edvorakjp.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. #include "eeprom.h"
  2. #include "edvorakjp.h"
  3. bool japanese_mode;
  4. uint16_t time_on_pressed;
  5. edvorakjp_config_t edvorakjp_config;
  6. uint8_t eeconfig_read_edvorakjp(void) {
  7. return eeprom_read_byte(EECONFIG_EDVORAK);
  8. }
  9. void eeconfig_update_edvorakjp(uint8_t val) {
  10. eeprom_update_byte(EECONFIG_EDVORAK, val);
  11. }
  12. void dvorakj_layer_off(void) {
  13. layer_off(_EDVORAKJ1);
  14. layer_off(_EDVORAKJ2);
  15. }
  16. void update_japanese_mode(bool new_state) {
  17. japanese_mode = new_state;
  18. if (japanese_mode) {
  19. if (edvorakjp_config.enable_kc_lang) {
  20. SEND_STRING(SS_TAP(X_LANG1));
  21. } else {
  22. SEND_STRING(SS_LALT("`"));
  23. }
  24. } else {
  25. dvorakj_layer_off();
  26. if (edvorakjp_config.enable_kc_lang) {
  27. SEND_STRING(SS_TAP(X_LANG2));
  28. } else {
  29. SEND_STRING(SS_LALT("`"));
  30. }
  31. }
  32. }
  33. void matrix_init_user(void) {
  34. japanese_mode = false;
  35. time_on_pressed = 0;
  36. edvorakjp_config.raw = eeconfig_read_edvorakjp();
  37. matrix_init_keymap();
  38. }
  39. __attribute__ ((weak))
  40. void matrix_init_keymap() {}
  41. uint32_t layer_state_set_user(uint32_t state) {
  42. state = update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
  43. return layer_state_set_keymap(state);
  44. }
  45. __attribute__ ((weak))
  46. uint32_t layer_state_set_keymap(uint32_t state) {
  47. return state;
  48. }
  49. /*
  50. * Each process_record_* methods defined here are
  51. * return false if handle edvorak_keycodes, or return true others.
  52. */
  53. __attribute__ ((weak))
  54. bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
  55. return true;
  56. }
  57. bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record) {
  58. if (!(edvorakjp_config.enable_jp_extra_layer &&\
  59. (default_layer_state == 1UL<<_EDVORAK) &&\
  60. japanese_mode &&\
  61. record->event.pressed)) {
  62. return true;
  63. }
  64. // consonant keys
  65. // layer_on(J1) or layer_on(J2) are defined based on key positions.
  66. switch (keycode) {
  67. // right hand's left side w/o N
  68. case KC_F:
  69. case KC_G:
  70. case KC_R:
  71. case KC_D:
  72. case KC_T:
  73. case KC_B:
  74. case KC_H:
  75. case KC_J:
  76. layer_on(_EDVORAKJ1);
  77. register_code(keycode);
  78. unregister_code(keycode);
  79. return false;
  80. // N: toggle layer
  81. case KC_N:
  82. biton32(layer_state) == _EDVORAK ? layer_on(_EDVORAKJ1) : dvorakj_layer_off();
  83. register_code(keycode);
  84. unregister_code(keycode);
  85. return false;
  86. // left hand and right hand's right side
  87. case KC_X:
  88. case KC_C:
  89. case KC_V:
  90. case KC_Z:
  91. case KC_P:
  92. case KC_Y:
  93. case KC_W:
  94. case KC_Q:
  95. case KC_S:
  96. case KC_M:
  97. case KC_K:
  98. case KC_L:
  99. layer_on(_EDVORAKJ2);
  100. register_code(keycode);
  101. unregister_code(keycode);
  102. return false;
  103. }
  104. // vowel keys, symbol keys and modifier keys
  105. dvorakj_layer_off();
  106. switch (keycode) {
  107. // combination vowel keys
  108. case KC_AI:
  109. SEND_STRING("ai");
  110. return false;
  111. case KC_OU:
  112. SEND_STRING("ou");
  113. return false;
  114. case KC_EI:
  115. SEND_STRING("ei");
  116. return false;
  117. case KC_ANN:
  118. SEND_STRING("ann");
  119. return false;
  120. case KC_ONN:
  121. SEND_STRING("onn");
  122. return false;
  123. case KC_ENN:
  124. SEND_STRING("enn");
  125. return false;
  126. case KC_INN:
  127. SEND_STRING("inn");
  128. return false;
  129. case KC_UNN:
  130. SEND_STRING("unn");
  131. return false;
  132. // AOEIU and other (symbol, modifier) keys
  133. default:
  134. return true;
  135. }
  136. }
  137. bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record) {
  138. switch (keycode) {
  139. case KC_MAC:
  140. edvorakjp_config.enable_kc_lang = true;
  141. eeconfig_update_edvorakjp(edvorakjp_config.raw);
  142. return false;
  143. case KC_WIN:
  144. edvorakjp_config.enable_kc_lang = false;
  145. eeconfig_update_edvorakjp(edvorakjp_config.raw);
  146. return false;
  147. case KC_EXTON:
  148. edvorakjp_config.enable_jp_extra_layer = true;
  149. eeconfig_update_edvorakjp(edvorakjp_config.raw);
  150. return false;
  151. case KC_EXTOFF:
  152. edvorakjp_config.enable_jp_extra_layer = false;
  153. eeconfig_update_edvorakjp(edvorakjp_config.raw);
  154. return false;
  155. }
  156. return true;
  157. }
  158. bool process_record_layer(uint16_t keycode, keyrecord_t *record) {
  159. switch (keycode) {
  160. case EDVORAK:
  161. if (record->event.pressed) {
  162. set_single_persistent_default_layer(_EDVORAK);
  163. }
  164. return false;
  165. case QWERTY:
  166. if (record->event.pressed) {
  167. dvorakj_layer_off();
  168. set_single_persistent_default_layer(_QWERTY);
  169. }
  170. return false;
  171. case LOWER:
  172. if (record->event.pressed) {
  173. layer_on(_LOWER);
  174. time_on_pressed = record->event.time;
  175. } else {
  176. layer_off(_LOWER);
  177. if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
  178. update_japanese_mode(false);
  179. }
  180. time_on_pressed = 0;
  181. }
  182. return false;
  183. case RAISE:
  184. if (record->event.pressed) {
  185. layer_on(_RAISE);
  186. time_on_pressed = record->event.time;
  187. } else {
  188. layer_off(_RAISE);
  189. if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
  190. update_japanese_mode(true);
  191. }
  192. time_on_pressed = 0;
  193. }
  194. return false;
  195. default:
  196. return true;
  197. }
  198. }
  199. bool process_record_ime(uint16_t keycode, keyrecord_t *record) {
  200. switch (keycode) {
  201. case KC_JPN:
  202. if (record->event.pressed) {
  203. update_japanese_mode(true);
  204. }
  205. return false;
  206. case KC_ENG:
  207. if (record->event.pressed) {
  208. update_japanese_mode(false);
  209. }
  210. return false;
  211. default:
  212. return true;
  213. }
  214. }
  215. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  216. return process_record_keymap(keycode, record) &&\
  217. process_record_edvorakjp_ext(keycode, record) &&\
  218. process_record_edvorakjp_config(keycode, record) &&\
  219. process_record_layer(keycode, record) &&\
  220. process_record_ime(keycode, record);
  221. }