]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Unicode map framework. Allow unicode up to 0xFFFFF using separate
authorPriyadi Iman Nurcahyo <priyadi@priyadi.net>
Sun, 9 Oct 2016 17:46:20 +0000 (00:46 +0700)
committerPriyadi Iman Nurcahyo <priyadi@priyadi.net>
Sun, 9 Oct 2016 17:56:09 +0000 (00:56 +0700)
mapping table

build_keyboard.mk
quantum/keymap.h
quantum/process_keycode/process_unicode.c
quantum/process_keycode/process_unicode.h
quantum/quantum.c
readme.md

index 03a69b14646f8dec37ebe3b0932a3302f80edd0a..282adcb118f345f9e53f7a4949b60806407cc291 100644 (file)
@@ -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
index 98ddfd0c533e4bda998e879e271fb1f41e141999..0daa001204ea596ac1f86ff06ffda9f82ada33d1 100644 (file)
@@ -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
index 6a30afe2933125f034f0eb3779a16ddf374f1704..37dd471ffddd7c347570bd6550e5d4530a8bdadd 100644 (file)
@@ -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;
 
index 27f8072ee66256fb6c8807b543b9b41716864904..a6c7e458453d814180d7813a4ff0b1df8b456b12 100644 (file)
@@ -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
index a16bd5443c5fc941bc4c9371a6b960ddffd62f10..098312e6ef545c15c0a8956b4d79094587893647 100644 (file)
@@ -128,6 +128,9 @@ bool process_record_quantum(keyrecord_t *record) {
   #endif
   #ifdef UCIS_ENABLE
     process_ucis(keycode, record) &&
+  #endif
+  #ifdef UNICODEMAP_ENABLE
+    process_unicode_map(keycode, record) &&
   #endif
       true)) {
     return false;
index a7320202b24314727807b8ef3ebbd19308c2e354..2653ab2ea75b4de4d67fac417096a49ad3f356fc 100644 (file)
--- a/readme.md
+++ b/readme.md
@@ -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.