aboutsummaryrefslogtreecommitdiffstats
path: root/lib/char_to_key_code.m
diff options
context:
space:
mode:
authorTeddy Wing2018-08-27 18:29:44 +0200
committerTeddy Wing2018-08-27 18:29:44 +0200
commitf4c4e70ac7b86b9b0c64a4786adc1d9e4b50097c (patch)
tree2024dfad2e0e726616ccee92928b2042a5352a21 /lib/char_to_key_code.m
parent62729cbbc786943eff6093ceb4b13146470295ec (diff)
downloadDomeKey-f4c4e70ac7b86b9b0c64a4786adc1d9e4b50097c.tar.bz2
Add char_to_key_code.m
This file includes functions for getting a `CGKeyCode` from a character reference. Copied from Stack Overflow by Théo Winterhalter.
Diffstat (limited to 'lib/char_to_key_code.m')
-rw-r--r--lib/char_to_key_code.m68
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];
+}