Parent directory

keycode_util.cpp

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