git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11154 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			419 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			419 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*++
 | |
| 
 | |
| Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
 | |
| Portions copyright (c) 2010, Apple, Inc. All rights reserved.<BR>
 | |
| 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.
 | |
| 
 | |
| Module Name:
 | |
| 
 | |
|   UnixUgaInput.c
 | |
| 
 | |
| Abstract:
 | |
| 
 | |
|   This file produces the Simple Text In for an Uga window.
 | |
| 
 | |
|   This stuff is linked at the hip to the Window, since the window
 | |
|   processing is done in a thread kicked off in UnixUgaImplementation.c
 | |
| 
 | |
|   Since the window information is processed in an other thread we need
 | |
|   a keyboard Queue to pass data about. The Simple Text In code just
 | |
|   takes data off the Queue. The WinProc message loop takes keyboard input
 | |
|   and places it in the Queue.
 | |
| 
 | |
| --*/
 | |
| 
 | |
| #include "UnixUga.h"
 | |
| 
 | |
| //
 | |
| // Simple Text In implementation.
 | |
| //
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnixUgaSimpleTextInReset (
 | |
|   IN EFI_SIMPLE_TEXT_INPUT_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_KEY_DATA      Key;
 | |
|   EFI_TPL           OldTpl;
 | |
| 
 | |
|   Private = UGA_PRIVATE_DATA_FROM_TEXT_IN_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->UgaGetKey (Private->UgaIo, &Key) == EFI_SUCCESS)
 | |
|     ;
 | |
| 
 | |
|   //
 | |
|   // Leave critical section and return
 | |
|   //
 | |
|   gBS->RestoreTPL (OldTpl);
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| UnixUgaSimpleTextInReadKeyStroke (
 | |
|   IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL          *This,
 | |
|   OUT EFI_INPUT_KEY                          *Key
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| 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;
 | |
|   EFI_KEY_DATA      KeyData;
 | |
|   
 | |
|   Private = UGA_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
 | |
|   if (Private->UgaIo == NULL) {
 | |
|     return EFI_NOT_READY;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Enter critical section
 | |
|   //
 | |
|   OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
 | |
| 
 | |
|   Status  = Private->UgaIo->UgaGetKey(Private->UgaIo, &KeyData);
 | |
|   CopyMem (Key, &KeyData, sizeof (EFI_INPUT_KEY));
 | |
|   
 | |
|   //
 | |
|   // Leave critical section and return
 | |
|   //
 | |
|   gBS->RestoreTPL (OldTpl);
 | |
| 
 | |
|   return Status;
 | |
| }
 | |
| 
 | |
| VOID
 | |
| EFIAPI
 | |
| UnixUgaSimpleTextInWaitForKey (
 | |
|   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->UgaCheckKey(Private->UgaIo);
 | |
|   if (!EFI_ERROR (Status)) {
 | |
|     //
 | |
|     // If a there is a key in the queue signal our event.
 | |
|     //
 | |
|     gBS->SignalEvent (Event);
 | |
|   }
 | |
|   //
 | |
|   // Leave critical section and return
 | |
|   //
 | |
|   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
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   TODO: Add function description
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Private - TODO: add argument description
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   TODO: add return values
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   EFI_STATUS  Status;
 | |
| 
 | |
|   //
 | |
|   // Initialize Simple Text In protoocol
 | |
|   //
 | |
|   Private->SimpleTextIn.Reset         = UnixUgaSimpleTextInReset;
 | |
|   Private->SimpleTextIn.ReadKeyStroke = UnixUgaSimpleTextInReadKeyStroke;
 | |
| 
 | |
|   Status = gBS->CreateEvent (
 | |
|                   EVT_NOTIFY_WAIT,
 | |
|                   TPL_NOTIFY,
 | |
|                   UnixUgaSimpleTextInWaitForKey,
 | |
|                   Private,
 | |
|                   &Private->SimpleTextIn.WaitForKey
 | |
|                   );
 | |
| 
 | |
|   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;
 | |
| }
 |