action_pseudo_lut.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "quantum.h"
  2. #include "command.h"
  3. #include "action_pseudo_lut.h"
  4. static uint8_t send_key_shift_bit[SHIFT_BIT_SIZE];
  5. /*
  6. * Pseudo layout action.
  7. * This action converts a keycode in order to output the character according to the keymap you specified
  8. * still your keyboard layout recognized wrongly on your OS.
  9. * Memo: Using other layer keymap to get keycode
  10. */
  11. void action_pseudo_lut(keyrecord_t *record, uint8_t base_keymap_id, const uint16_t (*keymap)[2]) {
  12. uint8_t prev_shift;
  13. uint16_t keycode;
  14. uint16_t pseudo_keycode;
  15. /* get keycode from keymap you specified */
  16. keycode = keymap_key_to_keycode(base_keymap_id, record->event.key);
  17. prev_shift = keyboard_report->mods & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT));
  18. if (record->event.pressed) {
  19. /* when magic commands entered, keycode does not converted */
  20. if (IS_COMMAND()) {
  21. if (prev_shift) {
  22. add_shift_bit(keycode);
  23. }
  24. register_code(keycode);
  25. return;
  26. }
  27. if (prev_shift) {
  28. pseudo_keycode = convert_keycode(keymap, keycode, true);
  29. dprintf("pressed: %02X, converted: %04X\n", keycode, pseudo_keycode);
  30. add_shift_bit(keycode);
  31. if (IS_LSFT(pseudo_keycode)) {
  32. register_code(QK_LSFT ^ pseudo_keycode);
  33. } else {
  34. /* delete shift mod temporarily */
  35. del_mods(prev_shift);
  36. send_keyboard_report();
  37. register_code(pseudo_keycode);
  38. add_mods(prev_shift);
  39. send_keyboard_report();
  40. }
  41. } else {
  42. pseudo_keycode = convert_keycode(keymap, keycode, false);
  43. dprintf("pressed: %02X, converted: %04X\n", keycode, pseudo_keycode);
  44. if (IS_LSFT(pseudo_keycode)) {
  45. add_weak_mods(MOD_BIT(KC_LSFT));
  46. send_keyboard_report();
  47. register_code(QK_LSFT ^ pseudo_keycode);
  48. /* on Windows, prevent key repeat to avoid unintended output */
  49. unregister_code(QK_LSFT ^ pseudo_keycode);
  50. del_weak_mods(MOD_BIT(KC_LSFT));
  51. send_keyboard_report();
  52. } else {
  53. register_code(pseudo_keycode);
  54. }
  55. }
  56. } else {
  57. if (get_shift_bit(keycode)) {
  58. del_shift_bit(keycode);
  59. pseudo_keycode = convert_keycode(keymap, keycode, true);
  60. } else {
  61. pseudo_keycode = convert_keycode(keymap, keycode, false);
  62. }
  63. dprintf("released: %02X, converted: %04X\n", keycode, pseudo_keycode);
  64. if (IS_LSFT(pseudo_keycode)) {
  65. unregister_code(QK_LSFT ^ pseudo_keycode);
  66. } else {
  67. unregister_code(pseudo_keycode);
  68. }
  69. }
  70. }
  71. uint16_t convert_keycode(const uint16_t (*keymap)[2], uint16_t keycode, bool shift_modded)
  72. {
  73. uint16_t pseudo_keycode;
  74. switch (keycode) {
  75. case KC_A ... KC_CAPSLOCK:
  76. #if defined(__AVR__)
  77. if (shift_modded) {
  78. pseudo_keycode = pgm_read_word(&keymap[keycode][1]);
  79. } else {
  80. pseudo_keycode = pgm_read_word(&keymap[keycode][0]);
  81. }
  82. #else
  83. if (shift_modded) {
  84. pseudo_keycode = keymap[keycode][1];
  85. } else {
  86. pseudo_keycode = keymap[keycode][0];
  87. }
  88. #endif
  89. /* if undefined, use got keycode as it is */
  90. if (pseudo_keycode == 0x00) {
  91. if (shift_modded) {
  92. pseudo_keycode = S(keycode);
  93. } else {
  94. pseudo_keycode = keycode;
  95. }
  96. }
  97. break;
  98. default:
  99. if (shift_modded) {
  100. pseudo_keycode = S(keycode);
  101. } else {
  102. pseudo_keycode = keycode;
  103. }
  104. break;
  105. }
  106. return pseudo_keycode;
  107. }
  108. uint8_t get_shift_bit(uint16_t keycode) {
  109. if ((keycode >> 3) < SHIFT_BIT_SIZE) {
  110. return send_key_shift_bit[keycode >> 3] & (1 << (keycode & 7));
  111. } else {
  112. dprintf("get_shift_bit: Can't get shift bit. keycode: %02X\n", keycode);
  113. return 0;
  114. }
  115. }
  116. void add_shift_bit(uint16_t keycode) {
  117. if ((keycode >> 3) < SHIFT_BIT_SIZE) {
  118. send_key_shift_bit[keycode >> 3] |= (1 << (keycode & 7));
  119. } else {
  120. dprintf("add_shift_bit: Can't add shift bit. keycode: %02X\n", keycode);
  121. }
  122. }
  123. void del_shift_bit(uint16_t keycode) {
  124. if ((keycode >> 3) < SHIFT_BIT_SIZE) {
  125. send_key_shift_bit[keycode >> 3] &= ~(1 << (keycode & 7));
  126. } else {
  127. dprintf("del_shift_bit: Can't delete shift bit. keycode: %02X\n", keycode);
  128. }
  129. }