process_unicode.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "process_unicode.h"
  2. #include "action_util.h"
  3. static uint8_t input_mode;
  4. uint8_t mods;
  5. void set_unicode_input_mode(uint8_t os_target)
  6. {
  7. input_mode = os_target;
  8. }
  9. uint8_t get_unicode_input_mode(void) {
  10. return input_mode;
  11. }
  12. __attribute__((weak))
  13. void unicode_input_start (void) {
  14. // save current mods
  15. mods = keyboard_report->mods;
  16. // unregister all mods to start from clean state
  17. if (mods & MOD_BIT(KC_LSFT)) unregister_code(KC_LSFT);
  18. if (mods & MOD_BIT(KC_RSFT)) unregister_code(KC_RSFT);
  19. if (mods & MOD_BIT(KC_LCTL)) unregister_code(KC_LCTL);
  20. if (mods & MOD_BIT(KC_RCTL)) unregister_code(KC_RCTL);
  21. if (mods & MOD_BIT(KC_LALT)) unregister_code(KC_LALT);
  22. if (mods & MOD_BIT(KC_RALT)) unregister_code(KC_RALT);
  23. if (mods & MOD_BIT(KC_LGUI)) unregister_code(KC_LGUI);
  24. if (mods & MOD_BIT(KC_RGUI)) unregister_code(KC_RGUI);
  25. switch(input_mode) {
  26. case UC_OSX:
  27. register_code(KC_LALT);
  28. break;
  29. case UC_LNX:
  30. register_code(KC_LCTL);
  31. register_code(KC_LSFT);
  32. register_code(KC_U);
  33. unregister_code(KC_U);
  34. unregister_code(KC_LSFT);
  35. unregister_code(KC_LCTL);
  36. break;
  37. case UC_WIN:
  38. register_code(KC_LALT);
  39. register_code(KC_PPLS);
  40. unregister_code(KC_PPLS);
  41. break;
  42. case UC_WINC:
  43. register_code(KC_RALT);
  44. unregister_code(KC_RALT);
  45. register_code(KC_U);
  46. unregister_code(KC_U);
  47. }
  48. wait_ms(UNICODE_TYPE_DELAY);
  49. }
  50. __attribute__((weak))
  51. void unicode_input_finish (void) {
  52. switch(input_mode) {
  53. case UC_OSX:
  54. case UC_WIN:
  55. unregister_code(KC_LALT);
  56. break;
  57. case UC_LNX:
  58. register_code(KC_SPC);
  59. unregister_code(KC_SPC);
  60. break;
  61. }
  62. // reregister previously set mods
  63. if (mods & MOD_BIT(KC_LSFT)) register_code(KC_LSFT);
  64. if (mods & MOD_BIT(KC_RSFT)) register_code(KC_RSFT);
  65. if (mods & MOD_BIT(KC_LCTL)) register_code(KC_LCTL);
  66. if (mods & MOD_BIT(KC_RCTL)) register_code(KC_RCTL);
  67. if (mods & MOD_BIT(KC_LALT)) register_code(KC_LALT);
  68. if (mods & MOD_BIT(KC_RALT)) register_code(KC_RALT);
  69. if (mods & MOD_BIT(KC_LGUI)) register_code(KC_LGUI);
  70. if (mods & MOD_BIT(KC_RGUI)) register_code(KC_RGUI);
  71. }
  72. void register_hex(uint16_t hex) {
  73. for(int i = 3; i >= 0; i--) {
  74. uint8_t digit = ((hex >> (i*4)) & 0xF);
  75. register_code(hex_to_keycode(digit));
  76. unregister_code(hex_to_keycode(digit));
  77. }
  78. }
  79. bool process_unicode(uint16_t keycode, keyrecord_t *record) {
  80. if (keycode > QK_UNICODE && record->event.pressed) {
  81. uint16_t unicode = keycode & 0x7FFF;
  82. unicode_input_start();
  83. register_hex(unicode);
  84. unicode_input_finish();
  85. }
  86. return true;
  87. }