keycode_util.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include "keycode_util.hpp"
  2. #include <cstdint>
  3. extern "C" {
  4. #include "action_code.h"
  5. #include "keycode.h"
  6. #include "quantum_keycodes.h"
  7. #include "util.h"
  8. }
  9. #include <string>
  10. #include <iomanip>
  11. #include <map>
  12. extern std::map<uint16_t, std::string> KEYCODE_ID_TABLE;
  13. std::string get_mods(uint8_t mods) {
  14. std::stringstream s;
  15. if ((mods & MOD_RCTL) == MOD_RCTL) {
  16. s << XSTR(MOD_RCTL) << " | ";
  17. } else if ((mods & MOD_LCTL) == MOD_LCTL) {
  18. s << XSTR(MOD_LCTL) << " | ";
  19. }
  20. if ((mods & MOD_RSFT) == MOD_RSFT) {
  21. s << XSTR(MOD_RSFT) << " | ";
  22. } else if ((mods & MOD_LSFT) == MOD_LSFT) {
  23. s << XSTR(MOD_LSFT) << " | ";
  24. }
  25. if ((mods & MOD_RALT) == MOD_RALT) {
  26. s << XSTR(MOD_RALT) << " | ";
  27. } else if ((mods & MOD_LALT) == MOD_LALT) {
  28. s << XSTR(MOD_LALT) << " | ";
  29. }
  30. if ((mods & MOD_RGUI) == MOD_RGUI) {
  31. s << XSTR(MOD_RGUI) << " | ";
  32. } else if ((mods & MOD_LGUI) == MOD_LGUI) {
  33. s << XSTR(MOD_LGUI) << " | ";
  34. }
  35. auto _mods = s.str();
  36. if (_mods.size()) {
  37. _mods.resize(_mods.size() - 3);
  38. }
  39. return std::string(_mods);
  40. }
  41. std::string get_qk_mods(uint16_t keycode) {
  42. std::stringstream s;
  43. if ((keycode & QK_RCTL) == QK_RCTL) {
  44. s << XSTR(QK_RCTL) << " | ";
  45. } else if ((keycode & QK_LCTL) == QK_LCTL) {
  46. s << XSTR(QK_LCTL) << " | ";
  47. }
  48. if ((keycode & QK_RSFT) == QK_RSFT) {
  49. s << XSTR(QK_RSFT) << " | ";
  50. } else if ((keycode & QK_LSFT) == QK_LSFT) {
  51. s << XSTR(QK_LSFT) << " | ";
  52. }
  53. if ((keycode & QK_RALT) == QK_RALT) {
  54. s << XSTR(QK_RALT) << " | ";
  55. } else if ((keycode & QK_LALT) == QK_LALT) {
  56. s << XSTR(QK_LALT) << " | ";
  57. }
  58. if ((keycode & QK_RGUI) == QK_RGUI) {
  59. s << XSTR(QK_RGUI) << " | ";
  60. } else if ((keycode & QK_LGUI) == QK_LGUI) {
  61. s << XSTR(QK_LGUI) << " | ";
  62. }
  63. auto _mods = s.str();
  64. if (_mods.size()) {
  65. _mods.resize(_mods.size() - 3);
  66. }
  67. return std::string(_mods);
  68. }
  69. std::string generate_identifier(uint16_t kc) {
  70. std::stringstream s;
  71. if (IS_QK_MOD_TAP(kc)) {
  72. s << "MT(" << get_mods(QK_MOD_TAP_GET_MODS(kc)) << ", " << KEYCODE_ID_TABLE.at(kc & 0xFF) << ")";
  73. } else if (IS_QK_LAYER_TAP(kc)) {
  74. s << "LT(" << +QK_LAYER_TAP_GET_LAYER(kc) << ", " << KEYCODE_ID_TABLE.at(kc & 0xFF) << ")";
  75. } else if (IS_QK_TO(kc)) {
  76. s << "TO(" << +QK_TO_GET_LAYER(kc) << ")";
  77. } else if (IS_QK_MOMENTARY(kc)) {
  78. s << "MO(" << +QK_MOMENTARY_GET_LAYER(kc) << ")";
  79. } else if (IS_QK_DEF_LAYER(kc)) {
  80. s << "DF(" << +QK_DEF_LAYER_GET_LAYER(kc) << ")";
  81. } else if (IS_QK_TOGGLE_LAYER(kc)) {
  82. s << "TG(" << +QK_TOGGLE_LAYER_GET_LAYER(kc) << ")";
  83. } else if (IS_QK_LAYER_TAP_TOGGLE(kc)) {
  84. s << "TT(" << +QK_LAYER_TAP_TOGGLE_GET_LAYER(kc) << ")";
  85. } else if (IS_QK_ONE_SHOT_LAYER(kc)) {
  86. s << "OSL(" << +QK_ONE_SHOT_LAYER_GET_LAYER(kc) << ")";
  87. } else if (IS_QK_LAYER_MOD(kc)) {
  88. s << "LM(" << +QK_LAYER_MOD_GET_LAYER(kc) << ", " << get_mods(QK_LAYER_MOD_GET_MODS(kc)) << ")";
  89. } else if (IS_QK_ONE_SHOT_MOD(kc)) {
  90. s << "OSM(" << get_mods(QK_ONE_SHOT_MOD_GET_MODS(kc)) << ")";
  91. } else if (IS_QK_MODS(kc)) {
  92. s << "QK_MODS(" << KEYCODE_ID_TABLE.at(QK_MODS_GET_BASIC_KEYCODE(kc)) << ", " << get_qk_mods(kc) << ")";
  93. } else if (IS_QK_TAP_DANCE(kc)) {
  94. s << "TD(" << +(kc & 0xFF) << ")";
  95. } else {
  96. // Fallback - we didn't found any matching keycode, generate the hex representation.
  97. s << "unknown keycode: 0x" << std::hex << kc << ". Add conversion to " << XSTR(generate_identifier);
  98. }
  99. return std::string(s.str());
  100. }
  101. std::string get_keycode_identifier_or_default(uint16_t keycode) {
  102. auto identifier = KEYCODE_ID_TABLE.find(keycode);
  103. if (identifier != KEYCODE_ID_TABLE.end()) {
  104. return identifier->second;
  105. }
  106. KEYCODE_ID_TABLE[keycode] = generate_identifier(keycode);
  107. return KEYCODE_ID_TABLE[keycode];
  108. }