unicodemap.c
1171 bytes
1// Copyright 2023 QMK
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include "unicodemap.h"
5#include "unicode.h"
6#include "keycodes.h"
7#include "quantum_keycodes.h"
8#include "modifiers.h"
9#include "host.h"
10#include "action_util.h"
11
12uint8_t unicodemap_index(uint16_t keycode) {
13 if (keycode >= QK_UNICODEMAP_PAIR) {
14 // Keycode is a pair: extract index based on Shift / Caps Lock state
15 uint16_t index;
16
17 uint8_t mods = get_mods() | get_weak_mods();
18#ifndef NO_ACTION_ONESHOT
19 mods |= get_oneshot_mods();
20#endif
21
22 bool shift = mods & MOD_MASK_SHIFT;
23 bool caps = host_keyboard_led_state().caps_lock;
24 if (shift ^ caps) {
25 index = QK_UNICODEMAP_PAIR_GET_SHIFTED_INDEX(keycode);
26 } else {
27 index = QK_UNICODEMAP_PAIR_GET_UNSHIFTED_INDEX(keycode);
28 }
29
30 return index;
31 } else {
32 // Keycode is a regular index
33 return QK_UNICODEMAP_GET_INDEX(keycode);
34 }
35}
36
37uint32_t unicodemap_get_code_point(uint8_t index) {
38 return pgm_read_dword(unicode_map + index);
39}
40
41void register_unicodemap(uint8_t index) {
42 register_unicode(unicodemap_get_code_point(index));
43}