Parent directory

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}