~ruther/qmk_firmware

5b2e455d3b71bfb90754930d1f22d3e8ce98b927 — Priyadi Iman Nurcahyo 8 years ago a9df99b
Unicode map framework. Allow unicode up to 0xFFFFF using separate
mapping table
M build_keyboard.mk => build_keyboard.mk +5 -0
@@ 153,6 153,11 @@ ifeq ($(strip $(UCIS_ENABLE)), yes)
	UNICODE_ENABLE = yes
endif

ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
	OPT_DEFS += -DUNICODEMAP_ENABLE
	UNICODE_ENABLE = yes
endif

ifeq ($(strip $(UNICODE_ENABLE)), yes)
    OPT_DEFS += -DUNICODE_ENABLE
	SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c

M quantum/keymap.h => quantum/keymap.h +7 -0
@@ 84,6 84,10 @@ enum quantum_keycodes {
    QK_MOD_TAP_MAX        = 0x6FFF,
    QK_TAP_DANCE          = 0x7100,
    QK_TAP_DANCE_MAX      = 0x71FF,
#ifdef UNICODEMAP_ENABLE
    QK_UNICODE_MAP        = 0x7800,
    QK_UNICODE_MAP_MAX    = 0x7FFF,
#endif
#ifdef UNICODE_ENABLE
    QK_UNICODE            = 0x8000,
    QK_UNICODE_MAX        = 0xFFFF,


@@ 335,5 339,8 @@ enum quantum_keycodes {
    #define UC(n) UNICODE(n)
#endif

#ifdef UNICODEMAP_ENABLE
    #define X(n) (n | QK_UNICODE_MAP)
#endif

#endif

M quantum/process_keycode/process_unicode.c => quantum/process_keycode/process_unicode.c +26 -0
@@ 78,6 78,32 @@ bool process_unicode(uint16_t keycode, keyrecord_t *record) {
  return true;
}

#ifdef UNICODEMAP_ENABLE
__attribute__((weak))
const uint32_t PROGMEM unicode_map[] = {
};

// 5 digit max because of linux limitation
void register_hex32(uint32_t hex) {
  for(int i = 4; i >= 0; i--) {
    uint8_t digit = ((hex >> (i*4)) & 0xF);
    register_code(hex_to_keycode(digit));
    unregister_code(hex_to_keycode(digit));
  }
}

bool process_unicode_map(uint16_t keycode, keyrecord_t *record) {
  if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) {
    const uint32_t* map = unicode_map;
    uint16_t index = keycode & 0x7FF;
    unicode_input_start();
    register_hex32(pgm_read_dword_far(&map[index]));
    unicode_input_finish();
  }
  return true;
}
#endif

#ifdef UCIS_ENABLE
qk_ucis_state_t qk_ucis_state;


M quantum/process_keycode/process_unicode.h => quantum/process_keycode/process_unicode.h +4 -0
@@ 20,6 20,10 @@ void register_hex(uint16_t hex);

bool process_unicode(uint16_t keycode, keyrecord_t *record);

#ifdef UNICODEMAP_ENABLE
bool process_unicode_map(uint16_t keycode, keyrecord_t *record);
#endif

#ifdef UCIS_ENABLE
#ifndef UCIS_MAX_SYMBOL_LENGTH
#define UCIS_MAX_SYMBOL_LENGTH 32

M quantum/quantum.c => quantum/quantum.c +3 -0
@@ 129,6 129,9 @@ bool process_record_quantum(keyrecord_t *record) {
  #ifdef UCIS_ENABLE
    process_ucis(keycode, record) &&
  #endif
  #ifdef UNICODEMAP_ENABLE
    process_unicode_map(keycode, record) &&
  #endif
      true)) {
    return false;
  }

M readme.md => readme.md +6 -0
@@ 320,6 320,12 @@ This enables MIDI sending and receiving with your keyboard. To enter MIDI send m

This allows you to send unicode symbols via `UC(<unicode>)` in your keymap. Only codes up to 0x7FFF are currently supported.

`UNICODEMAP_ENABLE`

This allows sending unicode symbols using `X(<unicode>)` in your keymap. Codes
up to 0xFFFFF are supported, including emojis. But you need to maintain a
separate mapping table in your keymap file.

`BLUETOOTH_ENABLE`

This allows you to interface with a Bluefruit EZ-key to send keycodes wirelessly. It uses the D2 and D3 pins.