+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-\r
- WinNtUgaInput.c\r
-\r
-Abstract:\r
-\r
- This file produces the Simple Text In for an Uga window.\r
-\r
- This stuff is linked at the hip to the Window, since the window\r
- processing is done in a thread kicked off in WinNtUgaImplementation.c\r
-\r
- Since the window information is processed in an other thread we need\r
- a keyboard Queue to pass data about. The Simple Text In code just\r
- takes data off the Queue. The WinProc message loop takes keyboard input\r
- and places it in the Queue.\r
-\r
---*/\r
-\r
-#include "WinNtUga.h"\r
-\r
-EFI_STATUS\r
-UgaPrivateCreateQ (\r
- IN UGA_PRIVATE_DATA *Private\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- TODO: Add function description\r
-\r
-Arguments:\r
-\r
- Private - TODO: add argument description\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - TODO: Add description for return value\r
-\r
---*/\r
-{\r
- Private->WinNtThunk->InitializeCriticalSection (&Private->QCriticalSection);\r
-\r
- Private->Queue.Front = 0;\r
- Private->Queue.Rear = MAX_Q - 1;\r
- Private->Queue.Count = 0;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-UgaPrivateDestroyQ (\r
- IN UGA_PRIVATE_DATA *Private\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- TODO: Add function description\r
-\r
-Arguments:\r
-\r
- Private - TODO: add argument description\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - TODO: Add description for return value\r
-\r
---*/\r
-{\r
- Private->Queue.Count = 0;\r
- Private->WinNtThunk->DeleteCriticalSection (&Private->QCriticalSection);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-UgaPrivateAddQ (\r
- IN UGA_PRIVATE_DATA *Private,\r
- IN EFI_INPUT_KEY Key\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- TODO: Add function description\r
-\r
-Arguments:\r
-\r
- Private - TODO: add argument description\r
- Key - TODO: add argument description\r
-\r
-Returns:\r
-\r
- EFI_NOT_READY - TODO: Add description for return value\r
- EFI_SUCCESS - TODO: Add description for return value\r
-\r
---*/\r
-{\r
- Private->WinNtThunk->EnterCriticalSection (&Private->QCriticalSection);\r
-\r
- if (Private->Queue.Count == MAX_Q) {\r
- Private->WinNtThunk->LeaveCriticalSection (&Private->QCriticalSection);\r
- return EFI_NOT_READY;\r
- }\r
-\r
- Private->Queue.Rear = (Private->Queue.Rear + 1) % MAX_Q;\r
- Private->Queue.Q[Private->Queue.Rear] = Key;\r
- Private->Queue.Count++;\r
-\r
- Private->WinNtThunk->LeaveCriticalSection (&Private->QCriticalSection);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-UgaPrivateDeleteQ (\r
- IN UGA_PRIVATE_DATA *Private,\r
- OUT EFI_INPUT_KEY *Key\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- TODO: Add function description\r
-\r
-Arguments:\r
-\r
- Private - TODO: add argument description\r
- Key - TODO: add argument description\r
-\r
-Returns:\r
-\r
- EFI_NOT_READY - TODO: Add description for return value\r
- EFI_SUCCESS - TODO: Add description for return value\r
-\r
---*/\r
-{\r
- Private->WinNtThunk->EnterCriticalSection (&Private->QCriticalSection);\r
-\r
- if (Private->Queue.Count == 0) {\r
- Private->WinNtThunk->LeaveCriticalSection (&Private->QCriticalSection);\r
- return EFI_NOT_READY;\r
- }\r
-\r
- *Key = Private->Queue.Q[Private->Queue.Front];\r
- Private->Queue.Front = (Private->Queue.Front + 1) % MAX_Q;\r
- Private->Queue.Count--;\r
-\r
- Private->WinNtThunk->LeaveCriticalSection (&Private->QCriticalSection);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-UgaPrivateCheckQ (\r
- IN UGA_PRIVATE_DATA *Private\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- TODO: Add function description\r
-\r
-Arguments:\r
-\r
- Private - TODO: add argument description\r
-\r
-Returns:\r
-\r
- EFI_NOT_READY - TODO: Add description for return value\r
- EFI_SUCCESS - TODO: Add description for return value\r
-\r
---*/\r
-{\r
- if (Private->Queue.Count == 0) {\r
- return EFI_NOT_READY;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-//\r
-// Simple Text In implementation.\r
-//\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-WinNtUgaSimpleTextInReset (\r
- IN EFI_SIMPLE_TEXT_IN_PROTOCOL *This,\r
- IN BOOLEAN ExtendedVerification\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- TODO: Add function description\r
-\r
-Arguments:\r
-\r
- This - TODO: add argument description\r
- ExtendedVerification - TODO: add argument description\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - TODO: Add description for return value\r
-\r
---*/\r
-{\r
- UGA_PRIVATE_DATA *Private;\r
- EFI_INPUT_KEY Key;\r
- EFI_TPL OldTpl;\r
-\r
- Private = UGA_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);\r
-\r
- //\r
- // Enter critical section\r
- //\r
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-\r
- //\r
- // A reset is draining the Queue\r
- //\r
- while (UgaPrivateDeleteQ (Private, &Key) == EFI_SUCCESS)\r
- ;\r
-\r
- //\r
- // Leave critical section and return\r
- //\r
- gBS->RestoreTPL (OldTpl);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-WinNtUgaSimpleTextInReadKeyStroke (\r
- IN EFI_SIMPLE_TEXT_IN_PROTOCOL *This,\r
- OUT EFI_INPUT_KEY *Key\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- TODO: Add function description\r
-\r
-Arguments:\r
-\r
- This - TODO: add argument description\r
- Key - TODO: add argument description\r
-\r
-Returns:\r
-\r
- TODO: add return values\r
-\r
---*/\r
-{\r
- UGA_PRIVATE_DATA *Private;\r
- EFI_STATUS Status;\r
- EFI_TPL OldTpl;\r
-\r
- Private = UGA_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);\r
-\r
- //\r
- // Enter critical section\r
- //\r
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-\r
- Status = UgaPrivateCheckQ (Private);\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // If a Key press exists try and read it.\r
- //\r
- Status = UgaPrivateDeleteQ (Private, Key);\r
- }\r
-\r
- //\r
- // Leave critical section and return\r
- //\r
- gBS->RestoreTPL (OldTpl);\r
-\r
- return Status;\r
-}\r
-\r
-STATIC\r
-VOID\r
-EFIAPI\r
-WinNtUgaSimpleTextInWaitForKey (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- TODO: Add function description\r
-\r
-Arguments:\r
-\r
- Event - TODO: add argument description\r
- Context - TODO: add argument description\r
-\r
-Returns:\r
-\r
- TODO: add return values\r
-\r
---*/\r
-{\r
- UGA_PRIVATE_DATA *Private;\r
- EFI_STATUS Status;\r
- EFI_TPL OldTpl;\r
-\r
- Private = (UGA_PRIVATE_DATA *) Context;\r
-\r
- //\r
- // Enter critical section\r
- //\r
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-\r
- Status = UgaPrivateCheckQ (Private);\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // If a there is a key in the queue signal our event.\r
- //\r
- gBS->SignalEvent (Event);\r
- } else {\r
- //\r
- // We need to sleep or NT will schedule this thread with such high\r
- // priority that WinProc thread will never run and we will not see\r
- // keyboard input. This Sleep makes the syste run 10x faster, so don't\r
- // remove it.\r
- //\r
- Private->WinNtThunk->Sleep (1);\r
- }\r
-\r
- //\r
- // Leave critical section and return\r
- //\r
- gBS->RestoreTPL (OldTpl);\r
-}\r
-\r
-EFI_STATUS\r
-WinNtUgaInitializeSimpleTextInForWindow (\r
- IN UGA_PRIVATE_DATA *Private\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- TODO: Add function description\r
-\r
-Arguments:\r
-\r
- Private - TODO: add argument description\r
-\r
-Returns:\r
-\r
- TODO: add return values\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
-\r
- UgaPrivateCreateQ (Private);\r
-\r
- //\r
- // Initialize Simple Text In protoocol\r
- //\r
- Private->SimpleTextIn.Reset = WinNtUgaSimpleTextInReset;\r
- Private->SimpleTextIn.ReadKeyStroke = WinNtUgaSimpleTextInReadKeyStroke;\r
-\r
- Status = gBS->CreateEvent (\r
- EVT_NOTIFY_WAIT,\r
- TPL_NOTIFY,\r
- WinNtUgaSimpleTextInWaitForKey,\r
- Private,\r
- &Private->SimpleTextIn.WaitForKey\r
- );\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-WinNtUgaDestroySimpleTextInForWindow (\r
- IN UGA_PRIVATE_DATA *Private\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- TODO: Add function description\r
-\r
-Arguments:\r
-\r
- Private - TODO: add argument description\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - TODO: Add description for return value\r
-\r
---*/\r
-{\r
- UgaPrivateDestroyQ (Private);\r
- return EFI_SUCCESS;\r
-}\r