in src/keyboard_mac.mm [16:68]
std::pair<bool,std::string> ConvertKeyCodeToText(const UCKeyboardLayout* keyboardLayout, int mac_key_code, int modifiers) {
int mac_modifiers = 0;
if (modifiers & kShiftKeyModifierMask)
mac_modifiers |= shiftKey;
if (modifiers & kControlKeyModifierMask)
mac_modifiers |= controlKey;
if (modifiers & kAltKeyModifierMask)
mac_modifiers |= optionKey;
if (modifiers & kMetaKeyModifierMask)
mac_modifiers |= cmdKey;
// Convert EventRecord modifiers to format UCKeyTranslate accepts. See docs
// on UCKeyTranslate for more info.
UInt32 modifier_key_state = (mac_modifiers >> 8) & 0xFF;
UInt32 dead_key_state = 0;
UniCharCount char_count = 0;
UniChar character = 0;
OSStatus status = UCKeyTranslate(
keyboardLayout,
static_cast<UInt16>(mac_key_code),
kUCKeyActionDown,
modifier_key_state,
LMGetKbdLast(),
kUCKeyTranslateNoDeadKeysBit,
&dead_key_state,
1,
&char_count,
&character);
bool isDeadKey = false;
if (status == noErr && char_count == 0 && dead_key_state != 0) {
isDeadKey = true;
status = UCKeyTranslate(
keyboardLayout,
static_cast<UInt16>(mac_key_code),
kUCKeyActionDown,
modifier_key_state,
LMGetKbdLast(),
kUCKeyTranslateNoDeadKeysBit,
&dead_key_state,
1,
&char_count,
&character);
}
if (status == noErr && char_count == 1 && !std::iscntrl(character)) {
wchar_t value = character;
return std::make_pair(isDeadKey, vscode_keyboard::UTF16toUTF8(&value, 1));
}
return std::make_pair(false, std::string());
}