]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UnixPkg/UnixUgaDxe/UnixUgaInput.c
Adding Simple Pointer, GOP, SimpleTextInEx, and Networking protocols to the emulator...
[mirror_edk2.git] / UnixPkg / UnixUgaDxe / UnixUgaInput.c
index f37c086cbce99c92a383e868f3d935c03844324c..4415e04b44902ee4cd30c9b9b3e0e4a2883633cd 100644 (file)
@@ -1,6 +1,7 @@
 /*++
 
 Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2010, Apple, Inc. 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
@@ -57,7 +58,7 @@ Returns:
 --*/
 {
   UGA_PRIVATE_DATA  *Private;
-  EFI_INPUT_KEY     Key;
+  EFI_KEY_DATA      Key;
   EFI_TPL           OldTpl;
 
   Private = UGA_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
@@ -73,7 +74,7 @@ Returns:
   //
   // A reset is draining the Queue
   //
-  while (Private->UgaIo->UgaGetKey(Private->UgaIo, &Key) == EFI_SUCCESS)
+  while (Private->UgaIo->UgaGetKey (Private->UgaIo, &Key) == EFI_SUCCESS)
     ;
 
   //
@@ -87,7 +88,7 @@ EFI_STATUS
 EFIAPI
 UnixUgaSimpleTextInReadKeyStroke (
   IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL          *This,
-  OUT EFI_INPUT_KEY                       *Key
+  OUT EFI_INPUT_KEY                          *Key
   )
 /*++
 
@@ -109,7 +110,8 @@ Returns:
   UGA_PRIVATE_DATA  *Private;
   EFI_STATUS        Status;
   EFI_TPL           OldTpl;
-
+  EFI_KEY_DATA      KeyData;
+  
   Private = UGA_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
   if (Private->UgaIo == NULL) {
     return EFI_NOT_READY;
@@ -120,7 +122,9 @@ Returns:
   //
   OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
 
-  Status  = Private->UgaIo->UgaGetKey(Private->UgaIo, Key);
+  Status  = Private->UgaIo->UgaGetKey(Private->UgaIo, &KeyData);
+  CopyMem (Key, &KeyData, sizeof (EFI_INPUT_KEY));
+  
   //
   // Leave critical section and return
   //
@@ -179,6 +183,156 @@ Returns:
   gBS->RestoreTPL (OldTpl);
 }
 
+//
+// Simple Pointer implementation.
+//
+
+EFI_STATUS
+EFIAPI
+UnixUgaSimplePointerReset (
+  IN EFI_SIMPLE_POINTER_PROTOCOL          *This,
+  IN BOOLEAN                              ExtendedVerification
+  )
+/*++
+
+Routine Description:
+
+  TODO: Add function description
+
+Arguments:
+
+  This                  - TODO: add argument description
+  ExtendedVerification  - TODO: add argument description
+
+Returns:
+
+  EFI_SUCCESS - TODO: Add description for return value
+
+--*/
+{
+  UGA_PRIVATE_DATA             *Private;
+  EFI_SIMPLE_POINTER_STATE     State;
+  EFI_TPL                      OldTpl;
+
+  Private = UGA_PRIVATE_DATA_FROM_POINTER_THIS (This);
+  if (Private->UgaIo == NULL) {
+    return EFI_SUCCESS;
+  }
+
+  //
+  // Enter critical section
+  //
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
+
+  //
+  // A reset is draining the Queue
+  //
+  while (Private->UgaIo->UgaGetPointerState(Private->UgaIo, &State) == EFI_SUCCESS)
+    ;
+
+  //
+  // Leave critical section and return
+  //
+  gBS->RestoreTPL (OldTpl);
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+UnixUgaSimplePointerGetState (
+  IN EFI_SIMPLE_POINTER_PROTOCOL          *This,
+  IN OUT EFI_SIMPLE_POINTER_STATE         *State
+  )
+/*++
+
+Routine Description:
+
+  TODO: Add function description
+
+Arguments:
+
+  This  - TODO: add argument description
+  Key   - TODO: add argument description
+
+Returns:
+
+  TODO: add return values
+
+--*/
+{
+  UGA_PRIVATE_DATA  *Private;
+  EFI_STATUS        Status;
+  EFI_TPL           OldTpl;
+
+  Private = UGA_PRIVATE_DATA_FROM_POINTER_THIS (This);
+  if (Private->UgaIo == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  //
+  // Enter critical section
+  //
+  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
+
+  Status  = Private->UgaIo->UgaGetPointerState(Private->UgaIo, State);
+  //
+  // Leave critical section and return
+  //
+  gBS->RestoreTPL (OldTpl);
+
+  return Status;
+}
+
+VOID
+EFIAPI
+UnixUgaSimplePointerWaitForInput (
+  IN EFI_EVENT          Event,
+  IN VOID               *Context
+  )
+/*++
+
+Routine Description:
+
+  TODO: Add function description
+
+Arguments:
+
+  Event   - TODO: add argument description
+  Context - TODO: add argument description
+
+Returns:
+
+  TODO: add return values
+
+--*/
+{
+  UGA_PRIVATE_DATA  *Private;
+  EFI_STATUS        Status;
+  EFI_TPL           OldTpl;
+
+  Private = (UGA_PRIVATE_DATA *) Context;
+  if (Private->UgaIo == NULL) {
+    return;
+  }
+
+  //
+  // Enter critical section
+  //
+  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
+
+  Status  = Private->UgaIo->UgaCheckPointer(Private->UgaIo);
+  if (!EFI_ERROR (Status)) {
+    //
+    // If the pointer state has changed, signal our event.
+    //
+    gBS->SignalEvent (Event);
+  }
+  //
+  // Leave critical section and return
+  //
+  gBS->RestoreTPL (OldTpl);
+}
+
 EFI_STATUS
 UnixUgaInitializeSimpleTextInForWindow (
   IN  UGA_PRIVATE_DATA    *Private
@@ -217,3 +371,48 @@ Returns:
 
   return Status;
 }
+
+EFI_STATUS
+UnixUgaInitializeSimplePointerForWindow (
+  IN  UGA_PRIVATE_DATA    *Private
+  )
+/*++
+
+Routine Description:
+
+  TODO: Add function description
+
+Arguments:
+
+  Private - TODO: add argument description
+
+Returns:
+
+  TODO: add return values
+
+--*/
+{
+  EFI_STATUS  Status;
+
+  //
+  // Initialize Simple Pointer protoocol
+  //
+  Private->PointerMode.ResolutionX = 1;
+  Private->PointerMode.ResolutionY = 1;
+  Private->PointerMode.LeftButton  = TRUE;
+  Private->PointerMode.RightButton = TRUE;
+
+  Private->SimplePointer.Reset     = UnixUgaSimplePointerReset;
+  Private->SimplePointer.GetState  = UnixUgaSimplePointerGetState;
+  Private->SimplePointer.Mode      = &Private->PointerMode;
+
+  Status = gBS->CreateEvent (
+                  EVT_NOTIFY_WAIT,
+                  TPL_NOTIFY,
+                  UnixUgaSimplePointerWaitForInput,
+                  Private,
+                  &Private->SimplePointer.WaitForInput
+                  );
+
+  return Status;
+}