Skip to content

Commit

Permalink
macOS: Fix getting keyboard layout
Browse files Browse the repository at this point in the history
  • Loading branch information
hluk committed Oct 10, 2021
1 parent 38c8917 commit 010b352
Showing 1 changed file with 27 additions and 17 deletions.
44 changes: 27 additions & 17 deletions src/platform/mac/macplatformwindow.mm
Expand Up @@ -67,29 +67,39 @@
return nil;
}

NSNumber* charToKeyCode(const char c)
NSNumber* charToKeyCodeHelper(const char c, TISInputSourceRef currentKeyboard)
{
TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
CFDataRef uchr = (CFDataRef)TISGetInputSourceProperty(
CFDataRef layoutData = (CFDataRef)TISGetInputSourceProperty(
currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
const UCKeyboardLayout *keyboardLayout =
(const UCKeyboardLayout*)CFDataGetBytePtr(uchr);

if (keyboardLayout != nil) {
COPYQ_LOG( QStringLiteral("Searching key code for '%1'").arg(c) );
NSString *keyChar = [NSString stringWithFormat:@"%c" , c];
for (size_t i = 0; i < 128; ++i) {
NSString* str = keyCodeToString((CGKeyCode)i, keyboardLayout);
if (str != nil && [str isEqualToString:keyChar]) {
COPYQ_LOG( QStringLiteral("KeyCode for '%1' is %2").arg(c).arg(i) );
CFRelease(currentKeyboard);
return [NSNumber numberWithInt:i];
}
if (layoutData == nil)
return nil;

const UCKeyboardLayout* keyboardLayout =
reinterpret_cast<const UCKeyboardLayout*>(CFDataGetBytePtr(layoutData));
if (keyboardLayout == nil)
return nil;

COPYQ_LOG( QStringLiteral("Searching key code for '%1'").arg(c) );
NSString *keyChar = [NSString stringWithFormat:@"%c" , c];
for (size_t i = 0; i < 128; ++i) {
NSString* str = keyCodeToString((CGKeyCode)i, keyboardLayout);
if (str != nil && [str isEqualToString:keyChar]) {
COPYQ_LOG( QStringLiteral("KeyCode for '%1' is %2").arg(c).arg(i) );
return [NSNumber numberWithInt:i];
}
}
return nil;
}

NSNumber* charToKeyCode(const char c)
{
TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
if (currentKeyboard == nil)
return nil;

auto result = charToKeyCodeHelper(c, currentKeyboard);
CFRelease(currentKeyboard);
return nil;
return result;
}

CGKeyCode keyCodeFromChar(const char c, CGKeyCode fallback)
Expand Down

0 comments on commit 010b352

Please sign in to comment.