+ @param Private Protocol instance pointer.\r
+ @param State The state information of simple pointer device.\r
+\r
+ @retval EFI_SUCCESS The keystroke information was returned.\r
+ @retval EFI_NOT_READY There was no keystroke data availiable.\r
+ @retval EFI_DEVICE_ERROR The keydtroke information was not returned due\r
+ to hardware errors.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ConSplitterSimplePointerPrivateGetState (\r
+ IN TEXT_IN_SPLITTER_PRIVATE_DATA *Private,\r
+ IN OUT EFI_SIMPLE_POINTER_STATE *State\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_STATUS ReturnStatus;\r
+ UINTN Index;\r
+ EFI_SIMPLE_POINTER_STATE CurrentState;\r
+\r
+ State->RelativeMovementX = 0;\r
+ State->RelativeMovementY = 0;\r
+ State->RelativeMovementZ = 0;\r
+ State->LeftButton = FALSE;\r
+ State->RightButton = FALSE;\r
+\r
+ //\r
+ // if no physical console input device exists, return EFI_NOT_READY;\r
+ // if any physical console input device has key input,\r
+ // return the key and EFI_SUCCESS.\r
+ //\r
+ ReturnStatus = EFI_NOT_READY;\r
+ for (Index = 0; Index < Private->CurrentNumberOfPointers; Index++) {\r
+\r
+ Status = Private->PointerList[Index]->GetState (\r
+ Private->PointerList[Index],\r
+ &CurrentState\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ if (ReturnStatus == EFI_NOT_READY) {\r
+ ReturnStatus = EFI_SUCCESS;\r
+ }\r
+\r
+ if (CurrentState.LeftButton) {\r
+ State->LeftButton = TRUE;\r
+ }\r
+\r
+ if (CurrentState.RightButton) {\r
+ State->RightButton = TRUE;\r
+ }\r
+\r
+ if (CurrentState.RelativeMovementX != 0 && Private->PointerList[Index]->Mode->ResolutionX != 0) {\r
+ State->RelativeMovementX += (CurrentState.RelativeMovementX * (INT32) Private->SimplePointerMode.ResolutionX) / (INT32) Private->PointerList[Index]->Mode->ResolutionX;\r
+ }\r
+\r
+ if (CurrentState.RelativeMovementY != 0 && Private->PointerList[Index]->Mode->ResolutionY != 0) {\r
+ State->RelativeMovementY += (CurrentState.RelativeMovementY * (INT32) Private->SimplePointerMode.ResolutionY) / (INT32) Private->PointerList[Index]->Mode->ResolutionY;\r
+ }\r
+\r
+ if (CurrentState.RelativeMovementZ != 0 && Private->PointerList[Index]->Mode->ResolutionZ != 0) {\r
+ State->RelativeMovementZ += (CurrentState.RelativeMovementZ * (INT32) Private->SimplePointerMode.ResolutionZ) / (INT32) Private->PointerList[Index]->Mode->ResolutionZ;\r
+ }\r
+ } else if (Status == EFI_DEVICE_ERROR) {\r
+ ReturnStatus = EFI_DEVICE_ERROR;\r
+ }\r
+ }\r
+\r
+ return ReturnStatus;\r
+}\r
+\r
+\r
+/**\r
+ Reads the next keystroke from the input device. The WaitForKey Event can\r
+ be used to test for existance of a keystroke via WaitForEvent () call.\r
+\r
+ @param This A pointer to protocol instance.\r
+ @param State A pointer to state information on the pointer device\r
+\r
+ @retval EFI_SUCCESS The keystroke information was returned in State.\r
+ @retval EFI_NOT_READY There was no keystroke data availiable.\r
+ @retval EFI_DEVICE_ERROR The keydtroke information was not returned due\r
+ to hardware errors.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ConSplitterSimplePointerGetState (\r
+ IN EFI_SIMPLE_POINTER_PROTOCOL *This,\r
+ IN OUT EFI_SIMPLE_POINTER_STATE *State\r
+ )\r
+{\r
+ TEXT_IN_SPLITTER_PRIVATE_DATA *Private;\r
+\r
+ Private = TEXT_IN_SPLITTER_PRIVATE_DATA_FROM_SIMPLE_POINTER_THIS (This);\r
+\r
+ Private->InputEventSignalState = FALSE;\r
+\r
+ return ConSplitterSimplePointerPrivateGetState (Private, State);\r
+}\r
+\r
+\r
+/**\r
+ This event agregates all the events of the ConIn devices in the spliter.\r
+ If any events of physical ConIn devices are signaled, signal the ConIn\r
+ spliter event. This will cause the calling code to call\r
+ ConSplitterTextInReadKeyStroke ().\r
+\r
+ @param Event The Event assoicated with callback.\r
+ @param Context Context registered when Event was created.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+ConSplitterSimplePointerWaitForInput (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ TEXT_IN_SPLITTER_PRIVATE_DATA *Private;\r
+ UINTN Index;\r
+\r
+ Private = (TEXT_IN_SPLITTER_PRIVATE_DATA *) Context;\r
+\r
+ //\r
+ // if InputEventSignalState is flagged before, and not cleared by Reset() or ReadKeyStroke()\r
+ //\r
+ if (Private->InputEventSignalState) {\r
+ gBS->SignalEvent (Event);\r
+ return ;\r
+ }\r
+ //\r
+ // if any physical console input device has key input, signal the event.\r
+ //\r
+ for (Index = 0; Index < Private->CurrentNumberOfPointers; Index++) {\r
+ Status = gBS->CheckEvent (Private->PointerList[Index]->WaitForInput);\r
+ if (!EFI_ERROR (Status)) {\r
+ gBS->SignalEvent (Event);\r
+ Private->InputEventSignalState = TRUE;\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ Resets the pointer device hardware.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param ExtendedVerification Driver may perform diagnostics on reset.\r
+\r
+ @retval EFI_SUCCESS The device was reset.\r
+ @retval EFI_DEVICE_ERROR The device is not functioning correctly and\r
+ could not be reset.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ConSplitterAbsolutePointerReset (\r
+ IN EFI_ABSOLUTE_POINTER_PROTOCOL *This,\r
+ IN BOOLEAN ExtendedVerification\r
+ )\r