process_unicode_common.c 2.3 KB

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