diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/char_to_key_code.m | 68 | 
1 files changed, 68 insertions, 0 deletions
| diff --git a/lib/char_to_key_code.m b/lib/char_to_key_code.m new file mode 100644 index 0000000..b4fcdec --- /dev/null +++ b/lib/char_to_key_code.m @@ -0,0 +1,68 @@ +// Théo Winterhalter +// https://stackoverflow.com/users/1275975/th%c3%a9o-winterhalter +// https://stackoverflow.com/questions/1918841/how-to-convert-ascii-character-to-cgkeycode/33584460#33584460 + +NSString* keyCodeToString(CGKeyCode keyCode) +{ +  TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource(); +  CFDataRef uchr = +    (CFDataRef)TISGetInputSourceProperty(currentKeyboard, +                                         kTISPropertyUnicodeKeyLayoutData); +  const UCKeyboardLayout *keyboardLayout = +    (const UCKeyboardLayout*)CFDataGetBytePtr(uchr); + +  if(keyboardLayout) +  { +    UInt32 deadKeyState = 0; +    UniCharCount maxStringLength = 255; +    UniCharCount actualStringLength = 0; +    UniChar unicodeString[maxStringLength]; + +    OSStatus status = UCKeyTranslate(keyboardLayout, +                                     keyCode, kUCKeyActionDown, 0, +                                     LMGetKbdType(), 0, +                                     &deadKeyState, +                                     maxStringLength, +                                     &actualStringLength, unicodeString); + +    if (actualStringLength == 0 && deadKeyState) +    { +      status = UCKeyTranslate(keyboardLayout, +                                       kVK_Space, kUCKeyActionDown, 0, +                                       LMGetKbdType(), 0, +                                       &deadKeyState, +                                       maxStringLength, +                                       &actualStringLength, unicodeString); +    } +    if(actualStringLength > 0 && status == noErr) +      return [[NSString stringWithCharacters:unicodeString +                        length:(NSUInteger)actualStringLength] lowercaseString]; +  } + +  return nil; +} + +NSNumber* charToKeyCode(const char c) +{ +  static NSMutableDictionary* dict = nil; + +  if (dict == nil) +  { +    dict = [NSMutableDictionary dictionary]; + +    // For every keyCode +    size_t i; +    for (i = 0; i < 128; ++i) +    { +      NSString* str = keyCodeToString((CGKeyCode)i); +      if(str != nil && ![str isEqualToString:@""]) +      { +        [dict setObject:[NSNumber numberWithInt:i] forKey:str]; +      } +    } +  } + +  NSString * keyChar = [NSString stringWithFormat:@"%c" , c]; + +  return [dict objectForKey:keyChar]; +} | 
