keychron_qmk_firmware/quantum/unicode/unicodemap.c

44 lines
1.1 KiB
C

// Copyright 2023 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#include "unicodemap.h"
#include "unicode.h"
#include "keycodes.h"
#include "quantum_keycodes.h"
#include "modifiers.h"
#include "host.h"
#include "action_util.h"
uint8_t unicodemap_index(uint16_t keycode) {
if (keycode >= QK_UNICODEMAP_PAIR) {
// Keycode is a pair: extract index based on Shift / Caps Lock state
uint16_t index;
uint8_t mods = get_mods() | get_weak_mods();
#ifndef NO_ACTION_ONESHOT
mods |= get_oneshot_mods();
#endif
bool shift = mods & MOD_MASK_SHIFT;
bool caps = host_keyboard_led_state().caps_lock;
if (shift ^ caps) {
index = QK_UNICODEMAP_PAIR_GET_SHIFTED_INDEX(keycode);
} else {
index = QK_UNICODEMAP_PAIR_GET_UNSHIFTED_INDEX(keycode);
}
return index;
} else {
// Keycode is a regular index
return QK_UNICODEMAP_GET_INDEX(keycode);
}
}
uint32_t unicodemap_get_code_point(uint8_t index) {
return pgm_read_dword(unicode_map + index);
}
void register_unicodemap(uint8_t index) {
register_unicode(unicodemap_get_code_point(index));
}