process_ucis.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include "process_ucis.h"
  2. qk_ucis_state_t qk_ucis_state;
  3. void qk_ucis_start(void) {
  4. qk_ucis_state.count = 0;
  5. qk_ucis_state.in_progress = true;
  6. qk_ucis_start_user();
  7. }
  8. __attribute__((weak))
  9. void qk_ucis_start_user(void) {
  10. unicode_input_start();
  11. register_hex(0x2328);
  12. unicode_input_finish();
  13. }
  14. static bool is_uni_seq(char *seq) {
  15. uint8_t i;
  16. for (i = 0; seq[i]; i++) {
  17. uint16_t code;
  18. if (('1' <= seq[i]) && (seq[i] <= '0'))
  19. code = seq[i] - '1' + KC_1;
  20. else
  21. code = seq[i] - 'a' + KC_A;
  22. if (i > qk_ucis_state.count || qk_ucis_state.codes[i] != code)
  23. return false;
  24. }
  25. return (qk_ucis_state.codes[i] == KC_ENT ||
  26. qk_ucis_state.codes[i] == KC_SPC);
  27. }
  28. __attribute__((weak))
  29. void qk_ucis_symbol_fallback (void) {
  30. for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) {
  31. uint8_t code = qk_ucis_state.codes[i];
  32. register_code(code);
  33. unregister_code(code);
  34. wait_ms(UNICODE_TYPE_DELAY);
  35. }
  36. }
  37. void register_ucis(const char *hex) {
  38. for(int i = 0; hex[i]; i++) {
  39. uint8_t kc = 0;
  40. char c = hex[i];
  41. switch (c) {
  42. case '0':
  43. kc = KC_0;
  44. break;
  45. case '1' ... '9':
  46. kc = c - '1' + KC_1;
  47. break;
  48. case 'a' ... 'f':
  49. kc = c - 'a' + KC_A;
  50. break;
  51. case 'A' ... 'F':
  52. kc = c - 'A' + KC_A;
  53. break;
  54. }
  55. if (kc) {
  56. register_code (kc);
  57. unregister_code (kc);
  58. wait_ms (UNICODE_TYPE_DELAY);
  59. }
  60. }
  61. }
  62. bool process_ucis (uint16_t keycode, keyrecord_t *record) {
  63. uint8_t i;
  64. if (!qk_ucis_state.in_progress)
  65. return true;
  66. if (qk_ucis_state.count >= UCIS_MAX_SYMBOL_LENGTH &&
  67. !(keycode == KC_BSPC || keycode == KC_ESC || keycode == KC_SPC || keycode == KC_ENT)) {
  68. return false;
  69. }
  70. if (!record->event.pressed)
  71. return true;
  72. qk_ucis_state.codes[qk_ucis_state.count] = keycode;
  73. qk_ucis_state.count++;
  74. if (keycode == KC_BSPC) {
  75. if (qk_ucis_state.count >= 2) {
  76. qk_ucis_state.count -= 2;
  77. return true;
  78. } else {
  79. qk_ucis_state.count--;
  80. return false;
  81. }
  82. }
  83. if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) {
  84. bool symbol_found = false;
  85. for (i = qk_ucis_state.count; i > 0; i--) {
  86. register_code (KC_BSPC);
  87. unregister_code (KC_BSPC);
  88. wait_ms(UNICODE_TYPE_DELAY);
  89. }
  90. if (keycode == KC_ESC) {
  91. qk_ucis_state.in_progress = false;
  92. return false;
  93. }
  94. unicode_input_start();
  95. for (i = 0; ucis_symbol_table[i].symbol; i++) {
  96. if (is_uni_seq (ucis_symbol_table[i].symbol)) {
  97. symbol_found = true;
  98. register_ucis(ucis_symbol_table[i].code + 2);
  99. break;
  100. }
  101. }
  102. if (!symbol_found) {
  103. qk_ucis_symbol_fallback();
  104. }
  105. unicode_input_finish();
  106. qk_ucis_state.in_progress = false;
  107. return false;
  108. }
  109. return true;
  110. }