523 lines
15 KiB
C

/** @file
AppleEventDxe
Copyright (c) 2018, vit9696
All rights reserved.
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include <AppleMacEfi.h>
#include <Library/DebugLib.h>
#include "AppleEventInternal.h"
// APPLE_KEY_DESCRIPTOR
typedef struct {
APPLE_KEY_CODE AppleKeyCode;
EFI_INPUT_KEY InputKey;
EFI_INPUT_KEY ShiftedInputKey;
} APPLE_KEY_DESCRIPTOR;
// gAppleHidUsbKbUsageKeyMap
/// The default United States key map for Apple keyboards.
STATIC APPLE_KEY_DESCRIPTOR mAppleKeyMap[] = {
{
AppleHidUsbKbUsageKeyA,
{ SCAN_NULL, L'a' },
{ SCAN_NULL, L'A' }
},
{
AppleHidUsbKbUsageKeyB,
{ SCAN_NULL, L'b' },
{ SCAN_NULL, L'B' }
},
{
AppleHidUsbKbUsageKeyC,
{ SCAN_NULL, L'c' },
{ SCAN_NULL, L'C' }
},
{
AppleHidUsbKbUsageKeyD,
{ SCAN_NULL, L'd' },
{ SCAN_NULL, L'D' }
},
{
AppleHidUsbKbUsageKeyE,
{ SCAN_NULL, L'e' },
{ SCAN_NULL, L'E' }
},
{
AppleHidUsbKbUsageKeyF,
{ SCAN_NULL, L'f' },
{ SCAN_NULL, L'F' }
},
{
AppleHidUsbKbUsageKeyG,
{ SCAN_NULL, L'g' },
{ SCAN_NULL, L'G' }
},
{
AppleHidUsbKbUsageKeyH,
{ SCAN_NULL, L'h' },
{ SCAN_NULL, L'H' }
},
{
AppleHidUsbKbUsageKeyI,
{ SCAN_NULL, L'i' },
{ SCAN_NULL, L'I' }
},
{
AppleHidUsbKbUsageKeyJ,
{ SCAN_NULL, L'j' },
{ SCAN_NULL, L'J' }
},
{
AppleHidUsbKbUsageKeyK,
{ SCAN_NULL, L'k' },
{ SCAN_NULL, L'K' }
},
{
AppleHidUsbKbUsageKeyL,
{ SCAN_NULL, L'l' },
{ SCAN_NULL, L'L' }
},
{
AppleHidUsbKbUsageKeyM,
{ SCAN_NULL, L'm' },
{ SCAN_NULL, L'M' }
},
{
AppleHidUsbKbUsageKeyN,
{ SCAN_NULL, L'n' },
{ SCAN_NULL, L'N' }
},
{
AppleHidUsbKbUsageKeyO,
{ SCAN_NULL, L'o' },
{ SCAN_NULL, L'O' }
},
{
AppleHidUsbKbUsageKeyP,
{ SCAN_NULL, L'p' },
{ SCAN_NULL, L'P' }
},
{
AppleHidUsbKbUsageKeyQ,
{ SCAN_NULL, L'q' },
{ SCAN_NULL, L'Q' }
},
{
AppleHidUsbKbUsageKeyR,
{ SCAN_NULL, L'r' },
{ SCAN_NULL, L'R' }
},
{
AppleHidUsbKbUsageKeyS,
{ SCAN_NULL, L's' },
{ SCAN_NULL, L'S' }
},
{
AppleHidUsbKbUsageKeyT,
{ SCAN_NULL, L't' },
{ SCAN_NULL, L'T' }
},
{
AppleHidUsbKbUsageKeyU,
{ SCAN_NULL, L'u' },
{ SCAN_NULL, L'U' }
},
{
AppleHidUsbKbUsageKeyV,
{ SCAN_NULL, L'v' },
{ SCAN_NULL, L'V' }
},
{
AppleHidUsbKbUsageKeyW,
{ SCAN_NULL, L'w' },
{ SCAN_NULL, L'W' }
},
{
AppleHidUsbKbUsageKeyX,
{ SCAN_NULL, L'x' },
{ SCAN_NULL, L'X' }
},
{
AppleHidUsbKbUsageKeyY,
{ SCAN_NULL, L'y' },
{ SCAN_NULL, L'Y' }
},
{
AppleHidUsbKbUsageKeyZ,
{ SCAN_NULL, L'z' },
{ SCAN_NULL, L'Z' }
},
{
AppleHidUsbKbUsageKeyOne,
{ SCAN_NULL, L'1' },
{ SCAN_NULL, L'!' }
},
{
AppleHidUsbKbUsageKeyTwo,
{ SCAN_NULL, L'2' },
{ SCAN_NULL, L'@' }
},
{
AppleHidUsbKbUsageKeyThree,
{ SCAN_NULL, L'3' },
{ SCAN_NULL, L'#' }
},
{
AppleHidUsbKbUsageKeyFour,
{ SCAN_NULL, L'4' },
{ SCAN_NULL, L'$' }
},
{
AppleHidUsbKbUsageKeyFive,
{ SCAN_NULL, L'5' },
{ SCAN_NULL, L'%' }
},
{
AppleHidUsbKbUsageKeySix,
{ SCAN_NULL, L'6' },
{ SCAN_NULL, L'^' }
},
{
AppleHidUsbKbUsageKeySeven,
{ SCAN_NULL, L'7' },
{ SCAN_NULL, L'&' }
},
{
AppleHidUsbKbUsageKeyEight,
{ SCAN_NULL, L'8' },
{ SCAN_NULL, L'*' }
},
{
AppleHidUsbKbUsageKeyNine,
{ SCAN_NULL, L'9' },
{ SCAN_NULL, L'(' }
},
{
AppleHidUsbKbUsageKeyZero,
{ SCAN_NULL, L'0' },
{ SCAN_NULL, L')' }
},
{
AppleHidUsbKbUsageKeyEnter,
{ SCAN_NULL, CHAR_CARRIAGE_RETURN },
{ SCAN_NULL, CHAR_CARRIAGE_RETURN }
},
{
AppleHidUsbKbUsageKeyEscape,
{ SCAN_ESC, CHAR_NULL },
{ SCAN_ESC, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyBackSpace,
{ SCAN_NULL, CHAR_BACKSPACE },
{ SCAN_NULL, CHAR_BACKSPACE }
},
{
AppleHidUsbKbUsageKeyTab,
{ SCAN_NULL, CHAR_TAB },
{ SCAN_NULL, CHAR_TAB }
},
{
AppleHidUsbKbUsageKeySpaceBar,
{ SCAN_NULL, L' ' },
{ SCAN_NULL, L' ' }
},
{
AppleHidUsbKbUsageKeyMinus,
{ SCAN_NULL, L'-' },
{ SCAN_NULL, L'_' }
},
{
AppleHidUsbKbUsageKeyEquals,
{ SCAN_NULL, L'=' },
{ SCAN_NULL, L'+' }
},
{
AppleHidUsbKbUsageKeyLeftBracket,
{ SCAN_NULL, L'[' },
{ SCAN_NULL, L'{' }
},
{
AppleHidUsbKbUsageKeyRightBracket,
{ SCAN_NULL, L']' },
{ SCAN_NULL, L'}' }
},
{
AppleHidUsbKbUsageKeyBackslash,
{ SCAN_NULL, L'\\' },
{ SCAN_NULL, L'|' }
},
{
AppleHidUsbKbUsageKeySemicolon,
{ SCAN_NULL, L';' },
{ SCAN_NULL, L':' }
},
{
AppleHidUsbKbUsageKeyQuotation,
{ SCAN_NULL, L'\'' },
{ SCAN_NULL, L'"' }
},
{
AppleHidUsbKbUsageKeyAcute,
{ SCAN_NULL, L'`' },
{ SCAN_NULL, L'~' }
},
{
AppleHidUsbKbUsageKeyComma,
{ SCAN_NULL, L',' },
{ SCAN_NULL, L'<' }
},
{
AppleHidUsbKbUsageKeyPeriod,
{ SCAN_NULL, L'.' },
{ SCAN_NULL, L'>' }
},
{
AppleHidUsbKbUsageKeySlash,
{ SCAN_NULL, L'/' },
{ SCAN_NULL, L'?' }
},
// BUG: AppleHidUsbKbUsageKeyCLock is missing.
{
AppleHidUsbKbUsageKeyF1,
{ SCAN_F1, CHAR_NULL },
{ SCAN_F1, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyF2,
{ SCAN_F2, CHAR_NULL },
{ SCAN_F2, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyF3,
{ SCAN_F3, CHAR_NULL },
{ SCAN_F3, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyF4,
{ SCAN_F4, CHAR_NULL },
{ SCAN_F4, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyF5,
{ SCAN_F5, CHAR_NULL },
{ SCAN_F5, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyF6,
{ SCAN_F6, CHAR_NULL },
{ SCAN_F6, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyF7,
{ SCAN_F7, CHAR_NULL },
{ SCAN_F7, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyF8,
{ SCAN_F8, CHAR_NULL },
{ SCAN_F8, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyF9,
{ SCAN_F9, CHAR_NULL },
{ SCAN_F9, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyF10,
{ SCAN_F10, CHAR_NULL },
{ SCAN_F10, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyF11,
{ SCAN_F11, CHAR_NULL },
{ SCAN_F11, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyF12,
{ SCAN_F12, CHAR_NULL },
{ SCAN_F12, CHAR_NULL }
},
// BUG: AppleHidUsbKbUsageKeyPrint, AppleHidUsbKbUsageKeySLock, AppleHidUsbKbUsageKeyPause missing.
{
AppleHidUsbKbUsageKeyIns,
{ SCAN_INSERT, CHAR_NULL },
{ SCAN_INSERT, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyHome,
{ SCAN_HOME, CHAR_NULL },
{ SCAN_HOME, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyPgUp,
{ SCAN_PAGE_UP, CHAR_NULL },
{ SCAN_PAGE_UP, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyDel,
{ SCAN_DELETE, CHAR_NULL },
{ SCAN_DELETE, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyEnd,
{ SCAN_END, CHAR_NULL },
{ SCAN_END, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyPgDn,
{ SCAN_PAGE_DOWN, CHAR_NULL },
{ SCAN_PAGE_DOWN, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyRightArrow,
{ SCAN_RIGHT, CHAR_NULL },
{ SCAN_RIGHT, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyLeftArrow,
{ SCAN_LEFT, CHAR_NULL },
{ SCAN_LEFT, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyDownArrow,
{ SCAN_DOWN, CHAR_NULL },
{ SCAN_DOWN, CHAR_NULL }
},
{
AppleHidUsbKbUsageKeyUpArrow,
{ SCAN_UP, CHAR_NULL },
{ SCAN_UP, CHAR_NULL }
},
// BUG: UsbHidUsageIdKbKpPadKeyNLck is missing.
{
AppleHidUsbKbUsageKeyPadSlash,
{ AppleScanKeypadSlash, L'/' },
{ AppleScanKeypadSlash, L'/' }
},
{
AppleHidUsbKbUsageKeyPadAsterisk,
{ AppleScanKeypadAsterisk, L'*' },
{ AppleScanKeypadAsterisk, L'*' }
},
{
AppleHidUsbKbUsageKeyPadMinus,
{ AppleScanKeypadMinus, L'-' },
{ AppleScanKeypadMinus, L'-' }
},
{
AppleHidUsbKbUsageKeyPadPlus,
{ AppleScanKeypadPlus, L'+' },
{ AppleScanKeypadPlus, L'+' }
},
{
AppleHidUsbKbUsageKeyPadEnter,
{ AppleScanKeypadEnter, CHAR_CARRIAGE_RETURN },
{ AppleScanKeypadEnter, CHAR_CARRIAGE_RETURN }
},
{
AppleHidUsbKbUsageKeyPadOne,
{ AppleScanKeypadOne, L'1' },
{ AppleScanKeypadOne, L'1' }
},
{
AppleHidUsbKbUsageKeyPadTwo,
{ AppleScanKeypadTwo, L'2' },
{ AppleScanKeypadTwo, L'2' }
},
{
AppleHidUsbKbUsageKeyPadThree,
{ AppleScanKeypadThree, L'3' },
{ AppleScanKeypadThree, L'3' }
},
{
AppleHidUsbKbUsageKeyPadFour,
{ AppleScanKeypadFour, L'4' },
{ AppleScanKeypadFour, L'4' }
},
{
AppleHidUsbKbUsageKeyPadFive,
{ AppleScanKeypadFive, L'5' },
{ AppleScanKeypadFive, L'5' }
},
{
AppleHidUsbKbUsageKeyPadSix,
{ AppleScanKeypadSix, L'6' },
{ AppleScanKeypadSix, L'6' }
},
{
AppleHidUsbKbUsageKeyPadSeven,
{ AppleScanKeypadSeven, L'7' },
{ AppleScanKeypadSeven, L'7' }
},
{
AppleHidUsbKbUsageKeyPadEight,
{ AppleScanKeypadEight, L'8' },
{ AppleScanKeypadEight, L'8' }
},
{
AppleHidUsbKbUsageKeyPadNine,
{ AppleScanKeypadNine, L'9' },
{ AppleScanKeypadNine, L'9' }
},
{
AppleHidUsbKbUsageKeyPadIns,
{ AppleScanKeypadIns, L'0' },
{ AppleScanKeypadIns, L'0' }
},
{
AppleHidUsbKbUsageKeyPadDel,
{ AppleScanKeypadDel, L'.' },
{ AppleScanKeypadDel, L'.' }
},
{
AppleHidUsbKbUsageKeyPadEquals,
{ AppleScanKeypadEquals, L'=' },
{ AppleScanKeypadEquals, L'=' }
}
};
// EventInputKeyFromAppleKeyCode
VOID
EventInputKeyFromAppleKeyCode (
IN APPLE_KEY_CODE AppleKeyCode,
OUT EFI_INPUT_KEY *InputKey,
IN BOOLEAN Shifted
)
{
UINTN Index;
APPLE_KEY_DESCRIPTOR *Key;
DEBUG ((DEBUG_VERBOSE, "EventInputKeyFromAppleKeyCode\n"));
Key = &mAppleKeyMap[0];
for (Index = 0; Index < ARRAY_SIZE (mAppleKeyMap); ++Index) {
if (Key->AppleKeyCode == AppleKeyCode) {
*InputKey = (Shifted ? Key->ShiftedInputKey : Key->InputKey);
return;
}
++Key;
}
InputKey->ScanCode = SCAN_NULL;
InputKey->UnicodeChar = CHAR_NULL;
}