9#include <Library/BaseLib.h>
10#include <Library/MemoryAllocationLib.h>
11#include <Library/UefiBootServicesTableLib.h>
35 if (Information->EventData.KeyData != NULL) {
36 AppleKeyCode = Information->EventData.KeyData->AppleKeyCode;
37 UnicodeChar = Information->EventData.KeyData->InputKey.UnicodeChar;
51 Context->CurrentModifiers &= ~Information->Modifiers;
54 Context->CurrentModifiers |= Information->Modifiers;
60 NewHead = Context->Head + 1;
68 if (NewHead == Context->Tail) {
72 Context->Head = NewHead;
80 Context->Buffer[Context->Head].AppleKeyCode =
AppleKeyCode;
81 Context->Buffer[Context->Head].UnicodeChar =
UnicodeChar;
83 #if defined (OC_TRACE_KEY_TIMES)
101 Status =
gBS->LocateProtocol (
107 if (EFI_ERROR (Status)) {
108 DEBUG ((DEBUG_ERROR,
"OCTY: Failed to locate apple event protocol - %r\n", Status));
112 DEBUG ((
OC_TRACE_TYPING,
"OCTY: About to allocate %d x %d for buffer, plus rest of context = %d\n",
OC_TYPING_BUFFER_SIZE,
sizeof ((*Context)->Buffer[0]), sizeof (**Context)));
114 *Context = AllocatePool (
sizeof (**Context));
116 if (*Context == NULL) {
117 Status = EFI_OUT_OF_RESOURCES;
118 DEBUG ((DEBUG_ERROR,
"OCTY: Failed to allocate context - %r\n", Status));
122 (*Context)->KeyTimes = NULL;
124 #if defined (OC_TRACE_KEY_TIMES)
130 if ((*Context)->KeyTimes == NULL) {
131 DEBUG ((DEBUG_ERROR,
"OCTY: Failed to allocate typing context key times buffer - %r\n", Status));
134 Status = EFI_OUT_OF_RESOURCES;
149 if (EFI_ERROR (Status)) {
150 DEBUG ((DEBUG_ERROR,
"OCTY: Failed to register handler - %r\n", Status));
151 #if defined (OC_TRACE_KEY_TIMES)
153 FreePool ((*Context)->KeyTimes);
166 DEBUG ((
OC_TRACE_TYPING,
"OCTY: reg c=%p h=%p k=%p\n", *Context, (*Context)->Handle, (*Context)->KeyTimes));
167 DEBUG ((DEBUG_INFO,
"OCTY: Registered handler\n"));
181 if (*Context == NULL) {
185 DEBUG ((
OC_TRACE_TYPING,
"OCTY: unreg c=%p h=%p k=%p\n", *Context, (*Context)->Handle, (*Context)->KeyTimes));
187 if ((*Context)->Handle == NULL) {
188 Status = EFI_NOT_STARTED;
191 (*Context)->Handle = NULL;
193 if (EFI_ERROR (Status)) {
194 DEBUG ((DEBUG_ERROR,
"OCTY: Failed to unregister handler - %r\n", Status));
197 DEBUG ((DEBUG_INFO,
"OCTY: Unregistered handler\n"));
201 #if defined (OC_TRACE_KEY_TIMES)
203 if ((*Context)->KeyTimes != NULL) {
204 FreePool ((*Context)->KeyTimes);
205 (*Context)->KeyTimes = NULL;
231 UINT64 CurrentMillis;
237 DEBUG ((
OC_TRACE_TYPING,
"OCTY: OcGetNextKeystroke(%p, M, K)\n", Context));
239 *Modifiers = Context->CurrentModifiers;
246 if (Context->Tail == Context->Head) {
250 DEBUG ((
OC_TRACE_TYPING,
"OCTY: %d != %d\n", Context->Tail, Context->Head));
256 NewTail = Context->Tail + 1;
265 *
UnicodeChar = Context->Buffer[NewTail].UnicodeChar;
267 Context->Tail = NewTail;
269 #if defined (OC_TRACE_KEY_TIMES)
272 DEBUG ((DEBUG_INFO,
"OCTY: OcGetNextKeystroke @%d %d[%x] %,Lu\n", Context->Tail, *Modifiers, *
AppleKeyCode, CurrentMillis));
286 Context->CurrentModifiers = 0;
287 DEBUG ((
OC_TRACE_TYPING,
"OCTY: OcFlushTypingBuffer %d %d %d\n", Context->Tail, Context->Head, Context->CurrentModifiers));
#define APPLE_EVENT_TYPE_MODIFIER_UP
#define APPLE_EVENT_TYPE_KEY_DOWN
#define APPLE_ALL_KEYBOARD_EVENTS
VOID(EFIAPI * APPLE_EVENT_NOTIFY_FUNCTION)(IN APPLE_EVENT_INFORMATION *Information, IN VOID *NotifyContext)
#define APPLE_EVENT_TYPE_MODIFIER_DOWN
EFI_GUID gAppleEventProtocolGuid
APPLE_HID_USAGE APPLE_KEY_CODE
UINT16 APPLE_MODIFIER_MAP
VOID OcConsoleFlush(VOID)
STATIC APPLE_EVENT_PROTOCOL * mProtocol
EFI_STATUS OcUnregisterTypingHandler(IN OC_TYPING_CONTEXT **Context)
STATIC VOID EFIAPI HandleKeyEvent(IN APPLE_EVENT_INFORMATION *Information, IN OC_TYPING_CONTEXT *Context)
EFI_STATUS OcRegisterTypingHandler(OUT OC_TYPING_CONTEXT **Context)
VOID OcGetNextKeystroke(IN OC_TYPING_CONTEXT *Context, OUT APPLE_MODIFIER_MAP *Modifiers, OUT APPLE_KEY_CODE *AppleKeyCode, OUT CHAR16 *UnicodeChar)
VOID OcFlushTypingBuffer(IN OC_TYPING_CONTEXT *Context)
#define OC_TYPING_BUFFER_SIZE
APPLE_KEY_CODE AppleKeyCode
PACKED struct @7 OC_TYPING_CONTEXT
UINT64 EFIAPI DivU64x64Remainder(IN UINT64 Dividend, IN UINT64 Divisor, OUT UINT64 *Remainder OPTIONAL)
UINT64 EFIAPI GetTimeInNanoSecond(IN UINT64 Ticks)
UINT64 EFIAPI GetPerformanceCounter(VOID)
EVENT_UNREGISTER_HANDLER UnregisterHandler
EVENT_REGISTER_HANDLER RegisterHandler