X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkUnixPkg%2FDxe%2FUnixThunk%2FBus%2FUga%2FUnixUgaInput.c;fp=EdkUnixPkg%2FDxe%2FUnixThunk%2FBus%2FUga%2FUnixUgaInput.c;h=babfa4bdac90b7674492deb8e0ae4c3eb6dd8d79;hp=0000000000000000000000000000000000000000;hb=c9093a06e72ef16d2f3bd7ce0a2b9a172e9d048c;hpb=8ba7afaf2e9c682a5d17760e6dd5463b3a2b2d67 diff --git a/EdkUnixPkg/Dxe/UnixThunk/Bus/Uga/UnixUgaInput.c b/EdkUnixPkg/Dxe/UnixThunk/Bus/Uga/UnixUgaInput.c new file mode 100644 index 0000000000..babfa4bdac --- /dev/null +++ b/EdkUnixPkg/Dxe/UnixThunk/Bus/Uga/UnixUgaInput.c @@ -0,0 +1,221 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +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 +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_IN_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_INPUT_KEY 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 (EFI_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; +} + +STATIC +EFI_STATUS +EFIAPI +UnixUgaSimpleTextInReadKeyStroke ( + IN EFI_SIMPLE_TEXT_IN_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; + + Private = UGA_PRIVATE_DATA_FROM_TEXT_IN_THIS (This); + if (Private->UgaIo == NULL) { + return EFI_NOT_READY; + } + + // + // Enter critical section + // + OldTpl = gBS->RaiseTPL (EFI_TPL_NOTIFY); + + Status = Private->UgaIo->UgaGetKey(Private->UgaIo, Key); + // + // Leave critical section and return + // + gBS->RestoreTPL (OldTpl); + + return Status; +} + +STATIC +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 (EFI_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); +} + +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 ( + EFI_EVENT_NOTIFY_WAIT, + EFI_TPL_NOTIFY, + UnixUgaSimpleTextInWaitForKey, + Private, + &Private->SimpleTextIn.WaitForKey + ); + + return Status; +}