11#include <Protocol/AbsolutePointer.h>
13#include <Library/BaseLib.h>
14#include <Library/BaseMemoryLib.h>
15#include <Library/BaseOverflowLib.h>
16#include <Library/DebugLib.h>
20#include <Library/UefiBootServicesTableLib.h>
21#include <Library/UefiLib.h>
26#define ABS_DOUBLE_CLICK_RADIUS 25U
27#define IS_POWER_2(x) (((x) & ((x) - 1)) == 0 && (x) != 0)
29#define POINTER_SCALE 1U
73 "The pointer event queue must have a power of two length."
77 Context->EventQueue[
Tail].Type = Type;
78 Context->EventQueue[
Tail].Pos.Pos.X = X;
79 Context->EventQueue[
Tail].Pos.Pos.Y = Y;
80 ++Context->EventQueueTail;
91 if (Context->EventQueueHead == Context->EventQueueTail) {
101 "The pointer event queue must have a power of two length."
104 Head = Context->EventQueueHead %
ARRAY_SIZE (Context->EventQueue);
105 Event->Type = Context->EventQueue[
Head].Type;
106 Event->Pos.Pos.X = Context->EventQueue[
Head].Pos.Pos.X;
107 Event->Pos.Pos.Y = Context->EventQueue[
Head].Pos.Pos.Y;
108 ++Context->EventQueueHead;
118 IN VOID *NotifyContext
124 Context = NotifyContext;
134 EventType = Information->EventData.PointerEventType;
137 Context->
CurPos.
Pos.
X = (UINT32)Information->PointerPosition.Horizontal;
138 Context->
CurPos.
Pos.
Y = (UINT32)Information->PointerPosition.Vertical;
147 (UINT32)Information->PointerPosition.Horizontal,
148 (UINT32)Information->PointerPosition.Vertical
156 (UINT32)Information->PointerPosition.Horizontal,
157 (UINT32)Information->PointerPosition.Vertical
164 (UINT32)Information->PointerPosition.Horizontal,
165 (UINT32)Information->PointerPosition.Vertical
176 IN OUT VOID *NotifyContext
181 EFI_ABSOLUTE_POINTER_STATE PointerState;
186 ASSERT (NotifyContext != NULL);
188 Context = NotifyContext;
198 if (EFI_ERROR (Status)) {
202 NewX = PointerState.CurrentX - Context->
AbsPointer->Mode->AbsoluteMinX;
209 NewY = PointerState.CurrentY - Context->
AbsPointer->Mode->AbsoluteMinY;
230 if (Context->
AbsPrimaryDown != ((PointerState.ActiveButtons & EFI_ABSP_TouchActive) != 0)) {
231 Context->
AbsPrimaryDown = ((PointerState.ActiveButtons & EFI_ABSP_TouchActive) != 0);
274 Context->EventQueueHead = 0;
275 Context->EventQueueTail = 0;
289 ASSERT (Position != NULL);
294 if (
sizeof (UINTN) <
sizeof (UINT64)) {
295 OldTpl =
gBS->RaiseTPL (TPL_NOTIFY);
301 Position->Uint64 = Context->CurPos.Uint64;
303 if (
sizeof (UINTN) <
sizeof (UINT64)) {
304 gBS->RestoreTPL (OldTpl);
318 ASSERT (Position != NULL);
320 OldTpl =
gBS->RaiseTPL (TPL_NOTIFY);
322 ApplePosition.
Horizontal = (INT32)Position->Pos.X;
323 ApplePosition.
Vertical = (INT32)Position->Pos.Y;
324 Context->AppleEvent->SetCursorPosition (
331 Context->CurPos.Uint64 = Position->Uint64;
333 gBS->RestoreTPL (OldTpl);
352 ASSERT (DefaultX <= MAX_INT32);
353 ASSERT (DefaultY <= MAX_INT32);
355 Context.MaxXPlus1 = Width;
356 Context.MaxYPlus1 = Height;
357 Context.CurPos.Pos.X = DefaultX;
358 Context.CurPos.Pos.Y = DefaultY;
359 Context.UiScale = UiScale;
364 "GuiPointerConstruct",
368 Status = EFI_UNSUPPORTED;
369 if (Context.AppleEvent != NULL) {
372 Dimension.
Vertical = (INT32)DefaultY;
373 Context.AppleEvent->SetCursorPosition (
380 Status = Context.AppleEvent->RegisterHandler (
383 &Context.AppleEventHandle,
388 if (EFI_ERROR (Status)) {
391 "OCUI: AppleEvent %u is unsupported - %r\n",
392 Context.AppleEvent->Revision,
400 gST->ConsoleInHandle,
402 (VOID **)&Context.AbsPointer
404 if (!EFI_ERROR (Status2)) {
408 EFI_TIMER_PERIOD_MILLISECONDS (10),
411 if (Context.AbsPollEvent == NULL) {
412 Status2 = EFI_UNSUPPORTED;
416 if (EFI_ERROR (Status) && EFI_ERROR (Status2)) {
429 ASSERT (Context->AppleEvent != NULL);
431 Context->AppleEvent->UnregisterHandler (Context->AppleEventHandle);
433 if (Context->AbsPollEvent != NULL) {
437 ZeroMem (Context,
sizeof (*Context));
UINTN APPLE_POINTER_EVENT_TYPE
#define APPLE_EVENT_TYPE_MOUSE_MOVED
VOID * APPLE_EVENT_HANDLE
#define APPLE_EVENT_TYPE_MOUSE_CLICK
#define APPLE_EVENT_TYPE_LEFT_BUTTON
#define APPLE_EVENT_TYPE_MOUSE_DOUBLE_CLICK
#define APPLE_ALL_MOUSE_EVENTS
#define APPLE_EVENT_TYPE_MOUSE_DOWN
EFI_GUID gAppleEventProtocolGuid
#define APPLE_EVENT_TYPE_MOUSE_UP
#define APPLE_EVENT_PROTOCOL_REVISION
EFI_EVENT EventLibCreateNotifyTimerEvent(IN EFI_EVENT_NOTIFY NotifyFunction, IN VOID *NotifyContext, IN UINT64 TriggerTime, IN BOOLEAN SignalPeriodic)
VOID EventLibCancelEvent(IN EFI_EVENT Event)
#define ARRAY_SIZE(Array)
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
VOID * OcGetProtocol(IN EFI_GUID *Protocol, IN UINTN ErrorLevel, IN CONST CHAR8 *CallerName OPTIONAL, IN CONST CHAR8 *ProtocolName OPTIONAL)
EFI_STATUS OcHandleProtocolFallback(IN EFI_HANDLE Handle, IN EFI_GUID *Protocol, OUT VOID **Interface)
@ GuiPointerPrimaryDoubleClick
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_GUID gEfiAbsolutePointerProtocolGuid
#define DivU64x32(x, y, z)
GUI_PTR_EVENT EventQueue[16]
EFI_ABSOLUTE_POINTER_PROTOCOL * AbsPointer
APPLE_EVENT_HANDLE AppleEventHandle
GUI_PTR_POSITION AbsLastDownPos
APPLE_EVENT_PROTOCOL * AppleEvent
struct GUI_PTR_POSITION::@111 Pos