]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Merge pull request #981 from jonasoberschweiber/osx-surrogate-pairs
authorJack Humbert <jack.humb@gmail.com>
Mon, 6 Feb 2017 23:00:47 +0000 (18:00 -0500)
committerGitHub <noreply@github.com>
Mon, 6 Feb 2017 23:00:47 +0000 (18:00 -0500)
Add support for Unicode supplementary planes on OS X

1  2 
quantum/process_keycode/process_unicode.c

index a30e93ae3227d9c4dc639804a977f700c467ae45,2606cf0c82e89acd4b739cf7264c31b5e1d641b3..9995ba9bded5b5ddf1057fe1d7d183ec422a079f
@@@ -1,8 -1,6 +1,8 @@@
  #include "process_unicode.h"
 +#include "action_util.h"
  
  static uint8_t input_mode;
 +uint8_t mods;
  
  __attribute__((weak))
  uint16_t hex_to_keycode(uint8_t hex)
@@@ -27,19 -25,6 +27,19 @@@ uint8_t get_unicode_input_mode(void) 
  
  __attribute__((weak))
  void unicode_input_start (void) {
 +  // save current mods
 +  mods = keyboard_report->mods;
 +
 +  // unregister all mods to start from clean state
 +  if (mods & MOD_BIT(KC_LSFT)) unregister_code(KC_LSFT);
 +  if (mods & MOD_BIT(KC_RSFT)) unregister_code(KC_RSFT);
 +  if (mods & MOD_BIT(KC_LCTL)) unregister_code(KC_LCTL);
 +  if (mods & MOD_BIT(KC_RCTL)) unregister_code(KC_RCTL);
 +  if (mods & MOD_BIT(KC_LALT)) unregister_code(KC_LALT);
 +  if (mods & MOD_BIT(KC_RALT)) unregister_code(KC_RALT);
 +  if (mods & MOD_BIT(KC_LGUI)) unregister_code(KC_LGUI);
 +  if (mods & MOD_BIT(KC_RGUI)) unregister_code(KC_RGUI);
 +
    switch(input_mode) {
    case UC_OSX:
      register_code(KC_LALT);
  __attribute__((weak))
  void unicode_input_finish (void) {
    switch(input_mode) {
 -  case UC_OSX:
 -  case UC_WIN:
 -    unregister_code(KC_LALT);
 -    break;
 -  case UC_LNX:
 -    register_code(KC_SPC);
 -    unregister_code(KC_SPC);
 -    break;
 +    case UC_OSX:
 +    case UC_WIN:
 +      unregister_code(KC_LALT);
 +      break;
 +    case UC_LNX:
 +      register_code(KC_SPC);
 +      unregister_code(KC_SPC);
 +      break;
    }
 +
 +  // reregister previously set mods
 +  if (mods & MOD_BIT(KC_LSFT)) register_code(KC_LSFT);
 +  if (mods & MOD_BIT(KC_RSFT)) register_code(KC_RSFT);
 +  if (mods & MOD_BIT(KC_LCTL)) register_code(KC_LCTL);
 +  if (mods & MOD_BIT(KC_RCTL)) register_code(KC_RCTL);
 +  if (mods & MOD_BIT(KC_LALT)) register_code(KC_LALT);
 +  if (mods & MOD_BIT(KC_RALT)) register_code(KC_RALT);
 +  if (mods & MOD_BIT(KC_LGUI)) register_code(KC_LGUI);
 +  if (mods & MOD_BIT(KC_RGUI)) register_code(KC_RGUI);
  }
  
  void register_hex(uint16_t hex) {
@@@ -141,7 -116,16 +141,16 @@@ bool process_unicode_map(uint16_t keyco
      const uint32_t* map = unicode_map;
      uint16_t index = keycode & 0x7FF;
      uint32_t code = pgm_read_dword_far(&map[index]);
-     if ((code > 0xFFFF && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) {
+     if (code > 0xFFFF && code <= 0x10ffff && input_mode == UC_OSX) {
+       // Convert to UTF-16 surrogate pair
+       code -= 0x10000;
+       uint32_t lo = code & 0x3ff;
+       uint32_t hi = (code & 0xffc00) >> 10;
+       unicode_input_start();
+       register_hex32(hi + 0xd800);
+       register_hex32(lo + 0xdc00);
+       unicode_input_finish();
+     } else if ((code > 0x10ffff && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) {
        // when character is out of range supported by the OS
        unicode_map_input_error();
      } else {