Abstract:\r
\r
This file produces the graphics abstration of GOP. It is called by\r
- WinNtGopDriver.c file which deals with the EFI 1.1 driver model.\r
+ WinNtGopDriver.c file which deals with the UEFI 2.0 driver model.\r
This file just does graphics.\r
\r
\r
**/\r
-//\r
-// The package level header files this module uses\r
-//\r
-#include <Uefi.h>\r
-#include <WinNtDxe.h>\r
-//\r
-// The protocols, PPI and GUID defintions for this module\r
-//\r
-#include <Guid/EventGroup.h>\r
-#include <Protocol/WinNtIo.h>\r
-#include <Protocol/ComponentName.h>\r
-#include <Protocol/SimpleTextIn.h>\r
-#include <Protocol/DriverBinding.h>\r
-#include <Protocol/GraphicsOutput.h>\r
-//\r
-// The Library classes this module consumes\r
-//\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/UefiDriverEntryPoint.h>\r
-#include <Library/UefiLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
\r
#include "WinNtGop.h"\r
\r
EFI_WIN_NT_THUNK_PROTOCOL *mWinNt;\r
DWORD mTlsIndex = TLS_OUT_OF_INDEXES;\r
DWORD mTlsIndexUseCount = 0; // lets us know when we can free mTlsIndex.\r
-static EFI_EVENT mGopScreenExitBootServicesEvent;\r
+EFI_EVENT mGopScreenExitBootServicesEvent;\r
GOP_MODE_DATA mGopModeData[] = {\r
{800, 600, 0, 0},\r
{640, 480, 0, 0},\r
IN UINT32 RefreshRate\r
);\r
\r
-STATIC\r
VOID\r
EFIAPI\r
KillNtGopThread (\r
IN VOID *Context\r
);\r
\r
+VOID\r
+WinNtGopConvertParamToEfiKeyShiftState (\r
+ IN GOP_PRIVATE_DATA *Private,\r
+ IN WPARAM *wParam,\r
+ IN BOOLEAN Flag\r
+ )\r
+{\r
+ switch (*wParam) {\r
+ //\r
+ // BUGBUG: Only GetAsyncKeyState() and GetKeyState() can distinguish\r
+ // left and right Ctrl, and Shift key. \r
+ // Neither of the two is defined in EFI_WIN_NT_THUNK_PROTOCOL. \r
+ // Therefor, we can not set the correct Shift state here.\r
+ // \r
+ case VK_SHIFT: \r
+ Private->LeftShift = Flag;\r
+ break; \r
+ case VK_CONTROL:\r
+ Private->LeftCtrl = Flag;\r
+ break;\r
+ case VK_LWIN: \r
+ Private->LeftLogo = Flag;\r
+ break;\r
+ case VK_RWIN: \r
+ Private->RightLogo = Flag;\r
+ break;\r
+ case VK_APPS: \r
+ Private->Menu = Flag;\r
+ break;\r
+ //\r
+ // BUGBUG: PrintScreen/SysRq can not trigger WM_KEYDOWN message,\r
+ // so SySReq shift state is not supported here.\r
+ //\r
+ case VK_PRINT: \r
+ Private->SysReq = Flag;\r
+ break;\r
+ }\r
+}\r
+\r
+VOID\r
+WinNtGopConvertParamToEfiKey (\r
+ IN GOP_PRIVATE_DATA *Private,\r
+ IN WPARAM *wParam,\r
+ IN EFI_INPUT_KEY *Key\r
+ )\r
+{\r
+ switch (*wParam) {\r
+ case VK_HOME: Key->ScanCode = SCAN_HOME; break;\r
+ case VK_END: Key->ScanCode = SCAN_END; break;\r
+ case VK_LEFT: Key->ScanCode = SCAN_LEFT; break;\r
+ case VK_RIGHT: Key->ScanCode = SCAN_RIGHT; break;\r
+ case VK_UP: Key->ScanCode = SCAN_UP; break;\r
+ case VK_DOWN: Key->ScanCode = SCAN_DOWN; break;\r
+ case VK_DELETE: Key->ScanCode = SCAN_DELETE; break;\r
+ case VK_INSERT: Key->ScanCode = SCAN_INSERT; break;\r
+ case VK_PRIOR: Key->ScanCode = SCAN_PAGE_UP; break;\r
+ case VK_NEXT: Key->ScanCode = SCAN_PAGE_DOWN; break;\r
+ case VK_ESCAPE: Key->ScanCode = SCAN_ESC; break;\r
+ \r
+ case VK_F1: Key->ScanCode = SCAN_F1; break;\r
+ case VK_F2: Key->ScanCode = SCAN_F2; break;\r
+ case VK_F3: Key->ScanCode = SCAN_F3; break;\r
+ case VK_F4: Key->ScanCode = SCAN_F4; break;\r
+ case VK_F5: Key->ScanCode = SCAN_F5; break;\r
+ case VK_F6: Key->ScanCode = SCAN_F6; break;\r
+ case VK_F7: Key->ScanCode = SCAN_F7; break;\r
+ case VK_F8: Key->ScanCode = SCAN_F8; break;\r
+ case VK_F9: Key->ScanCode = SCAN_F9; break;\r
+ case VK_F11: Key->ScanCode = SCAN_F11; break;\r
+ case VK_F12: Key->ScanCode = SCAN_F12; break;\r
+\r
+ case VK_F13: Key->ScanCode = SCAN_F13; break;\r
+ case VK_F14: Key->ScanCode = SCAN_F14; break;\r
+ case VK_F15: Key->ScanCode = SCAN_F15; break;\r
+ case VK_F16: Key->ScanCode = SCAN_F16; break;\r
+ case VK_F17: Key->ScanCode = SCAN_F17; break;\r
+ case VK_F18: Key->ScanCode = SCAN_F18; break;\r
+ case VK_F19: Key->ScanCode = SCAN_F19; break;\r
+ case VK_F20: Key->ScanCode = SCAN_F20; break;\r
+ case VK_F21: Key->ScanCode = SCAN_F21; break;\r
+ case VK_F22: Key->ScanCode = SCAN_F22; break;\r
+ case VK_F23: Key->ScanCode = SCAN_F23; break;\r
+ case VK_F24: Key->ScanCode = SCAN_F24; break;\r
+\r
+ //\r
+ // Set toggle state\r
+ // \r
+ case VK_NUMLOCK: \r
+ Private->NumLock = !Private->NumLock;\r
+ break;\r
+ case VK_SCROLL:\r
+ Private->ScrollLock = !Private->ScrollLock;\r
+ break; \r
+ case VK_CAPITAL:\r
+ Private->CapsLock = !Private->CapsLock;\r
+ break; \r
+ }\r
+ \r
+ WinNtGopConvertParamToEfiKeyShiftState (Private, wParam, TRUE); \r
+}\r
+\r
+\r
//\r
// GOP Protocol Member Functions\r
//\r
(*Info)->Version = 0;\r
(*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;\r
(*Info)->VerticalResolution = Private->ModeData[ModeNumber].VerticalResolution;\r
- (*Info)->PixelFormat = PixelBlueGreenRedReserved8BitPerColor;\r
+ (*Info)->PixelFormat = PixelBltOnly;\r
(*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;\r
\r
return EFI_SUCCESS;\r
\r
//\r
// F10 and the ALT key do not create a WM_KEYDOWN message, thus this special case\r
+ // WM_SYSKEYDOWN is posted when F10 is pressed or \r
+ // holds down ALT key and then presses another key.\r
//\r
case WM_SYSKEYDOWN:\r
Key.ScanCode = 0;\r
GopPrivateAddQ (Private, Key);\r
return 0;\r
}\r
- break;\r
\r
- case WM_KEYDOWN:\r
- Key.ScanCode = 0;\r
- switch (wParam) {\r
- case VK_HOME: Key.ScanCode = SCAN_HOME; break;\r
- case VK_END: Key.ScanCode = SCAN_END; break;\r
- case VK_LEFT: Key.ScanCode = SCAN_LEFT; break;\r
- case VK_RIGHT: Key.ScanCode = SCAN_RIGHT; break;\r
- case VK_UP: Key.ScanCode = SCAN_UP; break;\r
- case VK_DOWN: Key.ScanCode = SCAN_DOWN; break;\r
- case VK_DELETE: Key.ScanCode = SCAN_DELETE; break;\r
- case VK_INSERT: Key.ScanCode = SCAN_INSERT; break;\r
- case VK_PRIOR: Key.ScanCode = SCAN_PAGE_UP; break;\r
- case VK_NEXT: Key.ScanCode = SCAN_PAGE_DOWN; break;\r
- case VK_ESCAPE: Key.ScanCode = SCAN_ESC; break;\r
-\r
- case VK_F1: Key.ScanCode = SCAN_F1; break;\r
- case VK_F2: Key.ScanCode = SCAN_F2; break;\r
- case VK_F3: Key.ScanCode = SCAN_F3; break;\r
- case VK_F4: Key.ScanCode = SCAN_F4; break;\r
- case VK_F5: Key.ScanCode = SCAN_F5; break;\r
- case VK_F6: Key.ScanCode = SCAN_F6; break;\r
- case VK_F7: Key.ScanCode = SCAN_F7; break;\r
- case VK_F8: Key.ScanCode = SCAN_F8; break;\r
- case VK_F9: Key.ScanCode = SCAN_F9; break;\r
- case VK_F11: Key.ScanCode = SCAN_F11; break;\r
- case VK_F12: Key.ScanCode = SCAN_F12; break;\r
+ if ((lParam & GOP_ALT_KEY_PRESSED) == GOP_ALT_KEY_PRESSED) {\r
+ //\r
+ // ALT is pressed with another key pressed\r
+ //\r
+ WinNtGopConvertParamToEfiKey (Private, &wParam, &Key);\r
+\r
+ if ((lParam & GOP_EXTENDED_KEY) == GOP_EXTENDED_KEY) {\r
+ Private->RightAlt = TRUE;\r
+ } else {\r
+ Private->LeftAlt = TRUE;\r
+ }\r
+\r
+ if (Private->RightAlt && Private->LeftAlt) {\r
+ Private->LeftAlt = FALSE;\r
+ }\r
}\r
\r
if (Key.ScanCode != 0) {\r
\r
return 0;\r
\r
+ case WM_SYSKEYUP:\r
+ if ((lParam & GOP_ALT_KEY_PRESSED) == GOP_ALT_KEY_PRESSED) {\r
+ //\r
+ // ALT is pressed with another key released\r
+ //\r
+ WinNtGopConvertParamToEfiKeyShiftState (Private, &wParam, FALSE); \r
+ //\r
+ // Actually ALT key is still held down here.\r
+ // Change the ALT key state when another key is released\r
+ // by user because we did not find a better solution to\r
+ // get a released ALT key. \r
+ //\r
+ Private->RightAlt = FALSE;\r
+ Private->LeftAlt = FALSE;\r
+ }\r
+\r
+ return 0;\r
+\r
+\r
+ case WM_KEYDOWN:\r
+ Key.ScanCode = 0;\r
+ WinNtGopConvertParamToEfiKey (Private, &wParam, &Key);\r
+ if (Key.ScanCode != 0) {\r
+ Key.UnicodeChar = 0;\r
+ GopPrivateAddQ (Private, Key);\r
+ }\r
+\r
+ return 0;\r
+\r
+ case WM_KEYUP:\r
+ WinNtGopConvertParamToEfiKeyShiftState (Private, &wParam, FALSE); \r
+ return 0;\r
+\r
case WM_CHAR:\r
//\r
// The ESC key also generate WM_CHAR.\r
Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;\r
Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;\r
Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
- Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) NULL;\r
+ Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;\r
Private->GraphicsOutput.Mode->FrameBufferSize = 0;\r
\r
Private->HardwareNeedsStarting = TRUE;\r
@return None.\r
\r
**/\r
-STATIC\r
VOID\r
EFIAPI\r
KillNtGopThread (\r