XEN_ROOT = ../../.. include $(XEN_ROOT)/tools/Rules.mk PARALLAX_INSTALL_DIR = /usr/sbin INSTALL = install INSTALL_PROG = $(INSTALL) -m0755 INSTALL_DIR = $(INSTALL) -d -m0755 INCLUDES += -I.. -I/usr/include -I $(XEN_LIBXC) LDFLAGS = -L.. -lpthread -lz -lblktap #PLX_SRCS := PLX_SRCS := vdi.c PLX_SRCS += radix.c PLX_SRCS += snaplog.c PLX_SRCS += blockstore.c PLX_SRCS += block-async.c PLX_SRCS += requests-async.c VDI_SRCS := $(PLX_SRCS) PLX_SRCS += parallax.c #VDI_TOOLS := VDI_TOOLS := vdi_create VDI_TOOLS += vdi_list VDI_TOOLS += vdi_snap VDI_TOOLS += vdi_snap_list VDI_TOOLS += vdi_snap_delete VDI_TOOLS += vdi_fill VDI_TOOLS += vdi_tree VDI_TOOLS += vdi_validate CFLAGS += -Wall CFLAGS += -Werror CFLAGS += -Wno-unused #CFLAGS += -O3 CFLAGS += -g3 CFLAGS += -fno-strict-aliasing CFLAGS += $(INCLUDES) CFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE # Get gcc to generate the dependencies for us. CFLAGS += -Wp,-MD,.$(@F).d DEPS = .*.d OBJS = $(patsubst %.c,%.o,$(SRCS)) IBINS = parallax $(VDI_TOOLS) all: $(VDI_TOOLS) parallax blockstored install: all $(INSTALL_PROG) $(IBINS) $(DESTDIR)$(PARALLAX_INSTALL_DIR) clean: rm -rf *.o *~ $(DEPS) xen TAGS $(VDI_TOOLS) parallax vdi_unittest parallax: $(PLX_SRCS) $(CC) $(CFLAGS) -o parallax -L.. $(LDFLAGS) $(PLX_SRCS) ${VDI_TOOLS}: %: %.c $(VDI_SRCS) $(CC) $(CFLAGS) -g3 -o $@ $@.c $(LDFLAGS) $(VDI_SRCS) .PHONY: TAGS clean install rpm -include $(DEPS)s_unicodemap.c'>logtreecommitdiffstats
path: root/quantum/process_keycode/process_unicodemap.c
blob: 4364f156c4237cf3516b23e9caae853e64f1aa26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/* Copyright 2017 Jack Humbert
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "process_unicodemap.h"

void register_hex32(uint32_t hex) {
    bool onzerostart = true;
    for (int i = 7; i >= 0; i--) {
        if (i <= 3) {
            onzerostart = false;
        }
        uint8_t digit = ((hex >> (i * 4)) & 0xF);
        if (digit == 0) {
            if (!onzerostart) {
                register_code(hex_to_keycode(digit));
                unregister_code(hex_to_keycode(digit));
            }
        } else {
            register_code(hex_to_keycode(digit));
            unregister_code(hex_to_keycode(digit));
            onzerostart = false;
        }
    }
}

__attribute__((weak)) uint16_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 = keycode - QK_UNICODEMAP_PAIR;

        bool shift = unicode_saved_mods & MOD_MASK_SHIFT, caps = IS_HOST_LED_ON(USB_LED_CAPS_LOCK);
        if (shift ^ caps) {
            index >>= 7;
        }

        return index & 0x7F;
    } else {
        // Keycode is a regular index
        return keycode - QK_UNICODEMAP;
    }
}

bool process_unicodemap(uint16_t keycode, keyrecord_t *record) {
    if (keycode >= QK_UNICODEMAP && keycode <= QK_UNICODEMAP_PAIR_MAX && record->event.pressed) {
        unicode_input_start();

        uint32_t code       = pgm_read_dword(unicode_map + unicodemap_index(keycode));
        uint8_t  input_mode = get_unicode_input_mode();

        if (code > 0x10FFFF || (code > 0xFFFF && input_mode == UC_WIN)) {
            // Character is out of range supported by the platform
            unicode_input_cancel();
        } else if (code > 0xFFFF && input_mode == UC_OSX) {
            // Convert to UTF-16 surrogate pair on Mac
            code -= 0x10000;
            uint32_t lo = code & 0x3FF, hi = (code & 0xFFC00) >> 10;
            register_hex32(hi + 0xD800);
            register_hex32(lo + 0xDC00);
            unicode_input_finish();
        } else {
            register_hex32(code);
            unicode_input_finish();
        }
    }
    return true;
}